/** * @brief Touch trigger * @sa SP_trigger_touch */ static bool Touch_TouchTrigger (Edict* self, Edict* activator) { /* these actors should really not be able to trigger this - they don't move anymore */ assert(!G_IsDead(activator)); self->_owner = G_EdictsFindTargetEntity(self->target); if (!self->owner()) { gi.DPrintf("Target '%s' wasn't found for %s\n", self->target, self->classname); G_FreeEdict(self); return false; } if (self->owner()->flags & FL_CLIENTACTION) { G_ActorSetClientAction(activator, self->owner()); } else if (!(self->spawnflags & TRIGGER_TOUCH_ONCE) || self->touchedNext == nullptr) { if (!self->owner()->use) { gi.DPrintf("Owner of %s doesn't have a use function\n", self->classname); G_FreeEdict(self); return false; } G_UseEdict(self->owner(), activator); } return false; }
/** * @brief Mission trigger use function */ bool G_MissionUse (Edict* self, Edict* activator) { Edict* target = G_EdictsFindTargetEntity(self->target); if (!target) { gi.DPrintf("Target '%s' wasn't found for misc_mission\n", self->target); G_FreeEdict(self); return false; } if (target->destroy) { /* set this to zero to determine that this is a triggered destroy call */ target->HP = 0; target->destroy(target); /* freed when the level changes */ self->target = nullptr; self->use = nullptr; } else if (target->use) target->use(target, activator); return true; }