From: TimePath Date: Mon, 24 Aug 2015 03:18:30 +0000 (+1000) Subject: Backport icon handling from TimePath/guide X-Git-Tag: xonotic-v0.8.2~2043^2 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=51c7e0a875a0a15201f57787071a21d327d1bb26;p=xonotic%2Fxonotic-data.pk3dir.git Backport icon handling from TimePath/guide --- diff --git a/qcsrc/common/buffs.qh b/qcsrc/common/buffs.qh index ddf572281..e0bda4c67 100644 --- a/qcsrc/common/buffs.qh +++ b/qcsrc/common/buffs.qh @@ -33,6 +33,9 @@ CLASS(Buff, Pickup) 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")); } diff --git a/qcsrc/common/items/item.qh b/qcsrc/common/items/item.qh index 0b17f35b2..16db39728 100644 --- a/qcsrc/common/items/item.qh +++ b/qcsrc/common/items/item.qh @@ -5,8 +5,12 @@ /** 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) diff --git a/qcsrc/common/items/item/ammo.qc b/qcsrc/common/items/item/ammo.qc index faf2b26da..84c22cdcd 100644 --- a/qcsrc/common/items/item/ammo.qc +++ b/qcsrc/common/items/item/ammo.qc @@ -6,7 +6,7 @@ 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; @@ -15,7 +15,7 @@ REGISTER_ITEM(Bullets, Ammo) { 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; @@ -24,7 +24,7 @@ REGISTER_ITEM(Cells, Ammo) { 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; @@ -33,7 +33,7 @@ REGISTER_ITEM(Plasma, Ammo) { 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; @@ -42,7 +42,7 @@ REGISTER_ITEM(Rockets, Ammo) { 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; diff --git a/qcsrc/common/items/item/ammo.qh b/qcsrc/common/items/item/ammo.qh index 70c4ef1ef..84f20483e 100644 --- a/qcsrc/common/items/item/ammo.qh +++ b/qcsrc/common/items/item/ammo.qh @@ -2,7 +2,6 @@ #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)) diff --git a/qcsrc/common/items/item/armor.qc b/qcsrc/common/items/item/armor.qc index e5ade4f4b..a4fa60574 100644 --- a/qcsrc/common/items/item/armor.qc +++ b/qcsrc/common/items/item/armor.qc @@ -7,6 +7,7 @@ REGISTER_ITEM(ArmorSmall, Armor) { 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; @@ -19,6 +20,7 @@ REGISTER_ITEM(ArmorMedium, Armor) { 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; @@ -31,6 +33,7 @@ REGISTER_ITEM(ArmorLarge, 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; @@ -43,6 +46,7 @@ REGISTER_ITEM(ArmorMega, 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; diff --git a/qcsrc/common/items/item/health.qc b/qcsrc/common/items/item/health.qc index 4867273a6..dded21951 100644 --- a/qcsrc/common/items/item/health.qc +++ b/qcsrc/common/items/item/health.qc @@ -7,6 +7,7 @@ REGISTER_ITEM(HealthSmall, Health) { 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; @@ -19,6 +20,7 @@ REGISTER_ITEM(HealthMedium, Health) { 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; @@ -31,6 +33,7 @@ REGISTER_ITEM(HealthLarge, Health) { 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; @@ -43,6 +46,7 @@ REGISTER_ITEM(HealthMega, Health) { 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; diff --git a/qcsrc/common/items/item/jetpack.qc b/qcsrc/common/items/item/jetpack.qc index 25dd9b131..856704dd8 100644 --- a/qcsrc/common/items/item/jetpack.qc +++ b/qcsrc/common/items/item/jetpack.qc @@ -9,6 +9,7 @@ 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; @@ -19,7 +20,7 @@ REGISTER_ITEM(Jetpack, Powerup) { 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; @@ -29,6 +30,7 @@ REGISTER_ITEM(JetpackFuel, Ammo) { 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; diff --git a/qcsrc/common/items/item/powerup.qc b/qcsrc/common/items/item/powerup.qc index c4bfb3936..fe3258211 100644 --- a/qcsrc/common/items/item/powerup.qc +++ b/qcsrc/common/items/item/powerup.qc @@ -8,11 +8,13 @@ REGISTER_ITEM(Strength, 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; } diff --git a/qcsrc/common/mapinfo.qh b/qcsrc/common/mapinfo.qh index e9979379c..19799df74 100644 --- a/qcsrc/common/mapinfo.qh +++ b/qcsrc/common/mapinfo.qh @@ -19,6 +19,13 @@ CLASS(Gametype, Object) 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); @@ -28,7 +35,6 @@ CLASS(Gametype, Object) this.team = gteamplay; this.model2 = defaults; this.gametype_description = gdescription; - return this; } ENDCLASS(Gametype) diff --git a/qcsrc/common/mutators/base.qh b/qcsrc/common/mutators/base.qh index 83945528c..baa891c93 100644 --- a/qcsrc/common/mutators/base.qh +++ b/qcsrc/common/mutators/base.qh @@ -24,7 +24,6 @@ CLASS(Callback, Object) CONSTRUCTOR(Callback, bool() func) { CONSTRUCT(Callback); this.cbc_func = func; - return this; } ENDCLASS(Callback) @@ -40,7 +39,6 @@ CLASS(CallbackChain, Object) CONSTRUCT(CallbackNode); this.cbc = it; this.cbc_order = order; - return this; } ENDCLASS(CallbackNode) @@ -49,7 +47,6 @@ CLASS(CallbackChain, Object) CONSTRUCTOR(CallbackChain, string _name) { CONSTRUCT(CallbackChain); this.netname = _name; - return this; } bool CallbackChain_Add(CallbackChain this, Callback cb, int order) @@ -155,7 +152,6 @@ CLASS(Mutator, Object) CONSTRUCT(Mutator); this.mutatorname = _name; this.mutatorfunc = func; - return this; } ENDCLASS(Mutator) diff --git a/qcsrc/common/mutators/mutator/damagetext.qc b/qcsrc/common/mutators/mutator/damagetext.qc index aacfc730a..ef673d015 100644 --- a/qcsrc/common/mutators/mutator/damagetext.qc +++ b/qcsrc/common/mutators/mutator/damagetext.qc @@ -60,7 +60,6 @@ CLASS(DamageText, Object) CONSTRUCT(DamageText); this.m_group = _group; DamageText_update(this, _origin, _health, _armor); - return this; } ENDCLASS(DamageText) #endif diff --git a/qcsrc/common/nades.qh b/qcsrc/common/nades.qh index 01eb7fff2..50f2e57e8 100644 --- a/qcsrc/common/nades.qh +++ b/qcsrc/common/nades.qh @@ -33,9 +33,13 @@ REGISTER_REGISTRY(RegisterNades) 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); @@ -53,6 +57,7 @@ REGISTER_NADE(NORMAL) { 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"); @@ -60,6 +65,7 @@ REGISTER_NADE(NAPALM) { 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"); @@ -67,6 +73,7 @@ REGISTER_NADE(ICE) { 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"); @@ -74,6 +81,7 @@ REGISTER_NADE(TRANSLOCATE) { 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"); @@ -81,6 +89,7 @@ REGISTER_NADE(SPAWN) { 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"); @@ -88,6 +97,7 @@ REGISTER_NADE(HEAL) { 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"); diff --git a/qcsrc/common/oo.qh b/qcsrc/common/oo.qh index add63b0cd..3c7237ef4 100644 --- a/qcsrc/common/oo.qh +++ b/qcsrc/common/oo.qh @@ -47,13 +47,14 @@ entity __spawn(string _classname, string _sourceFile, int _sourceLine) { 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); \ @@ -111,11 +112,26 @@ ACCUMULATE_FUNCTION(__static_init, RegisterClasses) [[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 diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index 9f78f6454..3f0d6a097 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -291,12 +291,12 @@ string GetAmmoPicture(.int ammotype) { 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? } } diff --git a/qcsrc/common/weapons/all.qh b/qcsrc/common/weapons/all.qh index ac839a53a..3773765aa 100644 --- a/qcsrc/common/weapons/all.qh +++ b/qcsrc/common/weapons/all.qh @@ -183,6 +183,10 @@ CLASS(Weapon, Object) /** 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, @@ -213,7 +217,6 @@ CLASS(Weapon, Object) this.model2 = strzone(wepimg); this.netname = refname; this.message = wepname; - return this; } void register_weapon(entity this, int id, WepSet bit) { diff --git a/qcsrc/server/mutators/mutator_instagib_items.qc b/qcsrc/server/mutators/mutator_instagib_items.qc index cd72aee3b..1d806e679 100644 --- a/qcsrc/server/mutators/mutator_instagib_items.qc +++ b/qcsrc/server/mutators/mutator_instagib_items.qc @@ -9,24 +9,26 @@ GETTER(float, instagib_respawntime_ammo) 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 }