ATTRIB(Buff, m_prettyName, string, "Buff")
ATTRIB(Buff, m_skin, int, 0)
ATTRIB(Buff, m_sprite, string, "")
+ METHOD(Buff, display, void(entity this, void(string name, string icon) returns)) {
+ returns(this.m_prettyName, sprintf("/gfx/hud/%s/buff_%s", cvar_string("menu_skin"), this.m_name));
+ }
#ifdef SVQC
METHOD(Buff, m_time, float(entity));
float Buff_m_time(entity this) { return cvar(strcat("g_buffs_", this.netname, "_time")); }
/** If you register a new item, make sure to add it to all.inc */
CLASS(GameItem, Object)
ATTRIB(GameItem, m_id, int, 0)
- METHOD(GameItem, show, void(entity this));
- void GameItem_show(entity this) { print("A game item\n"); }
+ ATTRIB(GameItem, m_name, string, string_null)
+ ATTRIB(GameItem, m_icon, string, string_null)
+ METHOD(GameItem, display, void(entity this, void(string name, string icon) returns)) {
+ returns(this.m_name, this.m_icon ? sprintf("/gfx/hud/%s/%s", cvar_string("menu_skin"), this.m_icon) : string_null);
+ }
+ METHOD(GameItem, show, void(entity this)) { print("A game item\n"); }
void ITEM_HANDLE(Show, entity this) { this.show(this); }
ENDCLASS(GameItem)
REGISTER_ITEM(Bullets, Ammo) {
this.m_model = "models/items/a_bullets.mdl";
this.m_name = "bullets";
- this.m_ammoPic = "ammo_bullets";
+ this.m_icon = "ammo_bullets";
#ifdef SVQC
this.m_botvalue = 2000;
this.m_itemid = IT_NAILS;
REGISTER_ITEM(Cells, Ammo) {
this.m_model = "models/items/a_cells.md3";
this.m_name = "cells";
- this.m_ammoPic = "ammo_cells";
+ this.m_icon = "ammo_cells";
#ifdef SVQC
this.m_botvalue = 2000;
this.m_itemid = IT_CELLS;
REGISTER_ITEM(Plasma, Ammo) {
this.m_model = "models/items/a_cells.md3";
this.m_name = "plasma";
- this.m_ammoPic = "ammo_cells";
+ this.m_icon = "ammo_plasma";
#ifdef SVQC
this.m_botvalue = 2000;
this.m_itemid = IT_PLASMA;
REGISTER_ITEM(Rockets, Ammo) {
this.m_model = "models/items/a_rockets.md3";
this.m_name = "rockets";
- this.m_ammoPic = "ammo_rockets";
+ this.m_icon = "ammo_rockets";
#ifdef SVQC
this.m_botvalue = 3000;
this.m_itemid = IT_ROCKETS;
REGISTER_ITEM(Shells, Ammo) {
this.m_model = "models/items/a_shells.md3";
this.m_name = "shells";
- this.m_ammoPic = "ammo_shells";
+ this.m_icon = "ammo_shells";
#ifdef SVQC
this.m_botvalue = 500;
this.m_itemid = IT_SHELLS;
#define AMMO_H
#include "pickup.qh"
CLASS(Ammo, Pickup)
- ATTRIB(Ammo, m_ammoPic, string, string_null)
#ifdef SVQC
ATTRIB(Ammo, m_pickupevalfunc, float(entity player, entity item), commodity_pickupevalfunc)
ATTRIB(Ammo, m_respawntime, float(), GET(g_pickup_respawntime_ammo))
this.m_model = "models/items/item_armor_small.md3";
this.m_sound = "misc/armor1.wav";
this.m_name = "5 Armor";
+ this.m_icon = "armor";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_LOW;
this.m_itemid = IT_ARMOR_SHARD;
this.m_model = "models/items/item_armor_medium.md3";
this.m_sound = "misc/armor10.wav";
this.m_name = "25 Armor";
+ this.m_icon = "armor";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_MID;
this.m_itemid = IT_ARMOR;
this.m_model = "models/items/item_armor_big.md3";
this.m_sound = "misc/armor17_5.wav";
this.m_name = "50 Armor";
+ this.m_icon = "armor";
#ifdef SVQC
this.m_botvalue = 20000; // FIXME: higher than BOT_PICKUP_RATING_HIGH?
this.m_itemid = IT_ARMOR;
this.m_model = "models/items/item_armor_large.md3";
this.m_sound = "misc/armor25.wav";
this.m_name = "100 Armor";
+ this.m_icon = "item_large_armor";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_HIGH;
this.m_itemid = IT_ARMOR;
this.m_model = "models/items/g_h1.md3";
this.m_sound = "misc/minihealth.wav";
this.m_name = "5 Health";
+ this.m_icon = "health";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_LOW;
this.m_itemid = IT_5HP;
this.m_model = "models/items/g_h25.md3";
this.m_sound = "misc/mediumhealth.wav";
this.m_name = "25 Health";
+ this.m_icon = "health";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_MID;
this.m_itemid = IT_25HP;
this.m_model = "models/items/g_h50.md3";
this.m_sound = "misc/mediumhealth.wav";
this.m_name = "50 Health";
+ this.m_icon = "health";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_MID;
this.m_itemid = IT_25HP;
this.m_model = "models/items/g_h100.md3";
this.m_sound = "misc/megahealth.wav";
this.m_name = "100 Health";
+ this.m_icon = "item_mega_health";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_HIGH;
this.m_itemid = IT_HEALTH;
REGISTER_ITEM(Jetpack, Powerup) {
this.m_model = "models/items/g_jetpack.md3";
this.m_name = "Jet pack";
+ this.m_icon = "jetpack";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_LOW;
this.m_itemid = IT_JETPACK;
REGISTER_ITEM(JetpackFuel, Ammo) {
this.m_model = "models/items/g_fuel.md3";
this.m_name = "Fuel";
- this.m_ammoPic = "ammo_fuel";
+ this.m_icon = "ammo_fuel";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_LOW;
this.m_itemid = IT_FUEL;
REGISTER_ITEM(JetpackRegen, Pickup) {
this.m_model = "models/items/g_fuelregen.md3";
this.m_name = "Fuel regenerator";
+ this.m_icon = "fuelregen";
#ifdef SVQC
this.m_botvalue = BOT_PICKUP_RATING_LOW;
this.m_itemflags = FL_POWERUP;
this.m_model = "models/items/g_strength.md3";
this.m_sound = "misc/powerup.wav";
this.m_name = "Strength Powerup";
+ this.m_icon = "strength";
this.m_itemid = IT_STRENGTH;
}
REGISTER_ITEM(Shield, Powerup) {
this.m_model = "models/items/g_invincible.md3";
this.m_sound = "misc/powerup_shield.wav";
this.m_name = "Shield";
+ this.m_icon = "shield";
this.m_itemid = IT_INVINCIBLE;
}
ATTRIB(Gametype, model2, string, string_null)
/** game type description */
ATTRIB(Gametype, gametype_description, string, string_null)
+
+ METHOD(Gametype, describe, string(entity this)) { return this.gametype_description; }
+
+ METHOD(Gametype, display, void(entity this, void(string name, string icon) returns)) {
+ returns(this.message, strcat("gametype_", this.mdl));
+ }
+
CONSTRUCTOR(Gametype, string hname, string sname, string g_name, bool gteamplay, string defaults, string gdescription)
{
CONSTRUCT(Gametype);
this.team = gteamplay;
this.model2 = defaults;
this.gametype_description = gdescription;
- return this;
}
ENDCLASS(Gametype)
CONSTRUCTOR(Callback, bool() func) {
CONSTRUCT(Callback);
this.cbc_func = func;
- return this;
}
ENDCLASS(Callback)
CONSTRUCT(CallbackNode);
this.cbc = it;
this.cbc_order = order;
- return this;
}
ENDCLASS(CallbackNode)
CONSTRUCTOR(CallbackChain, string _name) {
CONSTRUCT(CallbackChain);
this.netname = _name;
- return this;
}
bool CallbackChain_Add(CallbackChain this, Callback cb, int order)
CONSTRUCT(Mutator);
this.mutatorname = _name;
this.mutatorfunc = func;
- return this;
}
ENDCLASS(Mutator)
CONSTRUCT(DamageText);
this.m_group = _group;
DamageText_update(this, _origin, _health, _armor);
- return this;
}
ENDCLASS(DamageText)
#endif
CLASS(Nade, Object)
ATTRIB(Nade, m_id, int, 0)
ATTRIB(Nade, m_color, vector, '0 0 0')
+ ATTRIB(Nade, m_name, string, _("Grenade"))
ATTRIB(Nade, m_icon, string, "nade_normal")
ATTRIBARRAY(Nade, m_projectile, int, 2)
ATTRIBARRAY(Nade, m_trail, string, 2)
+ METHOD(Nade, display, void(entity this, void(string name, string icon) returns)) {
+ returns(this.m_name, sprintf("/gfx/hud/%s/%s", cvar_string("menu_skin"), this.m_icon));
+ }
ENDCLASS(Nade)
REGISTER_NADE(NULL);
REGISTER_NADE(NAPALM) {
this.m_color = '2 0.5 0';
+ this.m_name = _("Napalm grenade");
this.m_icon = "nade_napalm";
NADE_PROJECTILE(0, PROJECTILE_NADE_NAPALM, "TR_ROCKET");
NADE_PROJECTILE(1, PROJECTILE_NADE_NAPALM_BURN, "spiderbot_rocket_thrust");
REGISTER_NADE(ICE) {
this.m_color = '0 0.5 2';
+ this.m_name = _("Ice grenade");
this.m_icon = "nade_ice";
NADE_PROJECTILE(0, PROJECTILE_NADE_ICE, "TR_NEXUIZPLASMA");
NADE_PROJECTILE(1, PROJECTILE_NADE_ICE_BURN, "wakizashi_rocket_thrust");
REGISTER_NADE(TRANSLOCATE) {
this.m_color = '1 0 1';
+ this.m_name = _("Translocate grenade");
this.m_icon = "nade_translocate";
NADE_PROJECTILE(0, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA");
NADE_PROJECTILE(1, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA");
REGISTER_NADE(SPAWN) {
this.m_color = '1 0.9 0';
+ this.m_name = _("Spawn grenade");
this.m_icon = "nade_spawn";
NADE_PROJECTILE(0, PROJECTILE_NADE_SPAWN, "nade_yellow");
NADE_PROJECTILE(1, PROJECTILE_NADE_SPAWN, "nade_yellow");
REGISTER_NADE(HEAL) {
this.m_color = '1 0 0';
+ this.m_name = _("Heal grenade");
this.m_icon = "nade_heal";
NADE_PROJECTILE(0, PROJECTILE_NADE_HEAL, "nade_red");
NADE_PROJECTILE(1, PROJECTILE_NADE_HEAL_BURN, "nade_red_burn");
REGISTER_NADE(MONSTER) {
this.m_color = '0.25 0.75 0';
+ this.m_name = _("Monster grenade");
this.m_icon = "nade_monster";
NADE_PROJECTILE(0, PROJECTILE_NADE_MONSTER, "nade_red");
NADE_PROJECTILE(1, PROJECTILE_NADE_MONSTER_BURN, "nade_red_burn");
OVERLOAD(spawn##cname, this, ##__VA_ARGS__)
#define CONSTRUCTOR(cname, ...) \
- cname OVERLOAD(spawn##cname, cname this, __VA_ARGS__)
+ cname OVERLOAD(spawn##cname, cname this, __VA_ARGS__) { return = this; } \
+ [[accumulate]] cname OVERLOAD(spawn##cname, cname this, __VA_ARGS__)
.string vtblname;
.entity vtblbase;
void RegisterClasses() { }
-ACCUMULATE_FUNCTION(__static_init, RegisterClasses)
+STATIC_INIT(RegisterClasses) { RegisterClasses(); }
#define VTBL(cname, base) \
INIT_STATIC(cname); \
[[last]] INIT(cname) { return this; }
#define SUPER(cname) (cname##_vtbl.vtblbase)
+#define super (this.vtblbase.vtblbase)
#define spawn_static(this)
#define spawn_1(this)
#define _vtbl NULL
-CLASS(Object, ); ENDCLASS(Object)
+CLASS(Object, );
+ METHOD(Object, describe, string(entity this)) {
+ string s = _("No description");
+ if (cvar("developer")) {
+ for (int i = 0, n = numentityfields(); i < n; ++i) {
+ string value = getentityfieldstring(i, this);
+ if (value != "") s = sprintf("%s\n%s = %s", s, entityfieldname(i), value);
+ }
+ }
+ return s;
+ }
+ METHOD(Object, display, void(entity this, void(string name, string icon) returns)) {
+ returns(sprintf("entity %i", this), "nopreview_map");
+ }
+ENDCLASS(Object)
#undef spawn_static
#undef spawn_1
#undef _vtbl
{
switch (ammotype)
{
- case ammo_shells: return ITEM_Shells.m_ammoPic;
- case ammo_nails: return ITEM_Bullets.m_ammoPic;
- case ammo_rockets: return ITEM_Rockets.m_ammoPic;
- case ammo_cells: return ITEM_Cells.m_ammoPic;
- case ammo_plasma: return ITEM_Plasma.m_ammoPic;
- case ammo_fuel: return ITEM_JetpackFuel.m_ammoPic;
+ case ammo_shells: return ITEM_Shells.m_icon;
+ case ammo_nails: return ITEM_Bullets.m_icon;
+ case ammo_rockets: return ITEM_Rockets.m_icon;
+ case ammo_cells: return ITEM_Cells.m_icon;
+ case ammo_plasma: return ITEM_Plasma.m_icon;
+ case ammo_fuel: return ITEM_JetpackFuel.m_icon;
default: return ""; // wtf, no ammo type?
}
}
/** M: wepname : human readable name */
ATTRIB(Weapon, message, string, "AOL CD Thrower");
+ 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);
+ }
+
CONSTRUCTOR(Weapon,
bool(int) function,
.int ammotype,
this.model2 = strzone(wepimg);
this.netname = refname;
this.message = wepname;
- return this;
}
void register_weapon(entity this, int id, WepSet bit)
{
GETTER(float, instagib_respawntimejitter_ammo)
REGISTER_ITEM(VaporizerCells, Ammo) {
- this.m_model = "models/items/a_cells.md3";
- this.m_sound = "misc/itempickup.wav";
- this.m_name = "Vaporizer Ammo";
+ this.m_model = "models/items/a_cells.md3";
+ this.m_sound = "misc/itempickup.wav";
+ this.m_name = "Vaporizer Ammo";
+ this.m_icon = "ammo_supercells";
#ifdef SVQC
- this.m_botvalue = 100;
- this.m_itemid = IT_CELLS;
- this.m_respawntime = GET(instagib_respawntime_ammo);
- this.m_respawntimejitter = GET(instagib_respawntimejitter_ammo);
+ this.m_botvalue = 100;
+ this.m_itemid = IT_CELLS;
+ this.m_respawntime = GET(instagib_respawntime_ammo);
+ this.m_respawntimejitter = GET(instagib_respawntimejitter_ammo);
#endif
}
REGISTER_ITEM(ExtraLife, Powerup) {
- this.m_model = "models/items/g_h100.md3";
- this.m_sound = "misc/megahealth.wav";
- this.m_name = "Extralife";
+ this.m_model = "models/items/g_h100.md3";
+ this.m_sound = "misc/megahealth.wav";
+ this.m_name = "Extralife";
+ this.m_icon = "item_mega_health";
#ifdef SVQC
- this.m_itemid = IT_NAILS;
- this.m_botvalue = BOT_PICKUP_RATING_HIGH;
+ this.m_itemid = IT_NAILS;
+ this.m_botvalue = BOT_PICKUP_RATING_HIGH;
#endif
}