/** * @brief Make everything visible to anyone who can't already see it */ void G_VisMakeEverythingVisible (void) { edict_t *ent = NULL; while ((ent = G_EdictsGetNextInUse(ent))) { const int playerMask = G_VisToPM(ent->visflags); G_AppearPerishEvent(~playerMask, true, ent, NULL); if (G_IsActor(ent)) G_SendInventory(~G_TeamToPM(ent->team), ent); } }
/** * @brief Make everything visible to anyone who can't already see it */ void G_VisMakeEverythingVisible (void) { Edict* ent = nullptr; while ((ent = G_EdictsGetNextInUse(ent))) { const int playerMask = G_VisToPM(ent->visflags); G_AppearPerishEvent(~playerMask, true, *ent, nullptr); if (G_IsActor(ent)) G_SendInventory(~G_TeamToPM(ent->getTeam()), *ent); } }
void G_EventActorAppear (playermask_t playerMask, const Edict& check, const Edict* ent) { const int mask = G_TeamToPM(check.team) & playerMask; /* parsed in CL_ActorAppear */ G_EventAdd(playerMask, EV_ACTOR_APPEAR, check.number); gi.WriteShort(ent && ent->number > 0 ? ent->number : SKIP_LOCAL_ENTITY); gi.WriteByte(check.team); gi.WriteByte(check.chr.teamDef ? check.chr.teamDef->idx : NONE); gi.WriteByte(check.chr.gender); gi.WriteShort(check.chr.ucn); gi.WriteByte(check.pnum); gi.WriteGPos(check.pos); gi.WriteByte(check.dir); if (check.getRightHandItem()) { gi.WriteShort(check.getRightHandItem()->def()->idx); } else { gi.WriteShort(NONE); } if (check.getLeftHandItem()) { gi.WriteShort(check.getLeftHandItem()->def()->idx); } else { gi.WriteShort(NONE); } if (check.body == 0 || check.head == 0) { gi.Error("invalid body and/or head model indices"); } gi.WriteShort(check.body); gi.WriteShort(check.head); gi.WriteByte(check.chr.bodySkin); gi.WriteByte(check.chr.headSkin); /* strip the server private states */ gi.WriteShort(check.state & STATE_PUBLIC); gi.WriteByte(check.fieldSize); /* get the max values for TU and morale */ gi.WriteByte(G_ActorCalculateMaxTU(&check)); gi.WriteByte(std::min(MAX_SKILL, GET_MORALE(check.chr.score.skills[ABILITY_MIND]))); gi.WriteShort(check.chr.maxHP); G_EventEnd(); if (mask) { G_EventActorStateChange(mask, check); G_SendInventory(mask, check); } }
/** * @brief Send the appear or perish event to the affected clients * @param[in] playerMask These are the affected players or clients * In case of e.g. teamplay there can be more than one client affected - thus * this is a player mask * @param[in] appear Is this event about an appearing actor (or a perishing one) * @param[in] check The edict we are talking about (that appears or perishes) * @param[in] ent The edict that was responsible for letting the check edict appear * or perish. Might be @c NULL. * @sa CL_ActorAppear */ void G_AppearPerishEvent (playermask_t playerMask, bool appear, edict_t *check, const edict_t *ent) { teammask_t teamMaskDiff; /* test for pointless player mask */ if (!playerMask) return; teamMaskDiff = G_PMToVis(playerMask); G_VisFlagsSwap(check, teamMaskDiff); if (appear) { /* appear */ switch (check->type) { case ET_ACTOR: case ET_ACTOR2x2: G_EventActorAppear(playerMask, check, ent); break; case ET_CAMERA: G_EventCameraAppear(playerMask, check); break; case ET_ITEM: G_EventEdictAppear(playerMask, check); G_SendInventory(playerMask, check); break; case ET_PARTICLE: G_EventEdictAppear(playerMask, check); G_EventSendParticle(playerMask, check); break; case ET_TRIGGER_RESCUE: G_EventAddBrushModel(playerMask, check); break; default: if (G_IsVisibleOnBattlefield(check)) gi.Error("Missing edict type %i in G_AppearPerishEvent", check->type); break; } } else if (G_IsVisibleOnBattlefield(check)) { G_EventEdictPerish(playerMask, check); } }