#ifndef BUFFS_H #define BUFFS_H // Welcome to the stuff behind the scenes // Below, you will find the list of buffs // Add new buffs here! // Note: Buffs also need spawnfuncs, which are set below #include "teams.qh" #include "util.qh" entity Buff_Type_first; entity Buff_Type_last; .entity enemy; // internal next pointer int BUFF_LAST = 1; int BUFF_ALL; .int items; // buff ID .string netname; // buff name .string message; // human readable name .vector colormod; // buff color .string model2; // buff sprite .int skin; // buff skin .float buff_time; // hacky function to return the cvar value only to server - TODO: do this properly! float sv_cvar(string cvarname) { #ifdef SVQC return cvar(cvarname); #else return 0; #endif } #define REGISTER_BUFF(hname,sname,NAME,bskin,bcolor) \ int BUFF_##NAME; \ entity Buff_Type##sname; \ void RegisterBuffs_##sname() \ { \ BUFF_##NAME = BUFF_LAST * 2; \ BUFF_LAST = BUFF_##NAME; \ BUFF_ALL |= BUFF_##NAME; \ Buff_Type##sname = spawn(); \ Buff_Type##sname.items = BUFF_##NAME; \ Buff_Type##sname.netname = #sname; \ Buff_Type##sname.message = hname; \ Buff_Type##sname.skin = bskin; \ Buff_Type##sname.colormod = bcolor; \ Buff_Type##sname.buff_time = sv_cvar(strcat("g_buffs_", #sname, "_time")); \ Buff_Type##sname.model2 = strzone(strcat("buff-", #sname)); \ if(!Buff_Type_first) \ Buff_Type_first = Buff_Type##sname; \ if(Buff_Type_last) \ Buff_Type_last.enemy = Buff_Type##sname; \ Buff_Type_last = Buff_Type##sname; \ } \ ACCUMULATE_FUNCTION(RegisterBuffs, RegisterBuffs_##sname) REGISTER_BUFF(_("Ammo"),ammo,AMMO,3,'0.76 1 0.1'); REGISTER_BUFF(_("Resistance"),resistance,RESISTANCE,0,'0.36 1 0.07'); REGISTER_BUFF(_("Speed"),speed,SPEED,9,'0.1 1 0.84'); REGISTER_BUFF(_("Medic"),medic,MEDIC,1,'1 0.12 0'); REGISTER_BUFF(_("Bash"),bash,BASH,5,'1 0.39 0'); REGISTER_BUFF(_("Vampire"),vampire,VAMPIRE,2,'1 0 0.24'); REGISTER_BUFF(_("Disability"),disability,DISABILITY,7,'0.94 0.3 1'); REGISTER_BUFF(_("Vengeance"),vengeance,VENGEANCE,15,'1 0.23 0.61'); REGISTER_BUFF(_("Jump"),jump,JUMP,10,'0.24 0.78 1'); REGISTER_BUFF(_("Flight"),flight,FLIGHT,11,'0.33 0.56 1'); REGISTER_BUFF(_("Invisible"),invisible,INVISIBLE,12,'0.5 0.5 1'); REGISTER_BUFF(_("Inferno"),inferno,INFERNO,16,'1 0.62 0'); REGISTER_BUFF(_("Swapper"),swapper,SWAPPER,17,'0.63 0.36 1'); REGISTER_BUFF(_("Magnet"),magnet,MAGNET,18,'1 0.95 0.18'); #undef REGISTER_BUFF #ifdef SVQC .int buffs; void buff_Init(entity ent); void buff_Init_Compat(entity ent, int replacement); #define BUFF_SPAWNFUNC(e,b,t) void spawnfunc_item_buff_##e() { self.buffs = b; self.team = t; buff_Init(self); } #define BUFF_SPAWNFUNC_Q3TA_COMPAT(o,r) void spawnfunc_item_##o() { buff_Init_Compat(self,r); } #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) BUFF_SPAWNFUNCS(resistance, BUFF_RESISTANCE) BUFF_SPAWNFUNCS(ammo, BUFF_AMMO) BUFF_SPAWNFUNCS(speed, BUFF_SPEED) BUFF_SPAWNFUNCS(medic, BUFF_MEDIC) BUFF_SPAWNFUNCS(bash, BUFF_BASH) BUFF_SPAWNFUNCS(vampire, BUFF_VAMPIRE) BUFF_SPAWNFUNCS(disability, BUFF_DISABILITY) BUFF_SPAWNFUNCS(vengeance, BUFF_VENGEANCE) BUFF_SPAWNFUNCS(jump, BUFF_JUMP) BUFF_SPAWNFUNCS(flight, BUFF_FLIGHT) BUFF_SPAWNFUNCS(invisible, BUFF_INVISIBLE) BUFF_SPAWNFUNCS(inferno, BUFF_INFERNO) BUFF_SPAWNFUNCS(swapper, BUFF_SWAPPER) BUFF_SPAWNFUNCS(magnet, BUFF_MAGNET) BUFF_SPAWNFUNCS(random, 0) BUFF_SPAWNFUNC_Q3TA_COMPAT(doubler, BUFF_MEDIC) BUFF_SPAWNFUNC_Q3TA_COMPAT(resistance, BUFF_RESISTANCE) BUFF_SPAWNFUNC_Q3TA_COMPAT(scout, BUFF_SPEED) BUFF_SPAWNFUNC_Q3TA_COMPAT(ammoregen, BUFF_AMMO) // actually Q3 BUFF_SPAWNFUNC_Q3TA_COMPAT(haste, BUFF_SPEED) BUFF_SPAWNFUNC_Q3TA_COMPAT(invis, BUFF_INVISIBLE) BUFF_SPAWNFUNC_Q3TA_COMPAT(medic, BUFF_MEDIC) #undef BUFF_SPAWNFUNC #undef BUFF_SPAWNFUNC_Q3TA_COMPAT #undef BUFF_SPAWNFUNCS #endif vector Buff_Color(int buff_id); string Buff_PrettyName(int buff_id); string Buff_Name(int buff_id); int Buff_Type_FromName(string buff_name); int Buff_Type_FromSprite(string buff_sprite); int Buff_Skin(int buff_id); string Buff_Sprite(int buff_id); float Buff_Timer(int buff_id); #endif