📄 gameitems.java
字号:
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 + -