📄 gameitems.java
字号:
//v = Lib.tv(15, 15, 15); //Math3D.VectorCopy(v, ent.maxs); ent.maxs[0] = ent.maxs[1] = ent.maxs[2] = 15; if (ent.model != null) GameBase.gi.setmodel(ent, ent.model); else GameBase.gi.setmodel(ent, ent.item.world_model); ent.solid = Defines.SOLID_TRIGGER; ent.movetype = Defines.MOVETYPE_TOSS; ent.touch = Touch_Item; float v[] = { 0, 0, -128 }; Math3D.VectorAdd(ent.s.origin, v, dest); tr = GameBase.gi.trace(ent.s.origin, ent.mins, ent.maxs, dest, ent, Defines.MASK_SOLID); if (tr.startsolid) { GameBase.gi.dprintf("droptofloor: " + ent.classname + " startsolid at " + Lib.vtos(ent.s.origin) + "\n"); GameUtil.G_FreeEdict(ent); return true; } Math3D.VectorCopy(tr.endpos, ent.s.origin); if (ent.team != null) { ent.flags &= ~Defines.FL_TEAMSLAVE; ent.chain = ent.teamchain; ent.teamchain = null; ent.svflags |= Defines.SVF_NOCLIENT; ent.solid = Defines.SOLID_NOT; if (ent == ent.teammaster) { ent.nextthink = GameBase.level.time + Defines.FRAMETIME; ent.think = DoRespawn; } } if ((ent.spawnflags & Defines.ITEM_NO_TOUCH) != 0) { ent.solid = Defines.SOLID_BBOX; ent.touch = null; ent.s.effects &= ~Defines.EF_ROTATE; ent.s.renderfx &= ~Defines.RF_GLOW; } if ((ent.spawnflags & Defines.ITEM_TRIGGER_SPAWN) != 0) { ent.svflags |= Defines.SVF_NOCLIENT; ent.solid = Defines.SOLID_NOT; ent.use = Use_Item; } GameBase.gi.linkentity(ent); return true; } }; public static ItemUseAdapter Use_PowerArmor = new ItemUseAdapter() { public String getID() { return "use_powerarmor";} public void use(edict_t ent, gitem_t item) { int index; if ((ent.flags & Defines.FL_POWER_ARMOR) != 0) { ent.flags &= ~Defines.FL_POWER_ARMOR; GameBase.gi .sound(ent, Defines.CHAN_AUTO, GameBase.gi .soundindex("misc/power2.wav"), 1, Defines.ATTN_NORM, 0); } else { index = ITEM_INDEX(FindItem("cells")); if (0 == ent.client.pers.inventory[index]) { GameBase.gi.cprintf(ent, Defines.PRINT_HIGH, "No cells for power armor.\n"); return; } ent.flags |= Defines.FL_POWER_ARMOR; GameBase.gi .sound(ent, Defines.CHAN_AUTO, GameBase.gi .soundindex("misc/power1.wav"), 1, Defines.ATTN_NORM, 0); } } }; public static EntUseAdapter Use_Item = new EntUseAdapter() { public String getID() { return "use_item";} public void use(edict_t ent, edict_t other, edict_t activator) { ent.svflags &= ~Defines.SVF_NOCLIENT; ent.use = null; if ((ent.spawnflags & Defines.ITEM_NO_TOUCH) != 0) { ent.solid = Defines.SOLID_BBOX; ent.touch = null; } else { ent.solid = Defines.SOLID_TRIGGER; ent.touch = Touch_Item; } GameBase.gi.linkentity(ent); } }; /* * =============== GetItemByIndex =============== */ public static gitem_t GetItemByIndex(int index) { if (index == 0 || index >= GameBase.game.num_items) return null; return GameItemList.itemlist[index]; } /* * =============== FindItemByClassname * * =============== */ static gitem_t FindItemByClassname(String classname) { for (int i = 1; i < GameBase.game.num_items; i++) { gitem_t it = GameItemList.itemlist[i]; if (it.classname == null) continue; if (it.classname.equalsIgnoreCase(classname)) return it; } return null; } /* * =============== FindItem =============== */ //geht. static gitem_t FindItem(String pickup_name) { for (int i = 1; i < GameBase.game.num_items; i++) { gitem_t it = GameItemList.itemlist[i]; if (it.pickup_name == null) continue; if (it.pickup_name.equalsIgnoreCase(pickup_name)) return it; } Com.Println("Item not found:" + pickup_name); return null; } static void SetRespawn(edict_t ent, float delay) { ent.flags |= Defines.FL_RESPAWN; ent.svflags |= Defines.SVF_NOCLIENT; ent.solid = Defines.SOLID_NOT; ent.nextthink = GameBase.level.time + delay; ent.think = DoRespawn; GameBase.gi.linkentity(ent); } static int ITEM_INDEX(gitem_t item) { return item.index; } static edict_t Drop_Item(edict_t ent, gitem_t item) { edict_t dropped; float[] forward = { 0, 0, 0 }; float[] right = { 0, 0, 0 }; float[] offset = { 0, 0, 0 }; dropped = GameUtil.G_Spawn(); dropped.classname = item.classname; dropped.item = item; dropped.spawnflags = Defines.DROPPED_ITEM; dropped.s.effects = item.world_model_flags; dropped.s.renderfx = Defines.RF_GLOW; Math3D.VectorSet(dropped.mins, -15, -15, -15); Math3D.VectorSet(dropped.maxs, 15, 15, 15); GameBase.gi.setmodel(dropped, dropped.item.world_model); dropped.solid = Defines.SOLID_TRIGGER; dropped.movetype = Defines.MOVETYPE_TOSS; dropped.touch = drop_temp_touch; dropped.owner = ent; if (ent.client != null) { trace_t trace; Math3D.AngleVectors(ent.client.v_angle, forward, right, null); Math3D.VectorSet(offset, 24, 0, -16); Math3D.G_ProjectSource(ent.s.origin, offset, forward, right, dropped.s.origin); trace = GameBase.gi.trace(ent.s.origin, dropped.mins, dropped.maxs, dropped.s.origin, ent, Defines.CONTENTS_SOLID); Math3D.VectorCopy(trace.endpos, dropped.s.origin); } else { Math3D.AngleVectors(ent.s.angles, forward, right, null); Math3D.VectorCopy(ent.s.origin, dropped.s.origin); } Math3D.VectorScale(forward, 100, dropped.velocity); dropped.velocity[2] = 300; dropped.think = drop_make_touchable; dropped.nextthink = GameBase.level.time + 1; GameBase.gi.linkentity(dropped); return dropped; } static void Use_Item(edict_t ent, edict_t other, edict_t activator) { ent.svflags &= ~Defines.SVF_NOCLIENT; ent.use = null; if ((ent.spawnflags & Defines.ITEM_NO_TOUCH) != 0) { ent.solid = Defines.SOLID_BBOX; ent.touch = null; } else { ent.solid = Defines.SOLID_TRIGGER; ent.touch = Touch_Item; } GameBase.gi.linkentity(ent); } static int PowerArmorType(edict_t ent) { if (ent.client == null) return Defines.POWER_ARMOR_NONE; if (0 == (ent.flags & Defines.FL_POWER_ARMOR)) return Defines.POWER_ARMOR_NONE; if (ent.client.pers.inventory[power_shield_index] > 0) return Defines.POWER_ARMOR_SHIELD; if (ent.client.pers.inventory[power_screen_index] > 0) return Defines.POWER_ARMOR_SCREEN; return Defines.POWER_ARMOR_NONE; } static int ArmorIndex(edict_t ent) { if (ent.client == null) return 0; if (ent.client.pers.inventory[jacket_armor_index] > 0) return jacket_armor_index; if (ent.client.pers.inventory[combat_armor_index] > 0) return combat_armor_index; if (ent.client.pers.inventory[body_armor_index] > 0) return body_armor_index; return 0; } public static boolean Pickup_PowerArmor(edict_t ent, edict_t other) { int quantity; quantity = other.client.pers.inventory[ITEM_INDEX(ent.item)]; other.client.pers.inventory[ITEM_INDEX(ent.item)]++; if (GameBase.deathmatch.value != 0) { if (0 == (ent.spawnflags & Defines.DROPPED_ITEM)) SetRespawn(ent, ent.item.quantity); // auto-use for DM only if we didn't already have one if (0 == quantity) ent.item.use.use(other, ent.item); } return true; } public static boolean Add_Ammo(edict_t ent, gitem_t item, int count) { int index; int max; if (null == ent.client) return false; if (item.tag == Defines.AMMO_BULLETS) max = ent.client.pers.max_bullets; else if (item.tag == Defines.AMMO_SHELLS) max = ent.client.pers.max_shells; else if (item.tag == Defines.AMMO_ROCKETS) max = ent.client.pers.max_rockets; else if (item.tag == Defines.AMMO_GRENADES) max = ent.client.pers.max_grenades; else if (item.tag == Defines.AMMO_CELLS) max = ent.client.pers.max_cells; else if (item.tag == Defines.AMMO_SLUGS) max = ent.client.pers.max_slugs; else return false; index = ITEM_INDEX(item); if (ent.client.pers.inventory[index] == max) return false; ent.client.pers.inventory[index] += count; if (ent.client.pers.inventory[index] > max) ent.client.pers.inventory[index] = max; return true; } public static void InitItems() { GameBase.game.num_items = GameItemList.itemlist.length - 1; } /* * =============== SetItemNames * * Called by worldspawn =============== */ public static void SetItemNames() { int i; gitem_t it; for (i = 1; i < GameBase.game.num_items; i++) { it = GameItemList.itemlist[i]; GameBase.gi.configstring(Defines.CS_ITEMS + i, it.pickup_name); } jacket_armor_index = ITEM_INDEX(FindItem("Jacket Armor")); combat_armor_index = ITEM_INDEX(FindItem("Combat Armor")); body_armor_index = ITEM_INDEX(FindItem("Body Armor")); power_screen_index = ITEM_INDEX(FindItem("Power Screen")); power_shield_index = ITEM_INDEX(FindItem("Power Shield")); } public static void SelectNextItem(edict_t ent, int itflags) { gclient_t cl; int i, index; gitem_t it; cl = ent.client;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -