⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameai.java

📁 JAKE2用JAVA写的queck2的3D游戏开发引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        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 + -