Do leave game stuff
| 3639 | extern void MultiClearPlayerMarkers(int slot); |
| 3640 | // Do leave game stuff |
| 3641 | void MultiDoLeaveGame(uint8_t *data) { |
| 3642 | int count = 0; |
| 3643 | |
| 3644 | mprintf(0, "In MultiDoLeaveGame!\n"); |
| 3645 | |
| 3646 | // Skip header stuff |
| 3647 | SKIP_HEADER(data, &count); |
| 3648 | |
| 3649 | uint8_t slot = MultiGetByte(data, &count); |
| 3650 | |
| 3651 | if (NetPlayers[slot].flags & NPF_CONNECTED) { |
| 3652 | if (NetPlayers[slot].sequence == NETSEQ_PLAYING) { |
| 3653 | AddHUDMessage(TXT_MLTLEAVEGAME, Players[slot].callsign); |
| 3654 | MultiMakePlayerGhost(slot); |
| 3655 | Players[slot].flags = 0; |
| 3656 | } |
| 3657 | NetPlayers[slot].flags &= ~NPF_CONNECTED; |
| 3658 | NetPlayers[slot].secret_net_id = 0; |
| 3659 | } else |
| 3660 | mprintf(0, "Got a leave game from a non-connected player!\n"); |
| 3661 | |
| 3662 | // Now clear any files this guy might be receiving |
| 3663 | if (NetPlayers[slot].file_xfer_flags != NETFILE_NONE) { |
| 3664 | if (NetPlayers[slot].file_xfer_cfile) { |
| 3665 | char delfile[_MAX_PATH * 2]; |
| 3666 | strcpy(delfile, NetPlayers[slot].file_xfer_cfile->name); |
| 3667 | cfclose(NetPlayers[slot].file_xfer_cfile); |
| 3668 | NetPlayers[slot].file_xfer_cfile = NULL; |
| 3669 | if (NetPlayers[slot].file_xfer_flags == NETFILE_RECEIVING) |
| 3670 | ddio_DeleteFile(delfile); |
| 3671 | } |
| 3672 | NetPlayers[slot].file_xfer_flags = NETFILE_NONE; |
| 3673 | NetPlayers[slot].custom_file_seq++; |
| 3674 | NetPlayers[slot].custom_file_seq = NETFILE_ID_NOFILE; |
| 3675 | } |
| 3676 | |
| 3677 | // If this is the server, do any cleanup on this slot |
| 3678 | if (Netgame.local_role == LR_SERVER) { |
| 3679 | MultiClearGuidebot(slot); |
| 3680 | MultiClearPlayerMarkers(slot); |
| 3681 | DLLInfo.me_handle = DLLInfo.it_handle = Objects[Players[slot].objnum].handle; |
| 3682 | CallGameDLL(EVT_GAMEPLAYERDISCONNECT, &DLLInfo); |
| 3683 | |
| 3684 | if (NetPlayers[slot].sequence == NETSEQ_PLAYING) |
| 3685 | PlayerSpewInventory(&Objects[Players[slot].objnum], true, true); |
| 3686 | MultiSendReliablyToAllExcept(slot, data, count, NETSEQ_REQUEST_BUILDINGS); |
| 3687 | if (NetPlayers[slot].file_xfer_flags != NETFILE_NONE) { |
| 3688 | MultiCancelFile(slot, NetPlayers[slot].custom_file_seq, NetPlayers[slot].file_xfer_who); |
| 3689 | } |
| 3690 | nw_CloseSocket(&NetPlayers[slot].reliable_socket); |
| 3691 | if (Game_is_master_tracker_game) { |
| 3692 | NetPlayers[slot].flags |= NPF_MT_WRITING_PILOT; |
| 3693 | } |
| 3694 | } |
| 3695 | ScoreAPIPlayerLeft(slot); |
| 3696 | } |
| 3697 | |
| 3698 | void MultiDoServerQuit(uint8_t *data) { |
no test coverage detected