+#include "../../common/command/command.qh"
+#include "vote.qh"
+#include "../_all.qh"
+
+#include "common.qh"
+
+#include "../g_damage.qh"
+#include "../g_world.qh"
+#include "../race.qh"
+#include "../round_handler.qh"
+#include "../scores.qh"
+
+#include "../mutators/mutators_include.qh"
+
+#include "../../common/constants.qh"
+#include "../../common/mapinfo.qh"
+#include "../../common/notifications.qh"
+#include "../../common/playerstats.qh"
+#include "../../common/util.qh"
+
// =============================================
// Server side voting code, reworked by Samual
// Last updated: December 27th, 2011
// =============================================
// Nagger for players to know status of voting
-float Nagger_SendEntity(entity to, float sendflags)
+bool Nagger_SendEntity(entity this, entity to, float sendflags)
{
- float nags, i, f, b;
+ int nags, i, f, b;
entity e;
WriteByte(MSG_ENTITY, ENT_CLIENT_NAGGER);
}
}
- return TRUE;
+ return true;
}
void Nagger_Init()
{
- Net_LinkEntity(nagger = spawn(), FALSE, 0, Nagger_SendEntity);
+ Net_LinkEntity(nagger = spawn(), false, 0, Nagger_SendEntity);
}
void Nagger_VoteChanged()
nagger.SendFlags |= 1;
}
+// If the vote_caller is still here, return their name, otherwise vote_caller_name
+string OriginalCallerName()
+{
+ if (IS_REAL_CLIENT(vote_caller))
+ return vote_caller.netname;
+ return vote_caller_name;
+}
// =======================
// Game logic for voting
{
strunzone(vote_called_command);
strunzone(vote_called_display);
+ strunzone(vote_caller_name);
}
vote_called = VOTE_NULL;
vote_caller = world;
+ vote_caller_name = string_null;
vote_endtime = 0;
vote_called_command = string_null;
void VoteStop(entity stopper)
{
- bprint("\{1}^2* ^3", GetCallerName(stopper), "^2 stopped ^3", GetCallerName(vote_caller), "^2's vote\n");
+ bprint("\{1}^2* ^3", GetCallerName(stopper), "^2 stopped ^3", OriginalCallerName(), "^2's vote\n");
if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vstop:", ftos(stopper.playerid))); }
// Don't force them to wait for next vote, this way they can e.g. correct their vote.
void VoteAccept()
{
- bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ^1", vote_called_display, "^2 was accepted\n");
+ bprint("\{1}^2* ^3", OriginalCallerName(), "^2's vote for ^1", vote_called_display, "^2 was accepted\n");
if((vote_called == VOTE_MASTER) && vote_caller)
vote_caller.vote_master = 1;
void VoteReject()
{
- bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ", vote_called_display, "^2 was rejected\n");
+ bprint("\{1}^2* ^3", OriginalCallerName(), "^2's vote for ", vote_called_display, "^2 was rejected\n");
VoteReset();
Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_FAIL);
}
void VoteTimeout()
{
- bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ", vote_called_display, "^2 timed out\n");
+ bprint("\{1}^2* ^3", OriginalCallerName(), "^2's vote for ", vote_called_display, "^2 timed out\n");
VoteReset();
Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_FAIL);
}
switch(tmp_player.vote_selection)
{
case VOTE_SELECT_REJECT: { ++vote_reject_count; { if(IS_PLAYER(tmp_player)) ++vote_real_reject_count; } break; }
- case VOTE_SELECT_ACCEPT: { ++vote_accept_count; { if(IS_PLAYER(tmp_player)) ++vote_real_reject_count; } break; }
+ case VOTE_SELECT_ACCEPT: { ++vote_accept_count; { if(IS_PLAYER(tmp_player)) ++vote_real_accept_count; } break; }
case VOTE_SELECT_ABSTAIN: { ++vote_abstain_count; { if(IS_PLAYER(tmp_player)) ++vote_real_abstain_count; } break; }
default: break;
}
if(vote_endtime > 0) // a vote was called
if(time > vote_endtime) // time is up
{
- VoteCount(FALSE);
+ VoteCount(false);
}
return;
// Resets the state of all clients, items, weapons, waypoints, ... of the map.
void reset_map(float dorespawn)
-{
- entity oldself;
- oldself = self;
+{SELFPARAM();
if(time <= game_starttime && round_handler_IsActive())
round_handler_Reset(game_starttime);
MUTATOR_CALLHOOK(reset_map_global);
- for(self = world; (self = nextent(self)); )
- if(IS_NOT_A_CLIENT(self))
+ for(entity e = world; (e = nextent(e)); )
{
- if(self.reset)
+ setself(e);
+ if(IS_NOT_A_CLIENT(self))
{
- self.reset();
- continue;
- }
+ if(self.reset)
+ {
+ self.reset();
+ continue;
+ }
- if(self.team_saved)
- self.team = self.team_saved;
+ if(self.team_saved)
+ self.team = self.team_saved;
- if(self.flags & FL_PROJECTILE) // remove any projectiles left
- remove(self);
+ if(self.flags & FL_PROJECTILE) // remove any projectiles left
+ remove(self);
+ }
}
// Waypoints and assault start come LAST
- for(self = world; (self = nextent(self)); )
- if(IS_NOT_A_CLIENT(self))
+ for(entity e = world; (e = nextent(e)); )
{
- if(self.reset2)
+ setself(e);
+ if(IS_NOT_A_CLIENT(self))
{
- self.reset2();
- continue;
+ if(self.reset2)
+ {
+ self.reset2();
+ continue;
+ }
}
}
- FOR_EACH_PLAYER(self)
- if(self.frozen)
- Unfreeze(self);
+ entity e;
+ FOR_EACH_PLAYER(e)
+ if(e.frozen)
+ {
+ WITH(entity, self, e, Unfreeze(self));
+ }
// Moving the player reset code here since the player-reset depends
// on spawnpoint entities which have to be reset first --blub
if(dorespawn)
if(!MUTATOR_CALLHOOK(reset_map_players))
- FOR_EACH_CLIENT(self) // reset all players
+ FOR_EACH_CLIENT(e) // reset all players
{
+ setself(e);
/*
only reset players if a restart countdown is active
this can either be due to cvar sv_ready_restart_after_countdown having set
if(g_keyhunt)
kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round + (game_starttime - time), kh_StartRound);
- self = oldself;
+ setself(this);
}
// Restarts the map after the countdown is over (and cvar sv_ready_restart_after_countdown is set)
void ReadyRestart_think()
-{
+{SELFPARAM();
restart_mapalreadyrestarted = 1;
- reset_map(TRUE);
+ reset_map(true);
Score_ClearAll();
remove(self);
if(autocvar_sv_timeout) { FOR_EACH_REALPLAYER(tmp_player) { tmp_player.allowed_timeouts = autocvar_sv_timeout_number; } }
//reset map immediately if this cvar is not set
- if (!autocvar_sv_ready_restart_after_countdown) { reset_map(TRUE); }
+ if (!autocvar_sv_ready_restart_after_countdown) { reset_map(true); }
if(autocvar_sv_eventlog) { GameLogEcho(":restart"); }
}
|| ((!from_server && assignment == VC_ASGNMNT_CLIENTONLY)
|| (from_server && assignment == VC_ASGNMNT_SERVERONLY)))
{
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
string VoteCommand_extractcommand(string input, float startpos, float argc)
|| (strstrofs(vote_command, "\n", 0) >= 0)
|| (strstrofs(vote_command, "\r", 0) >= 0)
|| (strstrofs(vote_command, "$", 0) >= 0))
- return FALSE;
+ return false;
- return TRUE;
+ return true;
}
float VoteCommand_checkinlist(string vote_command, string list)
string l = strcat(" ", list, " ");
if(strstrofs(l, strcat(" ", vote_command, " "), 0) >= 0)
- return TRUE;
+ return true;
- return FALSE;
+ return false;
}
string ValidateMap(string validated_map, entity caller)
float checkmate;
if(cmdrestriction == "")
- return TRUE;
+ return true;
++startpos; // skip command name
minargs = stof(cmdrestriction);
if(argc - startpos < minargs)
- return FALSE;
+ return false;
p = strstrofs(cmdrestriction, ";", 0); // find first semicolon
- for(;;)
+ for (;;)
{
// we know that at any time, startpos <= argc - minargs
// so this means: argc-minargs >= startpos >= argc, thus
break;
// otherwise fail
- return FALSE;
+ return false;
}
// cut to next semicolon
checkmate = strlen(arg);
for(check = 0; check < checkmate; ++check)
if(strstrofs(charlist, substring(arg, check, 1), 0) < 0)
- return FALSE; // not allowed character
+ return false; // not allowed character
// all characters are allowed. FINE.
}
p = q;
}
- return TRUE;
+ return true;
}
float VoteCommand_parse(entity caller, string vote_command, string vote_list, float startpos, float argc)
&&
(strlen(substring(vote_command, argv_start_index(startpos), strlen(vote_command) - argv_start_index(startpos))) > autocvar_sv_vote_limit)
)
- return FALSE;
+ return false;
if (!VoteCommand_checkinlist(first_command, vote_list))
- return FALSE;
+ return false;
if (!VoteCommand_checkargs(startpos, argc))
- return FALSE;
+ return false;
switch(first_command) // now go through and parse the proper commands to adjust as needed.
{
case "kickban": // catch all kick/kickban commands
{
entity victim = GetIndexedEntity(argc, (startpos + 1));
- float accepted = VerifyClientEntity(victim, TRUE, FALSE);
+ float accepted = VerifyClientEntity(victim, true, false);
if(accepted > 0)
{
vote_parsed_command = strcat(first_command, " # ", ftos(num_for_edict(victim)), " ", command_arguments);
vote_parsed_display = strcat("^1", vote_command, " (^7", victim.netname, "^1): ", reason);
}
- else { print_to(caller, strcat("vcall: ", GetClientErrorString(accepted, argv(startpos + 1)), ".\n")); return FALSE; }
+ else { print_to(caller, strcat("vcall: ", GetClientErrorString(accepted, argv(startpos + 1)), ".\n")); return false; }
break;
}
case "gotomap": // re-direct all map selection commands to gotomap
{
vote_command = ValidateMap(argv(startpos + 1), caller);
- if (!vote_command) { return FALSE; }
+ if (!vote_command) { return false; }
vote_parsed_command = strcat("gotomap ", vote_command);
vote_parsed_display = strzone(strcat("^1", vote_parsed_command));
}
}
- return TRUE;
+ return true;
}
print_to(caller, "^1You abstained from your vote.");
caller.vote_selection = VOTE_SELECT_ABSTAIN;
msg_entity = caller;
- if(!autocvar_sv_vote_singlecount) { VoteCount(FALSE); }
+ if(!autocvar_sv_vote_singlecount) { VoteCount(false); }
}
return;
else // everything went okay, continue with calling the vote
{
vote_caller = caller; // remember who called the vote
+ vote_caller_name = strzone(GetCallerName(vote_caller));
vote_called = VOTE_NORMAL;
vote_called_command = strzone(vote_parsed_command);
vote_called_display = strzone(vote_parsed_display);
FOR_EACH_REALCLIENT(tmp_player) { ++tmp_playercount; }
if(tmp_playercount > 1) { Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_CALL); } // don't announce a "vote now" sound if player is alone
- bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote for ", vote_called_display, "\n");
+ bprint("\{1}^2* ^3", OriginalCallerName(), "^2 calls a vote for ", vote_called_display, "\n");
if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); }
Nagger_VoteChanged();
- VoteCount(TRUE); // needed if you are the only one
+ VoteCount(true); // needed if you are the only one
}
return;
else // everything went okay, proceed with giving this player master privilages
{
- caller.vote_master = TRUE;
+ caller.vote_master = true;
print_to(caller, strcat("Accepted vote master login from ", GetCallerName(caller)));
bprint("\{1}^2* ^3", GetCallerName(caller), "^2 logged in as ^3master^2\n");
if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vlogin:", ftos(caller.playerid))); }
else // everything went okay, continue with creating vote
{
vote_caller = caller;
+ vote_caller_name = strzone(GetCallerName(vote_caller));
vote_called = VOTE_MASTER;
vote_called_command = strzone("XXX");
vote_called_display = strzone("^3master");
caller.vote_selection = VOTE_SELECT_ACCEPT;
caller.vote_waittime = time + autocvar_sv_vote_wait;
- bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote to become ^3master^2.\n");
+ bprint("\{1}^2* ^3", OriginalCallerName(), "^2 calls a vote to become ^3master^2.\n");
if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); }
Nagger_VoteChanged();
- VoteCount(TRUE); // needed if you are the only one
+ VoteCount(true); // needed if you are the only one
}
return;
print_to(caller, "^1You rejected the vote.");
caller.vote_selection = VOTE_SELECT_REJECT;
msg_entity = caller;
- if(!autocvar_sv_vote_singlecount) { VoteCount(FALSE); }
+ if(!autocvar_sv_vote_singlecount) { VoteCount(false); }
}
return;
case CMD_REQUEST_COMMAND:
{
if(vote_called)
- print_to(caller, strcat("^7Vote for ", vote_called_display, "^7 called by ^7", GetCallerName(vote_caller), "^7."));
+ print_to(caller, strcat("^7Vote for ", vote_called_display, "^7 called by ^7", OriginalCallerName(), "^7."));
else
print_to(caller, "^1No vote called.");
print_to(caller, "^1You accepted the vote.");
caller.vote_selection = VOTE_SELECT_ACCEPT;
msg_entity = caller;
- if(!autocvar_sv_vote_singlecount) { VoteCount(FALSE); }
+ if(!autocvar_sv_vote_singlecount) { VoteCount(false); }
}
return;
#define VOTE_COMMAND(name,function,description,assignment) \
{ if(Votecommand_check_assignment(caller, assignment)) { print_to(caller, strcat(" ^2", name, "^7: ", description)); } }
- VOTE_COMMANDS(0, caller, 0, "")
+ VOTE_COMMANDS(0, caller, 0, "");
#undef VOTE_COMMAND
print_to(caller, strcat("\nUsage:^3 ", command_origin, " vote COMMAND...^7, where possible commands are listed above.\n"));
#define VOTE_COMMAND(name,function,description,assignment) \
{ if(Votecommand_check_assignment(caller, assignment)) { if(name == strtolower(argv(2))) { function; return; } } }
- VOTE_COMMANDS(CMD_REQUEST_USAGE, caller, argc, "")
+ VOTE_COMMANDS(CMD_REQUEST_USAGE, caller, argc, "");
#undef VOTE_COMMAND
}
float VoteCommand_macro_command(entity caller, float argc, string vote_command)
{
#define VOTE_COMMAND(name,function,description,assignment) \
- { if(Votecommand_check_assignment(caller, assignment)) { if(name == strtolower(argv(1))) { function; return TRUE; } } }
+ { if(Votecommand_check_assignment(caller, assignment)) { if(name == strtolower(argv(1))) { function; return true; } } }
- VOTE_COMMANDS(CMD_REQUEST_COMMAND, caller, argc, vote_command)
+ VOTE_COMMANDS(CMD_REQUEST_COMMAND, caller, argc, vote_command);
#undef VOTE_COMMAND
- return FALSE;
+ return false;
}