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

📄 gameitems.java

📁 JAKE2用JAVA写的queck2的3D游戏开发引擎
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
        if (cl.chase_target != null) {            GameChase.ChaseNext(ent);            return;        }            // scan for the next valid one        for (i = 1; i <= Defines.MAX_ITEMS; i++) {            index = (cl.pers.selected_item + i) % Defines.MAX_ITEMS;            if (0 == cl.pers.inventory[index])                continue;            it = GameItemList.itemlist[index];            if (it.use == null)                continue;            if (0 == (it.flags & itflags))                continue;                cl.pers.selected_item = index;            return;        }            cl.pers.selected_item = -1;    }    public static void SelectPrevItem(edict_t ent, int itflags) {        gclient_t cl;        int i, index;        gitem_t it;            cl = ent.client;            if (cl.chase_target != null) {            GameChase.ChasePrev(ent);            return;        }            // scan for the next valid one        for (i = 1; i <= Defines.MAX_ITEMS; i++) {            index = (cl.pers.selected_item + Defines.MAX_ITEMS - i)                    % Defines.MAX_ITEMS;            if (0 == cl.pers.inventory[index])                continue;            it = GameItemList.itemlist[index];            if (null == it.use)                continue;            if (0 == (it.flags & itflags))                continue;                cl.pers.selected_item = index;            return;        }            cl.pers.selected_item = -1;    }    /*     * =============== PrecacheItem     *      * Precaches all data needed for a given item. This will be called for each     * item spawned in a level, and for each item in each client's inventory.     * ===============     */    public static void PrecacheItem(gitem_t it) {        String s;        String data;        int len;        gitem_t ammo;            if (it == null)            return;            if (it.pickup_sound != null)            GameBase.gi.soundindex(it.pickup_sound);            if (it.world_model != null)            GameBase.gi.modelindex(it.world_model);            if (it.view_model != null)            GameBase.gi.modelindex(it.view_model);            if (it.icon != null)            GameBase.gi.imageindex(it.icon);            // parse everything for its ammo        if (it.ammo != null && it.ammo.length() != 0) {            ammo = FindItem(it.ammo);            if (ammo != it)                PrecacheItem(ammo);        }            // parse the space seperated precache string for other items        s = it.precaches;        if (s == null || s.length() != 0)            return;            StringTokenizer tk = new StringTokenizer(s);            while (tk.hasMoreTokens()) {            data = tk.nextToken();                len = data.length();                if (len >= Defines.MAX_QPATH || len < 5)                GameBase.gi                        .error("PrecacheItem: it.classname has bad precache string: "                                + s);                // determine type based on extension            if (data.endsWith("md2"))                GameBase.gi.modelindex(data);            else if (data.endsWith("sp2"))                GameBase.gi.modelindex(data);            else if (data.endsWith("wav"))                GameBase.gi.soundindex(data);            else if (data.endsWith("pcx"))                GameBase.gi.imageindex(data);            else                GameBase.gi.error("PrecacheItem: bad precache string: " + data);        }    }    /*     * ============ SpawnItem     *      * Sets the clipping size and plants the object on the floor.     *      * Items can't be immediately dropped to floor, because they might be on an     * entity that hasn't spawned yet. ============     */    public static void SpawnItem(edict_t ent, gitem_t item) {        PrecacheItem(item);            if (ent.spawnflags != 0) {            if (Lib.strcmp(ent.classname, "key_power_cube") != 0) {                ent.spawnflags = 0;                GameBase.gi.dprintf("" + ent.classname + " at "                        + Lib.vtos(ent.s.origin)                        + " has invalid spawnflags set\n");            }        }            // some items will be prevented in deathmatch        if (GameBase.deathmatch.value != 0) {            if (((int) GameBase.dmflags.value & Defines.DF_NO_ARMOR) != 0) {                if (item.pickup == Pickup_Armor                        || item.pickup == Pickup_PowerArmor) {                    GameUtil.G_FreeEdict(ent);                    return;                }            }            if (((int) GameBase.dmflags.value & Defines.DF_NO_ITEMS) != 0) {                if (item.pickup == Pickup_Powerup) {                    GameUtil.G_FreeEdict(ent);                    return;                }            }            if (((int) GameBase.dmflags.value & Defines.DF_NO_HEALTH) != 0) {                if (item.pickup == Pickup_Health                        || item.pickup == Pickup_Adrenaline                        || item.pickup == Pickup_AncientHead) {                    GameUtil.G_FreeEdict(ent);                    return;                }            }            if (((int) GameBase.dmflags.value & Defines.DF_INFINITE_AMMO) != 0) {                if ((item.flags == Defines.IT_AMMO)                        || (Lib.strcmp(ent.classname, "weapon_bfg") == 0)) {                    GameUtil.G_FreeEdict(ent);                    return;                }            }        }            if (GameBase.coop.value != 0                && (Lib.strcmp(ent.classname, "key_power_cube") == 0)) {            ent.spawnflags |= (1 << (8 + GameBase.level.power_cubes));            GameBase.level.power_cubes++;        }            // don't let them drop items that stay in a coop game        if ((GameBase.coop.value != 0)                && (item.flags & Defines.IT_STAY_COOP) != 0) {            item.drop = null;        }            ent.item = item;        ent.nextthink = GameBase.level.time + 2 * Defines.FRAMETIME;        // items start after other solids        ent.think = droptofloor;        ent.s.effects = item.world_model_flags;        ent.s.renderfx = Defines.RF_GLOW;            if (ent.model != null)            GameBase.gi.modelindex(ent.model);    }    /*     * QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16)     */    public static void SP_item_health(edict_t self) {        if (GameBase.deathmatch.value != 0                && ((int) GameBase.dmflags.value & Defines.DF_NO_HEALTH) != 0) {            GameUtil.G_FreeEdict(self);        }            self.model = "models/items/healing/medium/tris.md2";        self.count = 10;        SpawnItem(self, FindItem("Health"));        GameBase.gi.soundindex("items/n_health.wav");    }    /*     * QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16)     */    static void SP_item_health_small(edict_t self) {        if (GameBase.deathmatch.value != 0                && ((int) GameBase.dmflags.value & Defines.DF_NO_HEALTH) != 0) {            GameUtil.G_FreeEdict(self);            return;        }            self.model = "models/items/healing/stimpack/tris.md2";        self.count = 2;        SpawnItem(self, FindItem("Health"));        self.style = Defines.HEALTH_IGNORE_MAX;        GameBase.gi.soundindex("items/s_health.wav");    }    /*     * QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16)     */    static void SP_item_health_large(edict_t self) {        if (GameBase.deathmatch.value != 0                && ((int) GameBase.dmflags.value & Defines.DF_NO_HEALTH) != 0) {            GameUtil.G_FreeEdict(self);            return;        }            self.model = "models/items/healing/large/tris.md2";        self.count = 25;        SpawnItem(self, FindItem("Health"));        GameBase.gi.soundindex("items/l_health.wav");    }    /*     * QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16)     */    static void SP_item_health_mega(edict_t self) {        if (GameBase.deathmatch.value != 0                && ((int) GameBase.dmflags.value & Defines.DF_NO_HEALTH) != 0) {            GameUtil.G_FreeEdict(self);            return;        }            self.model = "models/items/mega_h/tris.md2";        self.count = 100;        SpawnItem(self, FindItem("Health"));        GameBase.gi.soundindex("items/m_health.wav");        self.style = Defines.HEALTH_IGNORE_MAX | Defines.HEALTH_TIMED;    }    /*     * ===============      * Touch_Item      * ===============     */    public static void Touch_Item(edict_t ent, edict_t other, cplane_t plane,            csurface_t surf) {        boolean taken;        // freed edicts have not items.        if (other.client == null || ent.item == null)            return;        if (other.health < 1)            return; // dead people can't pickup        if (ent.item.pickup == null)            return; // not a grabbable item?            taken = ent.item.pickup.interact(ent, other);            if (taken) {            // flash the screen            other.client.bonus_alpha = 0.25f;                // show icon and name on status bar            other.client.ps.stats[Defines.STAT_PICKUP_ICON] = (short) GameBase.gi                    .imageindex(ent.item.icon);            other.client.ps.stats[Defines.STAT_PICKUP_STRING] = (short) (Defines.CS_ITEMS + ITEM_INDEX(ent.item));            other.client.pickup_msg_time = GameBase.level.time + 3.0f;                // change selected item            if (ent.item.use != null)                other.client.pers.selected_item = other.client.ps.stats[Defines.STAT_SELECTED_ITEM] = (short) ITEM_INDEX(ent.item);                if (ent.item.pickup == Pickup_Health) {                if (ent.count == 2)                    GameBase.gi.sound(other, Defines.CHAN_ITEM, GameBase.gi                            .soundindex("items/s_health.wav"), 1,                            Defines.ATTN_NORM, 0);                else if (ent.count == 10)                    GameBase.gi.sound(other, Defines.CHAN_ITEM, GameBase.gi                            .soundindex("items/n_health.wav"), 1,                            Defines.ATTN_NORM, 0);                else if (ent.count == 25)                    GameBase.gi.sound(other, Defines.CHAN_ITEM, GameBase.gi                            .soundindex("items/l_health.wav"), 1,                            Defines.ATTN_NORM, 0);                else                    // (ent.count == 100)                    GameBase.gi.sound(other, Defines.CHAN_ITEM, GameBase.gi                            .soundindex("items/m_health.wav"), 1,                            Defines.ATTN_NORM, 0);            } else if (ent.item.pickup_sound != null) {                GameBase.gi.sound(other, Defines.CHAN_ITEM, GameBase.gi                        .soundindex(ent.item.pickup_sound), 1,                        Defines.ATTN_NORM, 0);            }        }            if (0 == (ent.spawnflags & Defines.ITEM_TARGETS_USED)) {            GameUtil.G_UseTargets(ent, other);            ent.spawnflags |= Defines.ITEM_TARGETS_USED;        }            if (!taken)            return;            if (!((GameBase.coop.value != 0) && (ent.item.flags & Defines.IT_STAY_COOP) != 0)                || 0 != (ent.spawnflags & (Defines.DROPPED_ITEM | Defines.DROPPED_PLAYER_ITEM))) {            if ((ent.flags & Defines.FL_RESPAWN) != 0)                ent.flags &= ~Defines.FL_RESPAWN;            else                GameUtil.G_FreeEdict(ent);        }    }}

⌨️ 快捷键说明

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