| 460 | int Motd_version = 0; |
| 461 | |
| 462 | void HandlePilotData(uint8_t *data, int len, network_address *from) { |
| 463 | udp_packet_header inpacket; |
| 464 | vmt_descent3_struct *d3_pilot; |
| 465 | memcpy(&inpacket, data, sizeof(inpacket)); |
| 466 | inpacket.len = INTEL_SHORT(inpacket.len) - 1; |
| 467 | if (len) { |
| 468 | switch (inpacket.type) { |
| 469 | case UNT_MOTD_RESPONSE: |
| 470 | if (MOTDState == STATE_WAITING_MOTD) { |
| 471 | if (Motdptr) { |
| 472 | if ((inpacket.len - PACKED_HEADER_ONLY_SIZE) > Motd_maxlen) |
| 473 | inpacket.len = PACKED_HEADER_ONLY_SIZE + Motd_maxlen - 1; |
| 474 | strncpy(Motdptr, (char *)inpacket.data, inpacket.len - PACKED_HEADER_ONLY_SIZE); |
| 475 | Motdptr[inpacket.len - PACKED_HEADER_ONLY_SIZE] = '\0'; |
| 476 | } |
| 477 | MOTDState = STATE_HAVE_MOTD; |
| 478 | } |
| 479 | break; |
| 480 | case UNT_PILOT_DATA_RESPONSE: |
| 481 | if (inpacket.code == CMD_GAME_DESCENT3) { |
| 482 | if (D3ReadState == STATE_READING_PILOT) { |
| 483 | d3_pilot = (vmt_descent3_struct *)&inpacket.data; |
| 484 | xorcode(d3_pilot, DESCENT3_BLOCK_SIZE, inpacket.security); |
| 485 | if (stricmp(ProccesingPilot, d3_pilot->pilot_name) == 0) { |
| 486 | // Copy the data |
| 487 | memcpy(ReadD3Pilot, &inpacket.data, DESCENT3_BLOCK_SIZE); |
| 488 | // Set the state |
| 489 | D3ReadState = STATE_RECEIVED_PILOT; |
| 490 | } |
| 491 | } |
| 492 | } |
| 493 | break; |
| 494 | case UNT_PILOT_READ_FAILED: |
| 495 | if (inpacket.code == CMD_GAME_DESCENT3) { |
| 496 | if (D3ReadState == STATE_READING_PILOT) { |
| 497 | D3ReadState = STATE_PILOT_NOT_FOUND; |
| 498 | } |
| 499 | } |
| 500 | break; |
| 501 | case UNT_PILOT_WRITE_SUCCESS: |
| 502 | if (inpacket.code == CMD_GAME_DESCENT3) { |
| 503 | if (D3WriteState == STATE_SENDING_PILOT) { |
| 504 | D3WriteState = STATE_WROTE_PILOT; |
| 505 | } |
| 506 | } |
| 507 | break; |
| 508 | case UNT_PILOT_WRITE_FAILED: |
| 509 | if (inpacket.code == CMD_GAME_DESCENT3) { |
| 510 | if (D3WriteState == STATE_SENDING_PILOT) { |
| 511 | D3WriteState = STATE_WRITE_PILOT_FAILED; |
| 512 | } |
| 513 | } |
| 514 | break; |
| 515 | case UNT_CONTROL: |
| 516 | switch (INTEL_INT(inpacket.code)) { |
| 517 | case CMD_VALIDATED_USER_ACK: |
| 518 | if (ValidState == VALID_STATE_WAITING) { |
| 519 | ValidState = VALID_STATE_VALID; |