/** * @brief Resolve the reaction fire for an entity, this checks that the entity can fire and then takes the shot * @param[in] shooter The entity using reaction fire * @param[in] target The victim of the reaction fire * @return true if the entity fired, false otherwise */ bool ReactionFire::tryToShoot (Actor* shooter, const Edict* target) { /* check for valid target */ assert(target); /* shooter can't take a reaction shot if it's not possible - and check that * the target is still alive */ if (!isPossible(shooter, target)) { rft.remove(shooter, target); return false; } /* take the shot */ const actorHands_t hand = shooter->chr.RFmode.getHand(); const shoot_types_t type = (hand == ACTOR_HAND_RIGHT ? ST_RIGHT_REACTION : (hand == ACTOR_HAND_LEFT ? ST_LEFT_REACTION : ST_NUM_SHOOT_TYPES)); const bool tookShot = rf.shoot(shooter, target->pos, type, shooter->chr.RFmode.getFmIdx()); if (tookShot) { /* clear any shakenness */ shooter->removeShaken(); } return tookShot; }
/** * @brief Check whether 'target' has just triggered any new reaction fire * @param[in] target The entity triggering fire */ void ReactionFire::updateAllTargets (const Edict* target) { Actor* shooter = nullptr; /* check all possible shooters */ while ((shooter = G_EdictsGetNextLivingActor(shooter))) { /* check whether reaction fire is possible (friend/foe, LoS) */ if (isPossible(shooter, target)) { const int TUs = G_ReactionFireGetTUsForItem(shooter, target); if (TUs < 0) continue; /* no suitable weapon */ rft.add(shooter, target, TUs); } else { rft.remove(shooter, target); } } }
/** * @brief Check whether 'target' has just triggered any new reaction fire * @param[in] target The entity triggering fire */ static void G_ReactionFireTargetsUpdateAll (const edict_t *target) { edict_t *shooter = NULL; /* check all possible shooters */ while ((shooter = G_EdictsGetNextLivingActor(shooter))) { /* check whether reaction fire is possible (friend/foe, LoS */ if (G_ReactionFireIsPossible(shooter, target)) { const int TUs = G_ReactionFireGetTUsForItem(shooter, target, RIGHT(shooter)); if (TUs < 0) continue; /* no suitable weapon */ rft.add(shooter, target, TUs); } else { rft.remove(shooter, target); } } }
/** * @brief Resolve the reaction fire for an entity, this checks that the entity can fire and then takes the shot * @param[in] shooter The entity using reaction fire * @param[in] target The victim of the reaction fire * @return true if the entity fired, false otherwise */ bool ReactionFire::tryToShoot (Actor* shooter, const Edict* target) { /* check for valid target */ assert(target); /* shooter can't take a reaction shot if it's not possible - and check that * the target is still alive */ if (!isPossible(shooter, target)) { rft.remove(shooter, target); return false; } /* take the shot */ const bool tookShot = rf.shoot(shooter, target->pos, ST_RIGHT_REACTION, shooter->chr.RFmode.getFmIdx()); if (tookShot) { /* clear any shakenness */ shooter->removeShaken(); } return tookShot; }
/** * @brief Resolve the reaction fire for an entity, this checks that the entity can fire and then takes the shot * @param[in] shooter The entity to resolve reaction fire for * @param[in] target The victim of the reaction fire * @return true if the entity fired (or would have fired if mock), false otherwise */ static bool G_ReactionFireTryToShoot (edict_t *shooter, const edict_t *target) { /* check for valid target */ assert(target); /* shooter can't take a reaction shot if it's not possible - and check that * the target is still alive */ if (!G_ReactionFireIsPossible(shooter, target)) { rft.remove(shooter, target); return false; } /* take the shot */ const bool tookShot = G_ReactionFireShoot(shooter, target->pos, ST_RIGHT_REACTION, shooter->chr.RFmode.fmIdx); if (tookShot) { /* clear any shakenness */ G_RemoveShaken(shooter); } return tookShot; }