📄 gameai.java
字号:
public String getID() { return "flymonster_start";} public boolean think(edict_t self) { self.flags |= Defines.FL_FLY; self.think = flymonster_start_go; Monster.monster_start(self); return true; } }; public static EntThinkAdapter swimmonster_start_go = new EntThinkAdapter() { public String getID() { return "swimmonster_start_go";} public boolean think(edict_t self) { if (0 == self.yaw_speed) self.yaw_speed = 20; self.viewheight = 10; Monster.monster_start_go(self); if ((self.spawnflags & 2) != 0) Monster.monster_triggered_start.think(self); return true; } }; public static EntThinkAdapter swimmonster_start = new EntThinkAdapter() { public String getID() { return "swimmonster_start";} public boolean think(edict_t self) { self.flags |= Defines.FL_SWIM; self.think = swimmonster_start_go; Monster.monster_start(self); return true; } }; /** * Don't move, but turn towards ideal_yaw Distance is for slight position * adjustments needed by the animations */ public static AIAdapter ai_turn = new AIAdapter() { public String getID() { return "ai_turn";} public void ai(edict_t self, float dist) { if (dist != 0) M.M_walkmove(self, self.s.angles[Defines.YAW], dist); if (GameUtil.FindTarget(self)) return; M.M_ChangeYaw(self); } }; /** * Move the specified distance at current facing. This replaces the QC * functions: ai_forward, ai_back, ai_pain, and ai_painforward */ public static AIAdapter ai_move = new AIAdapter() { public String getID() { return "ai_move";} public void ai(edict_t self, float dist) { M.M_walkmove(self, self.s.angles[Defines.YAW], dist); } }; /** * The monster is walking it's beat. */ public static AIAdapter ai_walk = new AIAdapter() { public String getID() { return "ai_walk";} public void ai(edict_t self, float dist) { M.M_MoveToGoal(self, dist); // check for noticing a player if (GameUtil.FindTarget(self)) return; if ((self.monsterinfo.search != null) && (GameBase.level.time > self.monsterinfo.idle_time)) { if (self.monsterinfo.idle_time != 0) { self.monsterinfo.search.think(self); self.monsterinfo.idle_time = GameBase.level.time + 15 + Globals.rnd.nextFloat() * 15; } else { self.monsterinfo.idle_time = GameBase.level.time + Globals.rnd.nextFloat() * 15; } } } }; /** * Used for standing around and looking for players Distance is for slight * position adjustments needed by the animations. */ public static AIAdapter ai_stand = new AIAdapter() { public String getID() { return "ai_stand";} public void ai(edict_t self, float dist) { float[] v = { 0, 0, 0 }; if (dist != 0) M.M_walkmove(self, self.s.angles[Defines.YAW], dist); if ((self.monsterinfo.aiflags & Defines.AI_STAND_GROUND) != 0) { if (self.enemy != null) { Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, v); self.ideal_yaw = Math3D.vectoyaw(v); if (self.s.angles[Defines.YAW] != self.ideal_yaw && 0 != (self.monsterinfo.aiflags & Defines.AI_TEMP_STAND_GROUND)) { self.monsterinfo.aiflags &= ~(Defines.AI_STAND_GROUND | Defines.AI_TEMP_STAND_GROUND); self.monsterinfo.run.think(self); } M.M_ChangeYaw(self); ai_checkattack(self, 0); } else GameUtil.FindTarget(self); return; } if (GameUtil.FindTarget(self)) return; if (GameBase.level.time > self.monsterinfo.pausetime) { self.monsterinfo.walk.think(self); return; } if (0 == (self.spawnflags & 1) && (self.monsterinfo.idle != null) && (GameBase.level.time > self.monsterinfo.idle_time)) { if (self.monsterinfo.idle_time != 0) { self.monsterinfo.idle.think(self); self.monsterinfo.idle_time = GameBase.level.time + 15 + Globals.rnd.nextFloat() * 15; } else { self.monsterinfo.idle_time = GameBase.level.time + Globals.rnd.nextFloat() * 15; } } } }; /** * Turns towards target and advances Use this call with a distnace of 0 to * replace ai_face. */ public static AIAdapter ai_charge = new AIAdapter() { public String getID() { return "ai_charge";} public void ai(edict_t self, float dist) { float[] v = { 0, 0, 0 }; Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, v); self.ideal_yaw = Math3D.vectoyaw(v); M.M_ChangeYaw(self); if (dist != 0) M.M_walkmove(self, self.s.angles[Defines.YAW], dist); } }; /** * The monster has an enemy it is trying to kill. */ public static AIAdapter ai_run = new AIAdapter() { public String getID() { return "ai_run";} public void ai(edict_t self, float dist) { float[] v = { 0, 0, 0 }; edict_t tempgoal; edict_t save; boolean new1; edict_t marker; float d1, d2; trace_t tr; // mem float[] v_forward = { 0, 0, 0 }, v_right = { 0, 0, 0 }; float left, center, right; float[] left_target = { 0, 0, 0 }, right_target = { 0, 0, 0 }; // if we're going to a combat point, just proceed if ((self.monsterinfo.aiflags & Defines.AI_COMBAT_POINT) != 0) { M.M_MoveToGoal(self, dist); return; } if ((self.monsterinfo.aiflags & Defines.AI_SOUND_TARGET) != 0) { Math3D.VectorSubtract(self.s.origin, self.enemy.s.origin, v); // ...and reached it if (Math3D.VectorLength(v) < 64) { //don't move, just stand and listen. //self.monsterinfo.aiflags |= (Defines.AI_STAND_GROUND | Defines.AI_TEMP_STAND_GROUND); self.monsterinfo.stand.think(self); // since now it is aware and does not to be triggered again. self.spawnflags &= ~1; self.enemy = null; } else M.M_MoveToGoal(self, dist); // look for new targets if (!GameUtil.FindTarget(self)) return; } if (ai_checkattack(self, dist)) return; if (self.monsterinfo.attack_state == Defines.AS_SLIDING) { ai_run_slide(self, dist); return; } if (enemy_vis) { //if (self.aiflags & AI_LOST_SIGHT) // dprint("regained sight\n"); M.M_MoveToGoal(self, dist); self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT; Math3D.VectorCopy(self.enemy.s.origin, self.monsterinfo.last_sighting); self.monsterinfo.trail_time = GameBase.level.time; return; } // coop will change to another enemy if visible if (GameBase.coop.value != 0) { // FIXME: insane guys get mad with this, which causes crashes! if (GameUtil.FindTarget(self)) return; } if ((self.monsterinfo.search_time != 0) && (GameBase.level.time > (self.monsterinfo.search_time + 20))) { M.M_MoveToGoal(self, dist); self.monsterinfo.search_time = 0; //dprint("search timeout\n"); return; } save = self.goalentity; tempgoal = GameUtil.G_Spawn(); self.goalentity = tempgoal; new1 = false; if (0 == (self.monsterinfo.aiflags & Defines.AI_LOST_SIGHT)) { // just lost sight of the player, decide where to go first // dprint("lost sight of player, last seen at "); // dprint(vtos(self.last_sighting)); // dprint("\n"); self.monsterinfo.aiflags |= (Defines.AI_LOST_SIGHT | Defines.AI_PURSUIT_LAST_SEEN); self.monsterinfo.aiflags &= ~(Defines.AI_PURSUE_NEXT | Defines.AI_PURSUE_TEMP); new1 = true; } if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_NEXT) != 0) { self.monsterinfo.aiflags &= ~Defines.AI_PURSUE_NEXT; // dprint("reached current goal: "); // dprint(vtos(self.origin)); // dprint(" "); // dprint(vtos(self.last_sighting)); // dprint(" "); // dprint(ftos(vlen(self.origin - self.last_sighting))); // dprint("\n"); // give ourself more time since we got this far self.monsterinfo.search_time = GameBase.level.time + 5; if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_TEMP) != 0) { // dprint("was temp goal; retrying original\n"); self.monsterinfo.aiflags &= ~Defines.AI_PURSUE_TEMP; marker = null; Math3D.VectorCopy(self.monsterinfo.saved_goal, self.monsterinfo.last_sighting); new1 = true; } else if ((self.monsterinfo.aiflags & Defines.AI_PURSUIT_LAST_SEEN) != 0) { self.monsterinfo.aiflags &= ~Defines.AI_PURSUIT_LAST_SEEN; marker = PlayerTrail.PickFirst(self); } else { marker = PlayerTrail.PickNext(self); } if (marker != null) { Math3D.VectorCopy(marker.s.origin, self.monsterinfo.last_sighting); self.monsterinfo.trail_time = marker.timestamp; self.s.angles[Defines.YAW] = self.ideal_yaw = marker.s.angles[Defines.YAW]; // dprint("heading is "); // dprint(ftos(self.ideal_yaw)); // dprint("\n"); // debug_drawline(self.origin, self.last_sighting, 52); new1 = true; } } Math3D.VectorSubtract(self.s.origin, self.monsterinfo.last_sighting, v); d1 = Math3D.VectorLength(v); if (d1 <= dist) { self.monsterinfo.aiflags |= Defines.AI_PURSUE_NEXT; dist = d1; } Math3D.VectorCopy(self.monsterinfo.last_sighting, self.goalentity.s.origin); if (new1) { // gi.dprintf("checking for course correction\n"); tr = GameBase.gi.trace(self.s.origin, self.mins, self.maxs, self.monsterinfo.last_sighting, self, Defines.MASK_PLAYERSOLID); if (tr.fraction < 1) { Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v); d1 = Math3D.VectorLength(v); center = tr.fraction; d2 = d1 * ((center + 1) / 2); self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.vectoyaw(v); Math3D.AngleVectors(self.s.angles, v_forward, v_right, null); Math3D.VectorSet(v, d2, -16, 0); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target); tr = GameBase.gi.trace(self.s.origin, self.mins, self.maxs, left_target, self, Defines.MASK_PLAYERSOLID); left = tr.fraction; Math3D.VectorSet(v, d2, 16, 0); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target); tr = GameBase.gi.trace(self.s.origin, self.mins, self.maxs, right_target, self, Defines.MASK_PLAYERSOLID); right = tr.fraction; center = (d1 * center) / d2; if (left >= center && left > right) { if (left < 1) { Math3D.VectorSet(v, d2 * left * 0.5f, -16f, 0f); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target); // gi.dprintf("incomplete path, go part way and adjust again\n"); } Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal); self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP; Math3D.VectorCopy(left_target, self.goalentity.s.origin); Math3D.VectorCopy(left_target, self.monsterinfo.last_sighting); Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v); self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.vectoyaw(v); // gi.dprintf("adjusted left\n"); // debug_drawline(self.origin, self.last_sighting, 152); } else if (right >= center && right > left) { if (right < 1) { Math3D.VectorSet(v, d2 * right * 0.5f, 16f, 0f); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target); // gi.dprintf("incomplete path, go part way and adjust again\n"); } Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal); self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP; Math3D.VectorCopy(right_target, self.goalentity.s.origin); Math3D.VectorCopy(right_target, self.monsterinfo.last_sighting); Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v); self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.vectoyaw(v); // gi.dprintf("adjusted right\n"); // debug_drawline(self.origin, self.last_sighting, 152); } } // else gi.dprintf("course was fine\n"); } M.M_MoveToGoal(self, dist); GameUtil.G_FreeEdict(tempgoal); if (self != null) self.goalentity = save; } }; static boolean enemy_vis; static boolean enemy_infront; static int enemy_range; static float enemy_yaw;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -