public static void FoundTarget(edict_t self) { if (self.enemy.client != null) { GameBase.level.sight_entity = self; GameBase.level.sight_entity_framenum = GameBase.level.framenum; GameBase.level.sight_entity.light_level = 128; } self.show_hostile = (int)GameBase.level.time + 1; Math3D.VectorCopy(self.enemy.s.origin, self.monsterinfo.last_sighting); self.monsterinfo.trail_time = GameBase.level.time; if (self.combattarget == null) { GameAI.HuntTarget(self); return; } self.goalentity = self.movetarget = GameBase.G_PickTarget(self.combattarget); if (self.movetarget == null) { self.goalentity = self.movetarget = self.enemy; GameAI.HuntTarget(self); GameBase.gi.Dprintf("" + self.classname + "at " + Lib.Vtos(self.s.origin) + ", combattarget " + self.combattarget + " not found\\n"); return; } self.combattarget = null; self.monsterinfo.aiflags |= Defines.AI_COMBAT_POINT; self.movetarget.targetname = null; self.monsterinfo.pausetime = 0; self.monsterinfo.run.Think(self); }
public static void G_RunFrame() { int i; edict_t ent; level.framenum++; level.time = level.framenum * Defines.FRAMETIME; GameAI.AI_SetSightClient(); if (level.exitintermission) { ExitLevel(); return; } for (i = 0; i < num_edicts; i++) { ent = g_edicts[i]; if (!ent.inuse) { continue; } level.current_entity = ent; Math3D.VectorCopy(ent.s.origin, ent.s.old_origin); if ((ent.groundentity != null) && (ent.groundentity.linkcount != ent.groundentity_linkcount)) { ent.groundentity = null; if (0 == (ent.flags & (Defines.FL_SWIM | Defines.FL_FLY)) && (ent.svflags & Defines.SVF_MONSTER) != 0) { M.M_CheckGround(ent); } } if (i > 0 && i <= maxclients.value) { PlayerClient.ClientBeginServerFrame(ent); continue; } G_RunEntity(ent); } CheckDMRules(); CheckNeedPass(); ClientEndServerFrames(); }