/** * @sa G_ClientConnect */ void G_ClientDisconnect (player_t * player) { #if 0 edict_t *ent = NULL; #endif /* only if the player already sent his began */ if (player->began) { level.numplayers--; gi.ConfigString(CS_PLAYERCOUNT, "%i", level.numplayers); if (level.activeTeam == player->pers.team) G_ClientEndRound(player); /* if no more players are connected - stop the server */ G_MatchEndCheck(); } #if 0 /* now let's remove all the edicts that belongs to this player */ while ((ent = G_EdictsGetNextLivingActor(ent))) { if (ent->pnum == player->num) G_ActorDie(ent, STATE_DEAD, NULL); } G_MatchEndCheck(); #endif player->began = false; player->roundDone = false; player->isReady = false; gi.BroadcastPrintf(PRINT_CONSOLE, "%s disconnected.\n", player->pers.netname); }
/** * @brief Reports and handles death or stun of an actor. If the HP of an actor is zero the actor * will die, otherwise the actor will get stunned. * @param[in] ent Pointer to an entity being killed or stunned actor. * @param[in] attacker Pointer to attacker - it must be notified about state of victim. * @todo Discuss whether stunned actor should really drop everything to floor. Maybe * it should drop only what he has in hands? Stunned actor can wake later during mission. */ bool G_ActorDieOrStun (Edict* ent, Edict* attacker) { bool state; if (ent->HP == 0) state = G_ActorDie(ent, attacker); else state = G_ActorStun(ent, attacker); /* no state change performed? */ if (!state) { gi.DPrintf("G_ActorDieOrStun: State wasn't changed\n"); return false; } if (!G_IsStunned(ent)) ent->solid = SOLID_NOT; /* send death */ G_EventActorDie(*ent, attacker != nullptr); /* handle inventory - drop everything but the armour to the floor */ G_InventoryToFloor(ent); G_ClientStateChange(ent->getPlayer(), ent, ~STATE_REACTION, false); /* check if the player appears/perishes, seen from other teams */ G_CheckVis(ent); /* check if the attacker appears/perishes, seen from other teams */ if (attacker) G_CheckVis(attacker); /* calc new vis for this player */ G_CheckVisTeamAll(ent->team, 0, attacker); /* unlink the floor container */ ent->resetFloor(); G_ReactionFireOnDead(ent); return true; }