-#include "../_all.qh"
-
#include "mutator.qh"
+REGISTER_MUTATOR(superspec, cvar("g_superspectate"));
+
#define _SSMAGIX "SUPERSPEC_OPTIONSFILE_V1"
#define _ISLOCAL ((edict_num(1) == self) ? true : false)
.string superspec_itemfilter; //"classname1 classname2 ..."
-float _spectate(entity _player)
-{
+bool superspec_Spectate(entity _player)
+{SELFPARAM();
if(Spectate(_player) == 1)
self.classname = "spectator";
}
void superspec_save_client_conf()
-{
+{SELFPARAM();
string fn = "superspec-local.options";
float fh;
fh = fopen(fn, FILE_WRITE);
if(fh < 0)
{
- dprint("^1ERROR: ^7 superspec can not open ", fn, " for writing.\n");
+ LOG_TRACE("^1ERROR: ^7 superspec can not open ", fn, " for writing.\n");
}
else
{
return false;
}
-MUTATOR_HOOKFUNCTION(superspec_ItemTouch)
-{
- entity _oldself = self;
+MUTATOR_HOOKFUNCTION(superspec, ItemTouch)
+{SELFPARAM();
entity _item = self;
- FOR_EACH_SPEC(self)
+ entity e;
+ FOR_EACH_SPEC(e)
{
+ setself(e);
if(self.superspec_flags & SSF_ITEMMSG)
if(superspec_filteritem(self, _item))
{
superspec_msg("", "", self, sprintf("Player %s^7 just picked up ^3%s\n^8(%s^8)\n", other.netname, _item.netname, _item.classname), 1);
if((self.autospec_flags & ASF_SSIM) && self.enemy != other)
{
- _spectate(other);
+ superspec_Spectate(other);
- self = _oldself;
+ setself(this);
return MUT_ITEMTOUCH_CONTINUE;
}
}
if((self.autospec_flags & ASF_SHIELD && _item.invincible_finished) ||
- (self.autospec_flags & ASF_STRENGTH && _item.strength_finished) ||
- (self.autospec_flags & ASF_MEGA_AR && _item.classname == "item_armor_large") ||
- (self.autospec_flags & ASF_MEGA_HP && _item.classname == "item_health_mega") ||
- (self.autospec_flags & ASF_FLAG_GRAB && _item.classname == "item_flag_team"))
+ (self.autospec_flags & ASF_STRENGTH && _item.strength_finished) ||
+ (self.autospec_flags & ASF_MEGA_AR && _item.itemdef == ITEM_ArmorMega) ||
+ (self.autospec_flags & ASF_MEGA_HP && _item.itemdef == ITEM_HealthMega) ||
+ (self.autospec_flags & ASF_FLAG_GRAB && _item.classname == "item_flag_team"))
{
if((self.enemy != other) || IS_OBSERVER(self))
if(self.autospec_flags & ASF_SHOWWHAT)
superspec_msg("", "", self, sprintf("^7Following %s^7 due to picking up %s\n", other.netname, _item.netname), 2);
- _spectate(other);
+ superspec_Spectate(other);
}
}
}
}
- self = _oldself;
+ setself(this);
return MUT_ITEMTOUCH_CONTINUE;
}
-MUTATOR_HOOKFUNCTION(superspec_SV_ParseClientCommand)
-{
+MUTATOR_HOOKFUNCTION(superspec, SV_ParseClientCommand)
+{SELFPARAM();
#define OPTIONINFO(flag,var,test,text,long,short) \
var = strcat(var, ((flag & test) ? "^2[ON] ^7" : "^1[OFF] ^7")); \
var = strcat(var, text," ^7(^3 ", long, "^7 | ^3", short, " ^7)\n")
FOR_EACH_PLAYER(_player)
{
if(_player.strength_finished > time || _player.invincible_finished > time)
- return _spectate(_player);
+ return superspec_Spectate(_player);
}
superspec_msg("", "", self, "No active powerup\n", 1);
FOR_EACH_PLAYER(_player)
{
if(_player.strength_finished > time)
- return _spectate(_player);
+ return superspec_Spectate(_player);
}
superspec_msg("", "", self, "No active Strength\n", 1);
FOR_EACH_PLAYER(_player)
{
if(_player.invincible_finished > time)
- return _spectate(_player);
+ return superspec_Spectate(_player);
}
superspec_msg("", "", self, "No active Shield\n", 1);
return true;
}
- if(cmd_name == "followfc")
- {
- if(!g_ctf)
- return true;
-
- entity _player;
- float _team = 0;
- float found = false;
-
- if(cmd_argc == 2)
- {
- if(argv(1) == "red")
- _team = NUM_TEAM_1;
- else
- _team = NUM_TEAM_2;
- }
-
- FOR_EACH_PLAYER(_player)
- {
- if(_player.flagcarried && (_player.team == _team || _team == 0))
- {
- found = true;
- if(_team == 0 && IS_SPEC(self) && self.enemy == _player)
- continue; // already spectating a fc, try to find the other fc
- return _spectate(_player);
- }
- }
-
- if(!found)
- superspec_msg("", "", self, "No active flag carrier\n", 1);
- return true;
- }
-
return false;
#undef OPTIONINFO
}
-MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsString)
+MUTATOR_HOOKFUNCTION(superspec, BuildMutatorsString)
{
ret_string = strcat(ret_string, ":SS");
return 0;
}
-MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsPrettyString)
+MUTATOR_HOOKFUNCTION(superspec, BuildMutatorsPrettyString)
{
ret_string = strcat(ret_string, ", Super Spectators");
return 0;
}
void superspec_hello()
-{
+{SELFPARAM();
if(self.enemy.crypto_idfp == "")
Send_Notification(NOTIF_ONE_ONLY, self.enemy, MSG_INFO, INFO_SUPERSPEC_MISSING_UID);
remove(self);
}
-MUTATOR_HOOKFUNCTION(superspec_ClientConnect)
-{
+MUTATOR_HOOKFUNCTION(superspec, ClientConnect)
+{SELFPARAM();
if(!IS_REAL_CLIENT(self))
return false;
fh = fopen(fn, FILE_READ);
if(fh < 0)
{
- dprint("^1ERROR: ^7 superspec can not open ", fn, " for reading.\n");
+ LOG_TRACE("^1ERROR: ^7 superspec can not open ", fn, " for reading.\n");
}
else
{
string _magic = fgets(fh);
if(_magic != _SSMAGIX)
{
- dprint("^1ERROR^7 While reading superspec options file: unknown magic\n");
+ LOG_TRACE("^1ERROR^7 While reading superspec options file: unknown magic\n");
}
else
{
return false;
}
-MUTATOR_HOOKFUNCTION(superspec_PlayerDies)
-{
- entity _old_self = self;
-
- FOR_EACH_SPEC(self)
+MUTATOR_HOOKFUNCTION(superspec, PlayerDies)
+{SELFPARAM();
+ entity e;
+ FOR_EACH_SPEC(e)
{
- if(self.autospec_flags & ASF_FOLLOWKILLER && IS_PLAYER(frag_attacker) && self.enemy == _old_self)
+ setself(e);
+ if(self.autospec_flags & ASF_FOLLOWKILLER && IS_PLAYER(frag_attacker) && self.enemy == this)
{
if(self.autospec_flags & ASF_SHOWWHAT)
superspec_msg("", "", self, sprintf("^7Following %s^7 due to followkiller\n", frag_attacker.netname), 2);
- _spectate(frag_attacker);
+ superspec_Spectate(frag_attacker);
}
}
- self = _old_self;
+ setself(this);
return false;
}
-MUTATOR_HOOKFUNCTION(superspec_ClientDisconnect)
+MUTATOR_HOOKFUNCTION(superspec, ClientDisconnect)
{
superspec_save_client_conf();
return false;
}
-
-MUTATOR_DEFINITION(mutator_superspec)
-{
-
- MUTATOR_HOOK(BuildMutatorsString, superspec_BuildMutatorsString, CBC_ORDER_ANY);
- MUTATOR_HOOK(BuildMutatorsPrettyString, superspec_BuildMutatorsPrettyString, CBC_ORDER_ANY);
- MUTATOR_HOOK(SV_ParseClientCommand, superspec_SV_ParseClientCommand, CBC_ORDER_ANY);
- MUTATOR_HOOK(ItemTouch, superspec_ItemTouch, CBC_ORDER_ANY);
- MUTATOR_HOOK(ClientConnect, superspec_ClientConnect, CBC_ORDER_ANY);
- MUTATOR_HOOK(ClientDisconnect, superspec_ClientDisconnect, CBC_ORDER_ANY);
- MUTATOR_HOOK(PlayerDies, superspec_PlayerDies, CBC_ORDER_ANY);
-
- return 0;
-}