#pragma once #include #include #ifdef GAMEQC #include #include #endif #define REGISTER_BUFF(id, inst) REGISTER(StatusEffects, BUFF_##id, m_id, inst) #include CLASS(Buff, StatusEffect) #ifdef GAMEQC ATTRIB(Buff, m_itemid, int, IT_BUFF); #endif ATTRIB(Buff, netname, string, "buff"); ATTRIB(Buff, m_icon, string, "buff"); ATTRIB(Buff, m_color, vector, '1 1 1'); ATTRIB(Buff, m_name, string, _("Buff")); ATTRIB(Buff, m_skin, int, 0); ATTRIB(Buff, m_lifetime, float, 60); ATTRIB(Buff, m_sprite, string, ""); #ifndef SVQC METHOD(Buff, display, void(entity this, void(string name, string icon) returns)) { string img = sprintf("/gfx/hud/%s/%s", cvar_string("hud_skin"), this.m_icon); #ifdef CSQC if (precache_pic(img) == "") #endif #ifdef MENUQC if (draw_PreloadPicture(img) == "") #endif img = sprintf("/gfx/hud/default/%s", this.m_icon); returns(this.m_name, img); } #endif #ifdef SVQC METHOD(Buff, m_time, float(Buff this)) { return cvar(strcat("g_buffs_", this.netname, "_time")); } #endif ENDCLASS(Buff) STATIC_INIT(REGISTER_BUFFS) { FOREACH(StatusEffects, it.instanceOfBuff, { it.m_sprite = strzone(strcat("buff-", it.netname)); }); } #ifdef SVQC .entity buffdef; .int team_forced; void buff_Init(entity ent); void buff_Init_Compat(entity ent, entity replacement); #define BUFF_SPAWNFUNC(e, b, t) spawnfunc(item_buff_##e) { \ this.buffdef = b; \ if(teamplay) \ this.team_forced = t; \ buff_Init(this); \ } #define BUFF_SPAWNFUNCS(e, b) \ BUFF_SPAWNFUNC(e, b, 0) \ BUFF_SPAWNFUNC(e##_team1, b, NUM_TEAM_1) \ BUFF_SPAWNFUNC(e##_team2, b, NUM_TEAM_2) \ BUFF_SPAWNFUNC(e##_team3, b, NUM_TEAM_3) \ BUFF_SPAWNFUNC(e##_team4, b, NUM_TEAM_4) #define BUFF_SPAWNFUNC_Q3COMPAT(o, r) spawnfunc(o) { buff_Init_Compat(this, r); } #else #define BUFF_SPAWNFUNC(e, b, t) #define BUFF_SPAWNFUNCS(e, b) #define BUFF_SPAWNFUNC_Q3COMPAT(o, r) #endif string Buff_CompatName(string buffname); BUFF_SPAWNFUNCS(random, NULL) #ifdef GAMEQC REPLICATE_INIT(bool, cvar_cl_buffs_autoreplace); #endif