diff options
Diffstat (limited to 'src/jake2/game/GameItems.java')
-rw-r--r-- | src/jake2/game/GameItems.java | 2055 |
1 files changed, 2055 insertions, 0 deletions
diff --git a/src/jake2/game/GameItems.java b/src/jake2/game/GameItems.java new file mode 100644 index 0000000..c72a9f5 --- /dev/null +++ b/src/jake2/game/GameItems.java @@ -0,0 +1,2055 @@ +/* +Copyright (C) 1997-2001 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of 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 of +MERCHANTABILITY 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 License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +// Created on 16.11.2005 by RST. +// $Id: GameItems.java,v 1.1 2005-11-16 22:24:53 salomo Exp $ + +package jake2.game; + + +import java.util.StringTokenizer; + +import jake2.*; +import jake2.client.*; +import jake2.game.*; +import jake2.qcommon.*; +import jake2.render.*; +import jake2.server.*; +import jake2.util.Lib; +import jake2.util.Math3D; + + +public class GameItems { + + public static gitem_t itemlist[] = { + //leave index 0 alone + new gitem_t(null, null, null, null, null, null, null, 0, null, + null, null, 0, 0, null, 0, 0, null, 0, null), + + // + // ARMOR + // + new gitem_t( + /* + * QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + + "item_armor_body", GameItems.Pickup_Armor, null, null, null, + "misc/ar1_pkup.wav", "models/items/armor/body/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "i_bodyarmor", + /* pickup */ + "Body Armor", + /* width */ + 3, 0, null, Defines.IT_ARMOR, 0, GameItems.bodyarmor_info, + Defines.ARMOR_BODY, + /* precache */ + ""), + + /* + * QUAKED item_armor_combat (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_armor_combat", GameItems.Pickup_Armor, null, null, null, + "misc/ar1_pkup.wav", "models/items/armor/combat/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "i_combatarmor", + /* pickup */ + "Combat Armor", + /* width */ + 3, 0, null, Defines.IT_ARMOR, 0, GameItems.combatarmor_info, + Defines.ARMOR_COMBAT, + /* precache */ + ""), + + /* + * QUAKED item_armor_jacket (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_armor_jacket", GameItems.Pickup_Armor, null, null, null, + "misc/ar1_pkup.wav", "models/items/armor/jacket/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "i_jacketarmor", + /* pickup */ + "Jacket Armor", + /* width */ + 3, 0, null, Defines.IT_ARMOR, 0, GameItems.jacketarmor_info, + Defines.ARMOR_JACKET, + /* precache */ + ""), + + /* + * QUAKED item_armor_shard (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_armor_shard", GameItems.Pickup_Armor, null, null, null, + "misc/ar2_pkup.wav", "models/items/armor/shard/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "i_jacketarmor", + /* pickup */ + "Armor Shard", + /* width */ + 3, 0, null, Defines.IT_ARMOR, 0, null, Defines.ARMOR_SHARD, + /* precache */ + ""), + + /* + * QUAKED item_power_screen (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_power_screen", GameItems.Pickup_PowerArmor, GameItems.Use_PowerArmor, + GameItems.Drop_PowerArmor, null, "misc/ar3_pkup.wav", + "models/items/armor/screen/tris.md2", Defines.EF_ROTATE, + null, + /* icon */ + "i_powerscreen", + /* pickup */ + "Power Screen", + /* width */ + 0, 60, null, Defines.IT_ARMOR, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED item_power_shield (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_power_shield", GameItems.Pickup_PowerArmor, GameItems.Use_PowerArmor, + GameItems.Drop_PowerArmor, null, "misc/ar3_pkup.wav", + "models/items/armor/shield/tris.md2", Defines.EF_ROTATE, + null, + /* icon */ + "i_powershield", + /* pickup */ + "Power Shield", + /* width */ + 0, 60, null, Defines.IT_ARMOR, 0, null, 0, + /* precache */ + "misc/power2.wav misc/power1.wav"), + + // + // WEAPONS + // + + /* + * weapon_blaster (.3 .3 1) (-16 -16 -16) (16 16 16) always owned, + * never in the world + */ + new gitem_t("weapon_blaster", null, PlayerWeapon.Use_Weapon, null, + PlayerWeapon.Weapon_Blaster, "misc/w_pkup.wav", null, 0, + "models/weapons/v_blast/tris.md2", + /* icon */ + "w_blaster", + /* pickup */ + "Blaster", 0, 0, null, Defines.IT_WEAPON + | Defines.IT_STAY_COOP, Defines.WEAP_BLASTER, null, + 0, + /* precache */ + "weapons/blastf1a.wav misc/lasfly.wav"), + + /* + * QUAKED weapon_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("weapon_shotgun", PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_Shotgun, "misc/w_pkup.wav", + "models/weapons/g_shotg/tris.md2", Defines.EF_ROTATE, + "models/weapons/v_shotg/tris.md2", + /* icon */ + "w_shotgun", + /* pickup */ + "Shotgun", 0, 1, "Shells", Defines.IT_WEAPON + | Defines.IT_STAY_COOP, Defines.WEAP_SHOTGUN, null, + 0, + /* precache */ + "weapons/shotgf1b.wav weapons/shotgr1b.wav"), + + /* + * QUAKED weapon_supershotgun (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("weapon_supershotgun", PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_SuperShotgun, "misc/w_pkup.wav", + "models/weapons/g_shotg2/tris.md2", Defines.EF_ROTATE, + "models/weapons/v_shotg2/tris.md2", + /* icon */ + "w_sshotgun", + /* pickup */ + "Super Shotgun", 0, 2, "Shells", Defines.IT_WEAPON + | Defines.IT_STAY_COOP, Defines.WEAP_SUPERSHOTGUN, + null, 0, + /* precache */ + "weapons/sshotf1b.wav"), + + /* + * QUAKED weapon_machinegun (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t( + "weapon_machinegun", + PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, + PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_Machinegun, + "misc/w_pkup.wav", + "models/weapons/g_machn/tris.md2", + Defines.EF_ROTATE, + "models/weapons/v_machn/tris.md2", + /* icon */ + "w_machinegun", + /* pickup */ + "Machinegun", + 0, + 1, + "Bullets", + Defines.IT_WEAPON | Defines.IT_STAY_COOP, + Defines.WEAP_MACHINEGUN, + null, + 0, + /* precache */ + "weapons/machgf1b.wav weapons/machgf2b.wav weapons/machgf3b.wav weapons/machgf4b.wav weapons/machgf5b.wav"), + + /* + * QUAKED weapon_chaingun (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t( + "weapon_chaingun", + PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, + PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_Chaingun, + "misc/w_pkup.wav", + "models/weapons/g_chain/tris.md2", + Defines.EF_ROTATE, + "models/weapons/v_chain/tris.md2", + /* icon */ + "w_chaingun", + /* pickup */ + "Chaingun", + 0, + 1, + "Bullets", + Defines.IT_WEAPON | Defines.IT_STAY_COOP, + Defines.WEAP_CHAINGUN, + null, + 0, + /* precache */ + "weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav` weapons/chngnd1a.wav"), + + /* + * QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t( + "ammo_grenades", + GameItems.Pickup_Ammo, + PlayerWeapon.Use_Weapon, + GameItems.Drop_Ammo, + PlayerWeapon.Weapon_Grenade, + "misc/am_pkup.wav", + "models/items/ammo/grenades/medium/tris.md2", + 0, + "models/weapons/v_handgr/tris.md2", + /* icon */ + "a_grenades", + /* pickup */ + "Grenades", + /* width */ + 3, + 5, + "grenades", + Defines.IT_AMMO | Defines.IT_WEAPON, + Defines.WEAP_GRENADES, + null, + Defines.AMMO_GRENADES, + /* precache */ + "weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav "), + + /* + * QUAKED weapon_grenadelauncher (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t( + "weapon_grenadelauncher", + PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, + PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_GrenadeLauncher, + "misc/w_pkup.wav", + "models/weapons/g_launch/tris.md2", + Defines.EF_ROTATE, + "models/weapons/v_launch/tris.md2", + /* icon */ + "w_glauncher", + /* pickup */ + "Grenade Launcher", + 0, + 1, + "Grenades", + Defines.IT_WEAPON | Defines.IT_STAY_COOP, + Defines.WEAP_GRENADELAUNCHER, + null, + 0, + /* precache */ + "models/objects/grenade/tris.md2 weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav"), + + /* + * QUAKED weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t( + "weapon_rocketlauncher", + PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, + PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_RocketLauncher, + "misc/w_pkup.wav", + "models/weapons/g_rocket/tris.md2", + Defines.EF_ROTATE, + "models/weapons/v_rocket/tris.md2", + /* icon */ + "w_rlauncher", + /* pickup */ + "Rocket Launcher", + 0, + 1, + "Rockets", + Defines.IT_WEAPON | Defines.IT_STAY_COOP, + Defines.WEAP_ROCKETLAUNCHER, + null, + 0, + /* precache */ + "models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2"), + + /* + * QUAKED weapon_hyperblaster (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t( + "weapon_hyperblaster", + PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, + PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_HyperBlaster, + "misc/w_pkup.wav", + "models/weapons/g_hyperb/tris.md2", + Defines.EF_ROTATE, + "models/weapons/v_hyperb/tris.md2", + /* icon */ + "w_hyperblaster", + /* pickup */ + "HyperBlaster", + 0, + 1, + "Cells", + Defines.IT_WEAPON | Defines.IT_STAY_COOP, + Defines.WEAP_HYPERBLASTER, + null, + 0, + /* precache */ + "weapons/hyprbu1a.wav weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav"), + + /* + * QUAKED weapon_railgun (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("weapon_railgun", PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_Railgun, "misc/w_pkup.wav", + "models/weapons/g_rail/tris.md2", Defines.EF_ROTATE, + "models/weapons/v_rail/tris.md2", + /* icon */ + "w_railgun", + /* pickup */ + "Railgun", 0, 1, "Slugs", Defines.IT_WEAPON + | Defines.IT_STAY_COOP, Defines.WEAP_RAILGUN, null, + 0, + /* precache */ + "weapons/rg_hum.wav"), + + /* + * QUAKED weapon_bfg (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t( + "weapon_bfg", + PlayerWeapon.Pickup_Weapon, + PlayerWeapon.Use_Weapon, + PlayerWeapon.Drop_Weapon, + PlayerWeapon.Weapon_BFG, + "misc/w_pkup.wav", + "models/weapons/g_bfg/tris.md2", + Defines.EF_ROTATE, + "models/weapons/v_bfg/tris.md2", + /* icon */ + "w_bfg", + /* pickup */ + "BFG10K", + 0, + 50, + "Cells", + Defines.IT_WEAPON | Defines.IT_STAY_COOP, + Defines.WEAP_BFG, + null, + 0, + /* precache */ + "sprites/s_bfg1.sp2 sprites/s_bfg2.sp2 sprites/s_bfg3.sp2 weapons/bfg__f1y.wav weapons/bfg__l1a.wav weapons/bfg__x1b.wav weapons/bfg_hum.wav"), + + // + // AMMO ITEMS + // + + /* + * QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("ammo_shells", GameItems.Pickup_Ammo, null, GameItems.Drop_Ammo, null, + "misc/am_pkup.wav", + "models/items/ammo/shells/medium/tris.md2", 0, null, + /* icon */ + "a_shells", + /* pickup */ + "Shells", + /* width */ + 3, 10, null, Defines.IT_AMMO, 0, null, Defines.AMMO_SHELLS, + /* precache */ + ""), + + /* + * QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("ammo_bullets", GameItems.Pickup_Ammo, null, GameItems.Drop_Ammo, null, + "misc/am_pkup.wav", + "models/items/ammo/bullets/medium/tris.md2", 0, null, + /* icon */ + "a_bullets", + /* pickup */ + "Bullets", + /* width */ + 3, 50, null, Defines.IT_AMMO, 0, null, + Defines.AMMO_BULLETS, + /* precache */ + ""), + + /* + * QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("ammo_cells", GameItems.Pickup_Ammo, null, GameItems.Drop_Ammo, null, + "misc/am_pkup.wav", + "models/items/ammo/cells/medium/tris.md2", 0, null, + /* icon */ + "a_cells", + /* pickup */ + "Cells", + /* width */ + 3, 50, null, Defines.IT_AMMO, 0, null, Defines.AMMO_CELLS, + /* precache */ + ""), + + /* + * QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("ammo_rockets", GameItems.Pickup_Ammo, null, GameItems.Drop_Ammo, null, + "misc/am_pkup.wav", + "models/items/ammo/rockets/medium/tris.md2", 0, null, + /* icon */ + "a_rockets", + /* pickup */ + "Rockets", + /* width */ + 3, 5, null, Defines.IT_AMMO, 0, null, Defines.AMMO_ROCKETS, + /* precache */ + ""), + + /* + * QUAKED ammo_slugs (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("ammo_slugs", GameItems.Pickup_Ammo, null, GameItems.Drop_Ammo, null, + "misc/am_pkup.wav", + "models/items/ammo/slugs/medium/tris.md2", 0, null, + /* icon */ + "a_slugs", + /* pickup */ + "Slugs", + /* width */ + 3, 10, null, Defines.IT_AMMO, 0, null, Defines.AMMO_SLUGS, + /* precache */ + ""), + + // + // POWERUP ITEMS + // + /* + * QUAKED item_quad (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_quad", GameItems.Pickup_Powerup, GameItems.Use_Quad, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/quaddama/tris.md2", Defines.EF_ROTATE, null, + /* icon */ + "p_quad", + /* pickup */ + "Quad Damage", + /* width */ + 2, 60, null, Defines.IT_POWERUP, 0, null, 0, + /* precache */ + "items/damage.wav items/damage2.wav items/damage3.wav"), + + /* + * QUAKED item_invulnerability (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_invulnerability", GameItems.Pickup_Powerup, + GameItems.Use_Invulnerability, GameItems.Drop_General, null, + "items/pkup.wav", "models/items/invulner/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "p_invulnerability", + /* pickup */ + "Invulnerability", + /* width */ + 2, 300, null, Defines.IT_POWERUP, 0, null, 0, + /* precache */ + "items/protect.wav items/protect2.wav items/protect4.wav"), + + /* + * QUAKED item_silencer (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_silencer", GameItems.Pickup_Powerup, GameItems.Use_Silencer, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/silencer/tris.md2", Defines.EF_ROTATE, null, + /* icon */ + "p_silencer", + /* pickup */ + "Silencer", + /* width */ + 2, 60, null, Defines.IT_POWERUP, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED item_breather (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_breather", GameItems.Pickup_Powerup, GameItems.Use_Breather, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/breather/tris.md2", Defines.EF_ROTATE, null, + /* icon */ + "p_rebreather", + /* pickup */ + "Rebreather", + /* width */ + 2, 60, null, Defines.IT_STAY_COOP | Defines.IT_POWERUP, 0, + null, 0, + /* precache */ + "items/airout.wav"), + + /* + * QUAKED item_enviro (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_enviro", GameItems.Pickup_Powerup, GameItems.Use_Envirosuit, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/enviro/tris.md2", Defines.EF_ROTATE, null, + /* icon */ + "p_envirosuit", + /* pickup */ + "Environment Suit", + /* width */ + 2, 60, null, Defines.IT_STAY_COOP | Defines.IT_POWERUP, 0, + null, 0, + /* precache */ + "items/airout.wav"), + + /* + * QUAKED item_ancient_head (.3 .3 1) (-16 -16 -16) (16 16 16) + * Special item that gives +2 to maximum health + */ + new gitem_t("item_ancient_head", GameItems.Pickup_AncientHead, null, null, + null, "items/pkup.wav", "models/items/c_head/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "i_fixme", + /* pickup */ + "Ancient Head", + /* width */ + 2, 60, null, 0, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED item_adrenaline (.3 .3 1) (-16 -16 -16) (16 16 16) gives + * +1 to maximum health + */ + new gitem_t("item_adrenaline", GameItems.Pickup_Adrenaline, null, null, null, + "items/pkup.wav", "models/items/adrenal/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "p_adrenaline", + /* pickup */ + "Adrenaline", + /* width */ + 2, 60, null, 0, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED item_bandolier (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_bandolier", GameItems.Pickup_Bandolier, null, null, null, + "items/pkup.wav", "models/items/band/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "p_bandolier", + /* pickup */ + "Bandolier", + /* width */ + 2, 60, null, 0, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED item_pack (.3 .3 1) (-16 -16 -16) (16 16 16) + */ + new gitem_t("item_pack", GameItems.Pickup_Pack, null, null, null, + "items/pkup.wav", "models/items/pack/tris.md2", + Defines.EF_ROTATE, null, + /* icon */ + "i_pack", + /* pickup */ + "Ammo Pack", + /* width */ + 2, 180, null, 0, 0, null, 0, + /* precache */ + ""), + + // + // KEYS + // + /* + * QUAKED key_data_cd (0 .5 .8) (-16 -16 -16) (16 16 16) key for + * computer centers + */ + new gitem_t("key_data_cd", GameItems.Pickup_Key, null, GameItems.Drop_General, + null, "items/pkup.wav", + "models/items/keys/data_cd/tris.md2", Defines.EF_ROTATE, + null, "k_datacd", "Data CD", 2, 0, null, + Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED key_power_cube (0 .5 .8) (-16 -16 -16) (16 16 16) + * TRIGGER_SPAWN NO_TOUCH warehouse circuits + */ + new gitem_t("key_power_cube", GameItems.Pickup_Key, null, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/keys/power/tris.md2", Defines.EF_ROTATE, + null, "k_powercube", "Power Cube", 2, 0, null, + Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED key_pyramid (0 .5 .8) (-16 -16 -16) (16 16 16) key for the + * entrance of jail3 + */ + new gitem_t("key_pyramid", GameItems.Pickup_Key, null, GameItems.Drop_General, + null, "items/pkup.wav", + "models/items/keys/pyramid/tris.md2", Defines.EF_ROTATE, + null, "k_pyramid", "Pyramid Key", 2, 0, null, + Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED key_data_spinner (0 .5 .8) (-16 -16 -16) (16 16 16) key + * for the city computer + */ + new gitem_t("key_data_spinner", GameItems.Pickup_Key, null, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/keys/spinner/tris.md2", Defines.EF_ROTATE, + null, "k_dataspin", "Data Spinner", 2, 0, null, + Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED key_pass (0 .5 .8) (-16 -16 -16) (16 16 16) security pass + * for the security level + */ + new gitem_t("key_pass", GameItems.Pickup_Key, null, GameItems.Drop_General, + null, "items/pkup.wav", "models/items/keys/pass/tris.md2", + Defines.EF_ROTATE, null, "k_security", "Security Pass", 2, + 0, null, Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED key_blue_key (0 .5 .8) (-16 -16 -16) (16 16 16) normal + * door key - blue + */ + new gitem_t("key_blue_key", GameItems.Pickup_Key, null, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/keys/key/tris.md2", Defines.EF_ROTATE, null, + "k_bluekey", "Blue Key", 2, 0, null, Defines.IT_STAY_COOP + | Defines.IT_KEY, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED key_red_key (0 .5 .8) (-16 -16 -16) (16 16 16) normal door + * key - red + */ + new gitem_t("key_red_key", GameItems.Pickup_Key, null, GameItems.Drop_General, + null, "items/pkup.wav", + "models/items/keys/red_key/tris.md2", Defines.EF_ROTATE, + null, "k_redkey", "Red Key", 2, 0, null, + Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, 0, + /* precache */ + ""), + + /* + * QUAKED key_commander_head (0 .5 .8) (-16 -16 -16) (16 16 16) tank + * commander's head + */ + new gitem_t("key_commander_head", GameItems.Pickup_Key, null, + GameItems.Drop_General, null, "items/pkup.wav", + "models/monsters/commandr/head/tris.md2", Defines.EF_GIB, + null, + /* icon */ + "k_comhead", + /* pickup */ + "Commander's Head", + /* width */ + 2, 0, null, Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, + 0, + /* precache */ + ""), + + /* + * QUAKED key_airstrike_target (0 .5 .8) (-16 -16 -16) (16 16 16) + * tank commander's head + */ + new gitem_t("key_airstrike_target", GameItems.Pickup_Key, null, + GameItems.Drop_General, null, "items/pkup.wav", + "models/items/keys/target/tris.md2", Defines.EF_ROTATE, + null, + /* icon */ + "i_airstrike", + /* pickup */ + "Airstrike Marker", + /* width */ + 2, 0, null, Defines.IT_STAY_COOP | Defines.IT_KEY, 0, null, + 0, + /* precache */ + ""), + new gitem_t(null, GameItems.Pickup_Health, null, null, null, + "items/pkup.wav", null, 0, null, + /* icon */ + "i_health", + /* pickup */ + "Health", + /* width */ + 3, 0, null, 0, 0, null, 0, + /* precache */ + "items/s_health.wav items/n_health.wav items/l_health.wav items/m_health.wav"), + + // end of list marker + null }; + public static gitem_armor_t jacketarmor_info = new gitem_armor_t(25, 50, + .30f, .00f, Defines.ARMOR_JACKET); + public static gitem_armor_t combatarmor_info = new gitem_armor_t(50, 100, + .60f, .30f, Defines.ARMOR_COMBAT); + public static gitem_armor_t bodyarmor_info = new gitem_armor_t(100, 200, + .80f, .60f, Defines.ARMOR_BODY); + static int quad_drop_timeout_hack = 0; + static int jacket_armor_index; + static int combat_armor_index; + static int body_armor_index; + static int power_screen_index; + static int power_shield_index; + static EntThinkAdapter DoRespawn = new EntThinkAdapter() { + public boolean think(edict_t ent) { + if (ent.team != null) { + edict_t master; + int count; + int choice = 0; + + master = ent.teammaster; + + // count the depth + for (count = 0, ent = master; ent != null; ent = ent.chain, count++) + ; + + choice = Lib.rand() % count; + + for (count = 0, ent = master; count < choice; ent = ent.chain, count++) + ; + } + + ent.svflags &= ~Defines.SVF_NOCLIENT; + ent.solid = Defines.SOLID_TRIGGER; + GameBase.gi.linkentity(ent); + + // send an effect + ent.s.event = Defines.EV_ITEM_RESPAWN; + + return false; + } + }; + static EntInteractAdapter Pickup_Pack = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + + gitem_t item; + int index; + + if (other.client.pers.max_bullets < 300) + other.client.pers.max_bullets = 300; + if (other.client.pers.max_shells < 200) + other.client.pers.max_shells = 200; + if (other.client.pers.max_rockets < 100) + other.client.pers.max_rockets = 100; + if (other.client.pers.max_grenades < 100) + other.client.pers.max_grenades = 100; + if (other.client.pers.max_cells < 300) + other.client.pers.max_cells = 300; + if (other.client.pers.max_slugs < 100) + other.client.pers.max_slugs = 100; + + item = FindItem("Bullets"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_bullets) + other.client.pers.inventory[index] = other.client.pers.max_bullets; + } + + item = FindItem("Shells"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_shells) + other.client.pers.inventory[index] = other.client.pers.max_shells; + } + + item = FindItem("Cells"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_cells) + other.client.pers.inventory[index] = other.client.pers.max_cells; + } + + item = FindItem("Grenades"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_grenades) + other.client.pers.inventory[index] = other.client.pers.max_grenades; + } + + item = FindItem("Rockets"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_rockets) + other.client.pers.inventory[index] = other.client.pers.max_rockets; + } + + item = FindItem("Slugs"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_slugs) + other.client.pers.inventory[index] = other.client.pers.max_slugs; + } + + if (0 == (ent.spawnflags & Defines.DROPPED_ITEM) + && (GameBase.deathmatch.value != 0)) + SetRespawn(ent, ent.item.quantity); + + return true; + } + }; + final static EntInteractAdapter Pickup_Health = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + + if (0 == (ent.style & Defines.HEALTH_IGNORE_MAX)) + if (other.health >= other.max_health) + return false; + + other.health += ent.count; + + if (0 == (ent.style & Defines.HEALTH_IGNORE_MAX)) { + if (other.health > other.max_health) + other.health = other.max_health; + } + + if (0 != (ent.style & Defines.HEALTH_TIMED)) { + ent.think = GameUtil.MegaHealth_think; + ent.nextthink = GameBase.level.time + 5f; + ent.owner = other; + ent.flags |= Defines.FL_RESPAWN; + ent.svflags |= Defines.SVF_NOCLIENT; + ent.solid = Defines.SOLID_NOT; + } else { + if (!((ent.spawnflags & Defines.DROPPED_ITEM) != 0) + && (GameBase.deathmatch.value != 0)) + SetRespawn(ent, 30); + } + + return true; + } + + }; + static EntTouchAdapter Touch_Item = new EntTouchAdapter() { + public void touch(edict_t ent, edict_t other, cplane_t plane, + csurface_t surf) { + boolean taken; + + if (ent.classname.equals("item_breather")) + taken = false; + + if (other.client == 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; + + Com.dprintln("Picked up:" + ent.classname); + + 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); + } + } + }; + static EntTouchAdapter drop_temp_touch = new EntTouchAdapter() { + public void touch(edict_t ent, edict_t other, cplane_t plane, + csurface_t surf) { + if (other == ent.owner) + return; + + Touch_Item.touch(ent, other, plane, surf); + } + }; + static EntThinkAdapter drop_make_touchable = new EntThinkAdapter() { + public boolean think(edict_t ent) { + ent.touch = Touch_Item; + if (GameBase.deathmatch.value != 0) { + ent.nextthink = GameBase.level.time + 29; + ent.think = GameUtil.G_FreeEdictA; + } + return false; + } + }; + static ItemUseAdapter Use_Quad = new ItemUseAdapter() { + + public void use(edict_t ent, gitem_t item) { + int timeout; + + ent.client.pers.inventory[ITEM_INDEX(item)]--; + GameUtil.ValidateSelectedItem(ent); + + if (quad_drop_timeout_hack != 0) { + timeout = quad_drop_timeout_hack; + quad_drop_timeout_hack = 0; + } else { + timeout = 300; + } + + if (ent.client.quad_framenum > GameBase.level.framenum) + ent.client.quad_framenum += timeout; + else + ent.client.quad_framenum = GameBase.level.framenum + timeout; + + GameBase.gi.sound(ent, Defines.CHAN_ITEM, GameBase.gi + .soundindex("items/damage.wav"), 1, Defines.ATTN_NORM, 0); + } + }; + static ItemUseAdapter Use_Invulnerability = new ItemUseAdapter() { + public void use(edict_t ent, gitem_t item) { + ent.client.pers.inventory[ITEM_INDEX(item)]--; + GameUtil.ValidateSelectedItem(ent); + + if (ent.client.invincible_framenum > GameBase.level.framenum) + ent.client.invincible_framenum += 300; + else + ent.client.invincible_framenum = GameBase.level.framenum + 300; + + GameBase.gi.sound(ent, Defines.CHAN_ITEM, GameBase.gi + .soundindex("items/protect.wav"), 1, Defines.ATTN_NORM, 0); + } + }; + static ItemUseAdapter Use_Breather = new ItemUseAdapter() { + public void use(edict_t ent, gitem_t item) { + ent.client.pers.inventory[ITEM_INDEX(item)]--; + + GameUtil.ValidateSelectedItem(ent); + + if (ent.client.breather_framenum > GameBase.level.framenum) + ent.client.breather_framenum += 300; + else + ent.client.breather_framenum = GameBase.level.framenum + 300; + + GameBase.gi.sound(ent, Defines.CHAN_ITEM, GameBase.gi + .soundindex("items/damage.wav"), 1, Defines.ATTN_NORM, 0); + } + }; + static ItemUseAdapter Use_Envirosuit = new ItemUseAdapter() { + public void use(edict_t ent, gitem_t item) { + ent.client.pers.inventory[ITEM_INDEX(item)]--; + GameUtil.ValidateSelectedItem(ent); + + if (ent.client.enviro_framenum > GameBase.level.framenum) + ent.client.enviro_framenum += 300; + else + ent.client.enviro_framenum = GameBase.level.framenum + 300; + + GameBase.gi.sound(ent, Defines.CHAN_ITEM, GameBase.gi + .soundindex("items/damage.wav"), 1, Defines.ATTN_NORM, 0); + } + }; + static ItemUseAdapter Use_Silencer = new ItemUseAdapter() { + public void use(edict_t ent, gitem_t item) { + + ent.client.pers.inventory[ITEM_INDEX(item)]--; + GameUtil.ValidateSelectedItem(ent); + ent.client.silencer_shots += 30; + + GameBase.gi.sound(ent, Defines.CHAN_ITEM, GameBase.gi + .soundindex("items/damage.wav"), 1, Defines.ATTN_NORM, 0); + } + }; + static EntInteractAdapter Pickup_Key = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + if (GameBase.coop.value != 0) { + if (Lib.strcmp(ent.classname, "key_power_cube") == 0) { + if ((other.client.pers.power_cubes & ((ent.spawnflags & 0x0000ff00) >> 8)) != 0) + return false; + other.client.pers.inventory[ITEM_INDEX(ent.item)]++; + other.client.pers.power_cubes |= ((ent.spawnflags & 0x0000ff00) >> 8); + } else { + if (other.client.pers.inventory[ITEM_INDEX(ent.item)] != 0) + return false; + other.client.pers.inventory[ITEM_INDEX(ent.item)] = 1; + } + return true; + } + other.client.pers.inventory[ITEM_INDEX(ent.item)]++; + return true; + } + }; + public static EntInteractAdapter Pickup_Ammo = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + int oldcount; + int count; + boolean weapon; + + weapon = (ent.item.flags & Defines.IT_WEAPON) != 0; + if ((weapon) + && ((int) GameBase.dmflags.value & Defines.DF_INFINITE_AMMO) != 0) + count = 1000; + else if (ent.count != 0) + count = ent.count; + else + count = ent.item.quantity; + + oldcount = other.client.pers.inventory[ITEM_INDEX(ent.item)]; + + if (!Add_Ammo(other, ent.item, count)) + return false; + + if (weapon && 0 == oldcount) { + if (other.client.pers.weapon != ent.item + && (0 == GameBase.deathmatch.value || other.client.pers.weapon == FindItem("blaster"))) + other.client.newweapon = ent.item; + } + + if (0 == (ent.spawnflags & (Defines.DROPPED_ITEM | Defines.DROPPED_PLAYER_ITEM)) + && (GameBase.deathmatch.value != 0)) + SetRespawn(ent, 30); + return true; + } + }; + public static EntInteractAdapter Pickup_Armor = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + int old_armor_index; + gitem_armor_t oldinfo; + gitem_armor_t newinfo; + int newcount; + float salvage; + int salvagecount; + + // get info on new armor + newinfo = (gitem_armor_t) ent.item.info; + + old_armor_index = ArmorIndex(other); + + // handle armor shards specially + if (ent.item.tag == Defines.ARMOR_SHARD) { + if (0 == old_armor_index) + other.client.pers.inventory[jacket_armor_index] = 2; + else + other.client.pers.inventory[old_armor_index] += 2; + } + + // if player has no armor, just use it + else if (0 == old_armor_index) { + other.client.pers.inventory[ITEM_INDEX(ent.item)] = newinfo.base_count; + } + + // use the better armor + else { + // get info on old armor + if (old_armor_index == jacket_armor_index) + oldinfo = jacketarmor_info; + + else if (old_armor_index == combat_armor_index) + oldinfo = combatarmor_info; + + else + // (old_armor_index == body_armor_index) + oldinfo = bodyarmor_info; + + if (newinfo.normal_protection > oldinfo.normal_protection) { + // calc new armor values + salvage = oldinfo.normal_protection + / newinfo.normal_protection; + salvagecount = (int) salvage + * other.client.pers.inventory[old_armor_index]; + newcount = newinfo.base_count + salvagecount; + if (newcount > newinfo.max_count) + newcount = newinfo.max_count; + + // zero count of old armor so it goes away + other.client.pers.inventory[old_armor_index] = 0; + + // change armor to new item with computed value + other.client.pers.inventory[ITEM_INDEX(ent.item)] = newcount; + } else { + // calc new armor values + salvage = newinfo.normal_protection + / oldinfo.normal_protection; + salvagecount = (int) salvage * newinfo.base_count; + newcount = other.client.pers.inventory[old_armor_index] + + salvagecount; + if (newcount > oldinfo.max_count) + newcount = oldinfo.max_count; + + // if we're already maxed out then we don't need the new + // armor + if (other.client.pers.inventory[old_armor_index] >= newcount) + return false; + + // update current armor value + other.client.pers.inventory[old_armor_index] = newcount; + } + } + + if (0 == (ent.spawnflags & Defines.DROPPED_ITEM) + && (GameBase.deathmatch.value != 0)) + SetRespawn(ent, 20); + + return true; + } + }; + public static EntInteractAdapter Pickup_PowerArmor = new EntInteractAdapter() { + public boolean interact(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 EntInteractAdapter Pickup_Powerup = new EntInteractAdapter() { + + public boolean interact(edict_t ent, edict_t other) { + int quantity; + + quantity = other.client.pers.inventory[ITEM_INDEX(ent.item)]; + if ((GameBase.skill.value == 1 && quantity >= 2) + || (GameBase.skill.value >= 2 && quantity >= 1)) + return false; + + if ((GameBase.coop.value != 0) + && (ent.item.flags & Defines.IT_STAY_COOP) != 0 + && (quantity > 0)) + return false; + + 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); + if (((int) GameBase.dmflags.value & Defines.DF_INSTANT_ITEMS) != 0 + || ((ent.item.use == Use_Quad) && 0 != (ent.spawnflags & Defines.DROPPED_PLAYER_ITEM))) { + if ((ent.item.use == Use_Quad) + && 0 != (ent.spawnflags & Defines.DROPPED_PLAYER_ITEM)) + quad_drop_timeout_hack = (int) ((ent.nextthink - GameBase.level.time) / Defines.FRAMETIME); + + ent.item.use.use(other, ent.item); + } + } + + return true; + } + }; + public static EntInteractAdapter Pickup_Adrenaline = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + if (GameBase.deathmatch.value == 0) + other.max_health += 1; + + if (other.health < other.max_health) + other.health = other.max_health; + + if (0 == (ent.spawnflags & Defines.DROPPED_ITEM) + && (GameBase.deathmatch.value != 0)) + SetRespawn(ent, ent.item.quantity); + + return true; + + } + }; + public static EntInteractAdapter Pickup_AncientHead = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + other.max_health += 2; + + if (0 == (ent.spawnflags & Defines.DROPPED_ITEM) + && (GameBase.deathmatch.value != 0)) + SetRespawn(ent, ent.item.quantity); + + return true; + } + }; + public static EntInteractAdapter Pickup_Bandolier = new EntInteractAdapter() { + public boolean interact(edict_t ent, edict_t other) { + gitem_t item; + int index; + + if (other.client.pers.max_bullets < 250) + other.client.pers.max_bullets = 250; + if (other.client.pers.max_shells < 150) + other.client.pers.max_shells = 150; + if (other.client.pers.max_cells < 250) + other.client.pers.max_cells = 250; + if (other.client.pers.max_slugs < 75) + other.client.pers.max_slugs = 75; + + item = FindItem("Bullets"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_bullets) + other.client.pers.inventory[index] = other.client.pers.max_bullets; + } + + item = FindItem("Shells"); + if (item != null) { + index = ITEM_INDEX(item); + other.client.pers.inventory[index] += item.quantity; + if (other.client.pers.inventory[index] > other.client.pers.max_shells) + other.client.pers.inventory[index] = other.client.pers.max_shells; + } + + if (0 == (ent.spawnflags & Defines.DROPPED_ITEM) + && (GameBase.deathmatch.value != 0)) + SetRespawn(ent, ent.item.quantity); + + return true; + + } + }; + public static ItemDropAdapter Drop_Ammo = new ItemDropAdapter() { + public void drop(edict_t ent, gitem_t item) { + edict_t dropped; + int index; + + index = ITEM_INDEX(item); + dropped = Drop_Item(ent, item); + if (ent.client.pers.inventory[index] >= item.quantity) + dropped.count = item.quantity; + else + dropped.count = ent.client.pers.inventory[index]; + + if (ent.client.pers.weapon != null + && ent.client.pers.weapon.tag == Defines.AMMO_GRENADES + && item.tag == Defines.AMMO_GRENADES + && ent.client.pers.inventory[index] - dropped.count <= 0) { + GameBase.gi.cprintf(ent, Defines.PRINT_HIGH, + "Can't drop current weapon\n"); + GameUtil.G_FreeEdict(dropped); + return; + } + + ent.client.pers.inventory[index] -= dropped.count; + Cmd.ValidateSelectedItem(ent); + } + }; + public static ItemDropAdapter Drop_General = new ItemDropAdapter() { + public void drop(edict_t ent, gitem_t item) { + Drop_Item(ent, item); + ent.client.pers.inventory[ITEM_INDEX(item)]--; + Cmd.ValidateSelectedItem(ent); + } + }; + public static ItemDropAdapter Drop_PowerArmor = new ItemDropAdapter() { + public void drop(edict_t ent, gitem_t item) { + if (0 != (ent.flags & Defines.FL_POWER_ARMOR) + && (ent.client.pers.inventory[ITEM_INDEX(item)] == 1)) + Use_PowerArmor.use(ent, item); + Drop_General.drop(ent, item); + } + }; + public static EntThinkAdapter droptofloor = new EntThinkAdapter() { + public boolean think(edict_t ent) { + trace_t tr; + float[] dest = { 0, 0, 0 }; + + //float v[]; + + //v = Lib.tv(-15, -15, -15); + //Math3D.VectorCopy(v, ent.mins); + ent.mins[0] = ent.mins[1] = ent.mins[2] = -15; + //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 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 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 itemlist[index]; + } + + /* + * =============== FindItemByClassname + * + * =============== + */ + static gitem_t FindItemByClassname(String classname) { + + for (int i = 1; i < GameBase.game.num_items; i++) { + gitem_t it = 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 = 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 = 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 = 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; + + 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 = 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 = 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; + + if (other.client == 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); + } + } + +} |