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

📄 gamecombat.java

📁 Jake2是一个Java 3D游戏引擎.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*Copyright (C) 1997-2001 Id Software, Inc.This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*/// Created on 16.11.2005 by RST.// $Id: GameCombat.java,v 1.3 2006/01/21 21:53:32 salomo Exp $package jake2.game;import jake2.Defines;import jake2.Globals;import jake2.qcommon.Com;import jake2.util.Math3D;public class GameCombat {    /**     * CanDamage     *      * Returns true if the inflictor can directly damage the target. Used for     * explosions and melee attacks.     */    static boolean CanDamage(edict_t targ, edict_t inflictor) {        float[] dest = { 0, 0, 0 };        trace_t trace;            // bmodels need special checking because their origin is 0,0,0        if (targ.movetype == Defines.MOVETYPE_PUSH) {            Math3D.VectorAdd(targ.absmin, targ.absmax, dest);            Math3D.VectorScale(dest, 0.5f, dest);            trace = GameBase.gi.trace(inflictor.s.origin, Globals.vec3_origin,                    Globals.vec3_origin, dest, inflictor, Defines.MASK_SOLID);            if (trace.fraction == 1.0f)                return true;            if (trace.ent == targ)                return true;            return false;        }            trace = GameBase.gi.trace(inflictor.s.origin, Globals.vec3_origin,                Globals.vec3_origin, targ.s.origin, inflictor,                Defines.MASK_SOLID);        if (trace.fraction == 1.0)            return true;            Math3D.VectorCopy(targ.s.origin, dest);        dest[0] += 15.0;        dest[1] += 15.0;        trace = GameBase.gi.trace(inflictor.s.origin, Globals.vec3_origin,                Globals.vec3_origin, dest, inflictor, Defines.MASK_SOLID);        if (trace.fraction == 1.0)            return true;            Math3D.VectorCopy(targ.s.origin, dest);        dest[0] += 15.0;        dest[1] -= 15.0;        trace = GameBase.gi.trace(inflictor.s.origin, Globals.vec3_origin,                Globals.vec3_origin, dest, inflictor, Defines.MASK_SOLID);        if (trace.fraction == 1.0)            return true;            Math3D.VectorCopy(targ.s.origin, dest);        dest[0] -= 15.0;        dest[1] += 15.0;        trace = GameBase.gi.trace(inflictor.s.origin, Globals.vec3_origin,                Globals.vec3_origin, dest, inflictor, Defines.MASK_SOLID);        if (trace.fraction == 1.0)            return true;            Math3D.VectorCopy(targ.s.origin, dest);        dest[0] -= 15.0;        dest[1] -= 15.0;        trace = GameBase.gi.trace(inflictor.s.origin, Globals.vec3_origin,                Globals.vec3_origin, dest, inflictor, Defines.MASK_SOLID);        if (trace.fraction == 1.0)            return true;            return false;    }    /**     * Killed.     */    public static void Killed(edict_t targ, edict_t inflictor,            edict_t attacker, int damage, float[] point) {        Com.DPrintf("Killing a " + targ.classname + "\n");        if (targ.health < -999)            targ.health = -999;            targ.enemy = attacker;            if ((targ.svflags & Defines.SVF_MONSTER) != 0                && (targ.deadflag != Defines.DEAD_DEAD)) {            //			targ.svflags |= SVF_DEADMONSTER; // now treat as a different            // content type            if (0 == (targ.monsterinfo.aiflags & Defines.AI_GOOD_GUY)) {                GameBase.level.killed_monsters++;                if (GameBase.coop.value != 0 && attacker.client != null)                    attacker.client.resp.score++;                // medics won't heal monsters that they kill themselves                if (attacker.classname.equals("monster_medic"))                    targ.owner = attacker;            }        }            if (targ.movetype == Defines.MOVETYPE_PUSH                || targ.movetype == Defines.MOVETYPE_STOP                || targ.movetype == Defines.MOVETYPE_NONE) { // doors, triggers,                                                             // etc            targ.die.die(targ, inflictor, attacker, damage, point);            return;        }            if ((targ.svflags & Defines.SVF_MONSTER) != 0                && (targ.deadflag != Defines.DEAD_DEAD)) {            targ.touch = null;            Monster.monster_death_use(targ);        }            targ.die.die(targ, inflictor, attacker, damage, point);    }    /**     * SpawnDamage.     */    static void SpawnDamage(int type, float[] origin, float[] normal, int damage) {        if (damage > 255)            damage = 255;        GameBase.gi.WriteByte(Defines.svc_temp_entity);        GameBase.gi.WriteByte(type);        //		gi.WriteByte (damage);        GameBase.gi.WritePosition(origin);        GameBase.gi.WriteDir(normal);        GameBase.gi.multicast(origin, Defines.MULTICAST_PVS);    }    static int CheckPowerArmor(edict_t ent, float[] point, float[] normal,            int damage, int dflags) {        gclient_t client;        int save;        int power_armor_type;        int index = 0;        int damagePerCell;        int pa_te_type;        int power = 0;        int power_used;            if (damage == 0)            return 0;            client = ent.client;            if ((dflags & Defines.DAMAGE_NO_ARMOR) != 0)            return 0;            if (client != null) {            power_armor_type = GameItems.PowerArmorType(ent);            if (power_armor_type != Defines.POWER_ARMOR_NONE) {                index = GameItems.ITEM_INDEX(GameItems.FindItem("Cells"));                power = client.pers.inventory[index];            }        } else if ((ent.svflags & Defines.SVF_MONSTER) != 0) {            power_armor_type = ent.monsterinfo.power_armor_type;            power = ent.monsterinfo.power_armor_power;        } else            return 0;            if (power_armor_type == Defines.POWER_ARMOR_NONE)            return 0;        if (power == 0)            return 0;            if (power_armor_type == Defines.POWER_ARMOR_SCREEN) {            float[] vec = { 0, 0, 0 };            float dot;            float[] forward = { 0, 0, 0 };                // only works if damage point is in front            Math3D.AngleVectors(ent.s.angles, forward, null, null);            Math3D.VectorSubtract(point, ent.s.origin, vec);            Math3D.VectorNormalize(vec);            dot = Math3D.DotProduct(vec, forward);            if (dot <= 0.3)                return 0;                damagePerCell = 1;            pa_te_type = Defines.TE_SCREEN_SPARKS;            damage = damage / 3;        } else {            damagePerCell = 2;            pa_te_type = Defines.TE_SHIELD_SPARKS;            damage = (2 * damage) / 3;        }            save = power * damagePerCell;            if (save == 0)            return 0;        if (save > damage)            save = damage;            SpawnDamage(pa_te_type, point, normal, save);        ent.powerarmor_time = GameBase.level.time + 0.2f;            power_used = save / damagePerCell;            if (client != null)            client.pers.inventory[index] -= power_used;        else            ent.monsterinfo.power_armor_power -= power_used;        return save;    }    static int CheckArmor(edict_t ent, float[] point, float[] normal,            int damage, int te_sparks, int dflags) {        gclient_t client;        int save;        int index;        gitem_t armor;            if (damage == 0)            return 0;            client = ent.client;            if (client == null)            return 0;            if ((dflags & Defines.DAMAGE_NO_ARMOR) != 0)            return 0;            index = GameItems.ArmorIndex(ent);            if (index == 0)            return 0;            armor = GameItems.GetItemByIndex(index);        gitem_armor_t garmor = (gitem_armor_t) armor.info;            if (0 != (dflags & Defines.DAMAGE_ENERGY))            save = (int) Math.ceil(garmor.energy_protection * damage);        else            save = (int) Math.ceil(garmor.normal_protection * damage);            if (save >= client.pers.inventory[index])            save = client.pers.inventory[index];            if (save == 0)            return 0;            client.pers.inventory[index] -= save;        SpawnDamage(te_sparks, point, normal, save);            return save;    }    public static void M_ReactToDamage(edict_t targ, edict_t attacker) {        if ((null != attacker.client)                && 0 != (attacker.svflags & Defines.SVF_MONSTER))            return;    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -