#ifndef WEAPON_H
#define WEAPON_H
+#include "../items/item/pickup.qh"
.int ammo_shells;
.int ammo_nails;
ATTRIB(Weapon, bot_pickupbasevalue, float, 0);
/** M: color : waypointsprite color */
ATTRIB(Weapon, wpcolor, vector, '0 0 0');
- /** A: wpn-id : wpn- sprite name */
- ATTRIB(Weapon, wpmodel, string, "");
/** M: modelname : name of model (without g_ v_ or h_ prefixes) */
ATTRIB(Weapon, mdl, string, "");
/** M: model MDL_id_ITEM */
/** M: refname : reference name name */
ATTRIB(Weapon, netname, string, "");
/** M: wepname : human readable name */
- ATTRIB(Weapon, message, string, "AOL CD Thrower");
+ ATTRIB(Weapon, m_name, string, "AOL CD Thrower");
+
+ ATTRIB(Weapon, m_pickup, entity, NULL);
/** (SERVER) setup weapon data */
- METHOD(Weapon, wr_setup, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_setup, void(Weapon this)) {}
/** (SERVER) logic to run every frame */
- METHOD(Weapon, wr_think, bool(Weapon this, bool fire1, bool fire2)) {return false;}
+ METHOD(Weapon, wr_think, void(Weapon this, entity actor, bool fire1, bool fire2)) {}
/** (SERVER) checks ammo for weapon primary */
METHOD(Weapon, wr_checkammo1, bool(Weapon this)) {return false;}
/** (SERVER) checks ammo for weapon second */
METHOD(Weapon, wr_checkammo2, bool(Weapon this)) {return false;}
/** (SERVER) runs bot aiming code for this weapon */
- METHOD(Weapon, wr_aim, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_aim, void(Weapon this)) {}
/** (BOTH) precaches models/sounds used by this weapon, also sets up weapon properties */
- METHOD(Weapon, wr_init, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_init, void(Weapon this)) {}
/** (SERVER) notification number for suicide message (may inspect w_deathtype for details) */
- METHOD(Weapon, wr_suicidemessage, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_suicidemessage, int(Weapon this)) {return 0;}
/** (SERVER) notification number for kill message (may inspect w_deathtype for details) */
- METHOD(Weapon, wr_killmessage, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_killmessage, int(Weapon this)) {return 0;}
/** (SERVER) handles reloading for weapon */
- METHOD(Weapon, wr_reload, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_reload, void(Weapon this)) {}
/** (SERVER) clears fields that the weapon may use */
- METHOD(Weapon, wr_resetplayer, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_resetplayer, void(Weapon this)) {}
/** (CLIENT) impact effect for weapon explosion */
- METHOD(Weapon, wr_impacteffect, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_impacteffect, void(Weapon this)) {}
/** (SERVER) called whenever a player dies */
- METHOD(Weapon, wr_playerdeath, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_playerdeath, void(Weapon this)) {}
/** (SERVER) logic to run when weapon is lost */
- METHOD(Weapon, wr_gonethink, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_gonethink, void(Weapon this)) {}
/** (ALL) dump weapon cvars to config in data directory (see: sv_cmd dumpweapons) */
- METHOD(Weapon, wr_config, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_config, void(Weapon this)) {}
/** (CLIENT) weapon specific zoom reticle */
- METHOD(Weapon, wr_zoomreticle, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_zoomreticle, bool(Weapon this)) {
+ // no weapon specific image for this weapon
+ return false;
+ }
/** (SERVER) the weapon is dropped */
- METHOD(Weapon, wr_drop, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_drop, void(Weapon this)) {}
/** (SERVER) a weapon is picked up */
- METHOD(Weapon, wr_pickup, bool(Weapon this)) {return false;}
+ METHOD(Weapon, wr_pickup, void(Weapon this)) {}
METHOD(Weapon, display, void(entity this, void(string name, string icon) returns)) {
- returns(this.message, this.model2 ? sprintf("/gfx/hud/%s/%s", cvar_string("menu_skin"), this.model2) : string_null);
- }
-
- void register_weapon(entity this, int id, WepSet bit)
- {
- this.weapon = id;
- this.weapons = bit;
- this.wpmodel = strzone(strcat("wpn-", ftos(id)));
- #ifdef CSQC
- this.wr_init(this);
- #endif
+ returns(this.m_name, this.model2 ? sprintf("/gfx/hud/%s/%s", cvar_string("menu_skin"), this.model2) : string_null);
}
ENDCLASS(Weapon)
+#include "../items/all.qh"
+CLASS(WeaponPickup, Pickup)
+ ATTRIB(WeaponPickup, m_weapon, Weapon, NULL)
+ ATTRIB(WeaponPickup, m_name, string, string_null)
+#ifndef MENUQC
+ ATTRIB(WeaponPickup, m_sound, Sound, SND_WEAPONPICKUP)
+#endif
+#ifdef SVQC
+ ATTRIB(WeaponPickup, m_itemflags, int, FL_WEAPON)
+ float weapon_pickupevalfunc(entity player, entity item);
+ ATTRIB(WeaponPickup, m_pickupevalfunc, float(entity player, entity item), weapon_pickupevalfunc)
+#endif
+ CONSTRUCTOR(WeaponPickup, Weapon w) {
+ CONSTRUCT(WeaponPickup);
+ this.m_weapon = w;
+ this.m_name = w.m_name;
+#ifndef MENUQC
+ this.m_model = w.m_model;
+#endif
+#ifdef SVQC
+ this.m_botvalue = w.bot_pickupbasevalue;
+#endif
+ }
+#ifdef SVQC
+ METHOD(WeaponPickup, giveTo, bool(entity this, entity item, entity player))
+ {
+ bool b = Item_GiveTo(item, player);
+ if (b) {
+ LOG_TRACEF("entity %i picked up %s\n", player, this.m_name);
+ }
+ return b;
+ }
+#endif
+ENDCLASS(WeaponPickup)
+
CLASS(OffhandWeapon, Object)
METHOD(OffhandWeapon, offhand_think, void(OffhandWeapon this, entity player, bool key_pressed)) {}
ENDCLASS(OffhandWeapon)
// other useful macros
#define WEP_AMMO(wpn) (WEP_##wpn.ammo_field) // only used inside weapon files/with direct name, don't duplicate prefix
-#define WEP_NAME(wpn) ((get_weaponinfo(wpn)).message)
+#define WEP_NAME(wpn) ((get_weaponinfo(wpn)).m_name)
#endif