📄 m_boss32.java
字号:
}; static EntPainAdapter makron_pain = new EntPainAdapter() { public String getID() { return "makron_pain"; } public void pain(edict_t self, edict_t other, float kick, int damage) { if (self.health < (self.max_health / 2)) self.s.skinnum = 1; if (GameBase.level.time < self.pain_debounce_time) return; // Lessen the chance of him going into his pain frames if (damage <= 25) if (Lib.random() < 0.2) return; self.pain_debounce_time = GameBase.level.time + 3; if (GameBase.skill.value == 3) return; // no pain anims in nightmare if (damage <= 40) { GameBase.gi.sound(self, Defines.CHAN_VOICE, sound_pain4, 1, Defines.ATTN_NONE, 0); self.monsterinfo.currentmove = makron_move_pain4; } else if (damage <= 110) { GameBase.gi.sound(self, Defines.CHAN_VOICE, sound_pain5, 1, Defines.ATTN_NONE, 0); self.monsterinfo.currentmove = makron_move_pain5; } else { if (damage <= 150) if (Lib.random() <= 0.45) { GameBase.gi.sound(self, Defines.CHAN_VOICE, sound_pain6, 1, Defines.ATTN_NONE, 0); self.monsterinfo.currentmove = makron_move_pain6; } else if (Lib.random() <= 0.35) { GameBase.gi.sound(self, Defines.CHAN_VOICE, sound_pain6, 1, Defines.ATTN_NONE, 0); self.monsterinfo.currentmove = makron_move_pain6; } } } }; static EntInteractAdapter makron_sight = new EntInteractAdapter() { public String getID() { return "makron_sight"; } public boolean interact(edict_t self, edict_t other) { self.monsterinfo.currentmove = makron_move_sight; return true; } }; static EntThinkAdapter makron_attack = new EntThinkAdapter() { public String getID() { return "makron_attack"; } public boolean think(edict_t self) { float[] vec = { 0, 0, 0 }; float range; float r; r = Lib.random(); Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, vec); range = Math3D.VectorLength(vec); if (r <= 0.3) self.monsterinfo.currentmove = makron_move_attack3; else if (r <= 0.6) self.monsterinfo.currentmove = makron_move_attack4; else self.monsterinfo.currentmove = makron_move_attack5; return true; } }; /* * --- Makron Torso. This needs to be spawned in --- */ static EntThinkAdapter makron_torso_think = new EntThinkAdapter() { public String getID() { return "makron_torso_think"; } public boolean think(edict_t self) { if (++self.s.frame < 365) self.nextthink = GameBase.level.time + Defines.FRAMETIME; else { self.s.frame = 346; self.nextthink = GameBase.level.time + Defines.FRAMETIME; } return true; } }; static EntThinkAdapter makron_torso = new EntThinkAdapter() { public String getID() { return "makron_torso"; } public boolean think(edict_t ent) { ent.movetype = Defines.MOVETYPE_NONE; ent.solid = Defines.SOLID_NOT; Math3D.VectorSet(ent.mins, -8, -8, 0); Math3D.VectorSet(ent.maxs, 8, 8, 8); ent.s.frame = 346; ent.s.modelindex = GameBase.gi .modelindex("models/monsters/boss3/rider/tris.md2"); ent.think = makron_torso_think; ent.nextthink = GameBase.level.time + 2 * Defines.FRAMETIME; ent.s.sound = GameBase.gi.soundindex("makron/spine.wav"); GameBase.gi.linkentity(ent); return true; } }; static EntDieAdapter makron_die = new EntDieAdapter() { public String getID() { return "makron_die"; } public void die(edict_t self, edict_t inflictor, edict_t attacker, int damage, float[] point) { edict_t tempent; int n; self.s.sound = 0; // check for gib if (self.health <= self.gib_health) { GameBase.gi .sound(self, Defines.CHAN_VOICE, GameBase.gi .soundindex("misc/udeath.wav"), 1, Defines.ATTN_NORM, 0); for (n = 0; n < 1 /* 4 */; n++) GameMisc.ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", damage, Defines.GIB_ORGANIC); for (n = 0; n < 4; n++) GameMisc.ThrowGib(self, "models/objects/gibs/sm_metal/tris.md2", damage, Defines.GIB_METALLIC); GameMisc.ThrowHead(self, "models/objects/gibs/gear/tris.md2", damage, Defines.GIB_METALLIC); self.deadflag = Defines.DEAD_DEAD; return; } if (self.deadflag == Defines.DEAD_DEAD) return; // regular death GameBase.gi.sound(self, Defines.CHAN_VOICE, sound_death, 1, Defines.ATTN_NONE, 0); self.deadflag = Defines.DEAD_DEAD; self.takedamage = Defines.DAMAGE_YES; tempent = GameUtil.G_Spawn(); Math3D.VectorCopy(self.s.origin, tempent.s.origin); Math3D.VectorCopy(self.s.angles, tempent.s.angles); tempent.s.origin[1] -= 84; makron_torso.think(tempent); self.monsterinfo.currentmove = makron_move_death2; } }; static EntThinkAdapter Makron_CheckAttack = new EntThinkAdapter() { public String getID() { return "Makron_CheckAttack"; } public boolean think(edict_t self) { float[] spot1 = { 0, 0, 0 }, spot2 = { 0, 0, 0 }; float[] temp = { 0, 0, 0 }; float chance; trace_t tr; boolean enemy_infront; int enemy_range; float enemy_yaw; if (self.enemy.health > 0) { // see if any entities are in the way of the shot Math3D.VectorCopy(self.s.origin, spot1); spot1[2] += self.viewheight; Math3D.VectorCopy(self.enemy.s.origin, spot2); spot2[2] += self.enemy.viewheight; tr = GameBase.gi.trace(spot1, null, null, spot2, self, Defines.CONTENTS_SOLID | Defines.CONTENTS_MONSTER | Defines.CONTENTS_SLIME | Defines.CONTENTS_LAVA); // do we have a clear shot? if (tr.ent != self.enemy) return false; } enemy_infront = GameUtil.infront(self, self.enemy); enemy_range = GameUtil.range(self, self.enemy); Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, temp); enemy_yaw = Math3D.vectoyaw(temp); self.ideal_yaw = enemy_yaw; // melee attack if (enemy_range == Defines.RANGE_MELEE) { if (self.monsterinfo.melee != null) self.monsterinfo.attack_state = Defines.AS_MELEE; else self.monsterinfo.attack_state = Defines.AS_MISSILE; return true; } // missile attack if (null != self.monsterinfo.attack) return false; if (GameBase.level.time < self.monsterinfo.attack_finished) return false; if (enemy_range == Defines.RANGE_FAR) return false; if ((self.monsterinfo.aiflags & Defines.AI_STAND_GROUND) != 0) { chance = 0.4f; } else if (enemy_range == Defines.RANGE_MELEE) { chance = 0.8f; } else if (enemy_range == Defines.RANGE_NEAR) { chance = 0.4f; } else if (enemy_range == Defines.RANGE_MID) { chance = 0.2f; } else { return false; } if (Lib.random() < chance) { self.monsterinfo.attack_state = Defines.AS_MISSILE; self.monsterinfo.attack_finished = GameBase.level.time + 2 * Lib.random(); return true; } if ((self.flags & Defines.FL_FLY) != 0) { if (Lib.random() < 0.3) self.monsterinfo.attack_state = Defines.AS_SLIDING; else self.monsterinfo.attack_state = Defines.AS_STRAIGHT; } return false; } }; static mframe_t makron_frames_attack3[] = new mframe_t[] { new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, makronBFG), // FIXME: BFG Attack here new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null) }; static mmove_t makron_move_attack3 = new mmove_t(FRAME_attak301, FRAME_attak308, makron_frames_attack3, makron_run); static mframe_t makron_frames_attack4[] = new mframe_t[] { new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, MakronHyperblaster), // fire new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null) }; static mmove_t makron_move_attack4 = new mmove_t(FRAME_attak401, FRAME_attak426, makron_frames_attack4, makron_run); static mframe_t makron_frames_attack5[] = new mframe_t[] { new mframe_t(GameAI.ai_charge, 0, makron_prerailgun), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, null), new mframe_t(GameAI.ai_charge, 0, MakronSaveloc), new mframe_t(GameAI.ai_move, 0, MakronRailgun), // Fire railgun new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null), new mframe_t(GameAI.ai_move, 0, null) }; static mmove_t makron_move_attack5 = new mmove_t(FRAME_attak501, FRAME_attak516, makron_frames_attack5, makron_run); /* * ================= MakronSpawn * * ================= */ static EntThinkAdapter MakronSpawn = new EntThinkAdapter() { public String getID() { return "MakronSpawn"; } public boolean think(edict_t self) { float[] vec = { 0, 0, 0 }; edict_t player; SP_monster_makron(self); // jump at player player = GameBase.level.sight_client; if (player == null) return true; Math3D.VectorSubtract(player.s.origin, self.s.origin, vec); self.s.angles[Defines.YAW] = Math3D.vectoyaw(vec); Math3D.VectorNormalize(vec); Math3D.VectorMA(Globals.vec3_origin, 400, vec, self.velocity); self.velocity[2] = 200; self.groundentity = null; return true; } }; static EntThinkAdapter MakronToss = new EntThinkAdapter() { public String getID() { return "MakronToss"; } public boolean think(edict_t self) { edict_t ent; ent = GameUtil.G_Spawn(); ent.nextthink = GameBase.level.time + 0.8f; ent.think = MakronSpawn; ent.target = self.target; Math3D.VectorCopy(self.s.origin, ent.s.origin); return true; } }; // // monster_makron // static void MakronPrecache() { sound_pain4 = GameBase.gi.soundindex("makron/pain3.wav"); sound_pain5 = GameBase.gi.soundindex("makron/pain2.wav"); sound_pain6 = GameBase.gi.soundindex("makron/pain1.wav"); sound_death = GameBase.gi.soundindex("makron/death.wav"); sound_step_left = GameBase.gi.soundindex("makron/step1.wav"); sound_step_right = GameBase.gi.soundindex("makron/step2.wav"); sound_attack_bfg = GameBase.gi.soundindex("makron/bfg_fire.wav"); sound_brainsplorch = GameBase.gi.soundindex("makron/brain1.wav"); sound_prerailgun = GameBase.gi.soundindex("makron/rail_up.wav"); sound_popup = GameBase.gi.soundindex("makron/popup.wav"); sound_taunt1 = GameBase.gi.soundindex("makron/voice4.wav"); sound_taunt2 = GameBase.gi.soundindex("makron/voice3.wav"); sound_taunt3 = GameBase.gi.soundindex("makron/voice.wav"); sound_hit = GameBase.gi.soundindex("makron/bhit.wav"); GameBase.gi.modelindex("models/monsters/boss3/rider/tris.md2"); } /* * QUAKED monster_makron (1 .5 0) (-30 -30 0) (30 30 90) Ambush * Trigger_Spawn Sight */ static void SP_monster_makron(edict_t self) { if (GameBase.deathmatch.value != 0) { GameUtil.G_FreeEdict(self); return; } MakronPrecache(); self.movetype = Defines.MOVETYPE_STEP; self.solid = Defines.SOLID_BBOX; self.s.modelindex = GameBase.gi .modelindex("models/monsters/boss3/rider/tris.md2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -