diff options
Diffstat (limited to 'sourcemod/scripting/gem_halftime_teamswap.sp')
| -rw-r--r-- | sourcemod/scripting/gem_halftime_teamswap.sp | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/sourcemod/scripting/gem_halftime_teamswap.sp b/sourcemod/scripting/gem_halftime_teamswap.sp new file mode 100644 index 0000000..5c5a50a --- /dev/null +++ b/sourcemod/scripting/gem_halftime_teamswap.sp @@ -0,0 +1,243 @@ +#pragma semicolon 1 +#include <sourcemod> +#include <sdktools> +#include <cstrike> + +#define PLUGIN_VERSION "1.0.11" +#define MAX_FILE_LEN 80 + +public Plugin:myinfo = +{ + name = "Halftime teamswitch", + author = "[30+]Gemeni", + description = "Moves all players to the opposite team at halftime", + version = PLUGIN_VERSION, + url = "http://30plus.ownit.se/" +}; + +// Global variables +new mapTime; +new g_maxrounds; +new g_roundCount; +new bool:halftime; +new Handle:g_h_moneyReset = INVALID_HANDLE; +new Handle:g_h_mp_startmoney = INVALID_HANDLE; +new Handle:g_h_mp_maxrounds = INVALID_HANDLE; +new g_mp_startmoney; +new bool:g_resetMoney; +new bool:g_halftime_do_resetMoney = false; +new Handle:g_CvarHalfTimeType = INVALID_HANDLE; +new String:g_HalfTimeType[MAX_FILE_LEN]; +new g_CtScore, g_TScore; + +/* forwards */ +new Handle:g_f_on_ht = INVALID_HANDLE; + +// Offsets +new g_iAccount = -1; + + +// Setting halftime to false +public OnMapStart(){ + //LogToGame(">>>>>Setting halftime to false, OnMapStart<<<<<"); + halftime = false; + g_roundCount = 0; + + GetConVarString(g_CvarHalfTimeType, g_HalfTimeType, MAX_FILE_LEN); + + new tmp; + tmp = GetConVarInt(g_h_moneyReset); + if (tmp == 1) { + g_resetMoney = true; + } + else { + g_resetMoney = false; + } + + g_mp_startmoney = GetConVarInt(g_h_mp_startmoney); + g_maxrounds = GetConVarInt(g_h_mp_maxrounds); +} + +public OnConfigsExecuted(){ + //LogToGame(">>>>>Setting halftime to false, OnConfigsExecuted<<<<<"); + halftime = false; +} + +// Hooking events at plugin start +public OnPluginStart(){ + CreateConVar("sm_halftime_teamswitch_version", PLUGIN_VERSION, "Halftime teamswitch version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY); + HookEvent("round_start", Event_RoundStart); + HookEvent("round_end", Event_RoundEnd); + + g_h_moneyReset = CreateConVar("sm_halftime_money_reset", "1", "If weapons should be removed and money reset to mp_startmoney"); + g_h_mp_startmoney = FindConVar("mp_startmoney"); + g_h_mp_maxrounds = FindConVar("mp_maxrounds"); + + g_CvarHalfTimeType = CreateConVar("sm_halftime_teamswitch_type", "timelimit", "timelimit|maxrounds to determin what critera halftime should be based on"); + + g_f_on_ht = CreateGlobalForward("gemHalftime", ET_Ignore); + + // Finding offset for CS cash + g_iAccount = FindSendPropOffs("CCSPlayer", "m_iAccount"); + if (g_iAccount == -1) + SetFailState("m_iAccount offset not found"); + +} + +// RoundStart gets the maptime +// Checks to see if halftime has passed, if not then make sure halftime is 0 +// Setting halftime false here as well since in some occasions when extending map +// team switch can occur again. +public Event_RoundStart (Handle:event, const String:name[], bool:dontBroadcast) +{ + new wepIdx; + new playerTeam; + + g_roundCount++; + //LogMessage(">>> Increasing roundCount %d<<<", g_roundCount); + + GetMapTimeLimit(mapTime); + mapTime=mapTime*60; + + if (g_halftime_do_resetMoney) { + for (new client=1; client<=GetMaxClients(); client++) + { + if (IsClientInGame (client) && IsClientConnected(client)) { + for (new w = 0; w < 6; w++) + { + if (w != 2 && w != 4 ) + while((wepIdx = GetPlayerWeaponSlot(client, w)) != -1) + RemovePlayerItem(client, wepIdx); + } + playerTeam = GetClientTeam(client); + if (playerTeam == CS_TEAM_T) { + GivePlayerItem(client, "weapon_glock"); + } + else if (playerTeam == CS_TEAM_CT) { + GivePlayerItem(client, "weapon_usp"); + if ((wepIdx = GetPlayerWeaponSlot(client, 6)) != -1) + RemovePlayerItem(client, wepIdx); + } + SetEntProp(client, Prop_Send, "m_ArmorValue", 0, 1); + SetEntProp(client, Prop_Send, "m_bHasHelmet", 0, 1); + + SetEntData(client, g_iAccount, g_mp_startmoney, 4, true); + } + } + } + g_halftime_do_resetMoney = false; +} + +// At Round end we check if time left of the map is passed halftime. +// If so and we have not already switched teams before, switch teams and then set halftime to 1 +public Event_RoundEnd (Handle:event, const String:name[], bool:dontBroadcast) +{ + new mapTimeLeft; + new bool:doSwap = false; +// new CTScore, TScore; + new reason = GetEventInt(event, "reason"); + new winner = GetEventInt(event, "winner"); + + g_mp_startmoney = GetConVarInt(g_h_mp_startmoney); + g_maxrounds = GetConVarInt(g_h_mp_maxrounds); + + // Make sure that we have a normal round end + // reason 16 is game commencing + // other reasons are real round ends + if(reason == 15) { + g_CtScore = 0; + g_TScore = 0; + g_roundCount = 0; + return; + } + + if (winner==CS_TEAM_T) + g_TScore++; + if (winner==CS_TEAM_CT) + g_CtScore++; + + GetMapTimeLeft(mapTimeLeft); + LogMessage( "roundEnd: ct: %d t: %d rounds: %d max: %d", g_CtScore, g_TScore, g_roundCount, g_maxrounds/2 ); + if ((g_roundCount>=g_maxrounds/2)) { + //LogMessage(">>> Halftime, Swap maxrounds %d %d<<<", g_roundCount, g_maxrounds); + doSwap = true; + } + else { + doSwap = false; + } + + if( g_TScore > g_maxrounds/2 || g_CtScore > g_maxrounds/2 ) { + SetConVarInt( g_h_mp_maxrounds, 1, true, false ); + PrintToChatAll("\x04============[ game end ]============"); + + if( g_TScore > g_CtScore ) { + PrintToChatAll("\x04Winner: T"); + } + else { + PrintToChatAll("\x04Winner: CT"); + } + } + + if(doSwap && (halftime == false)) { + new playerTeam; + + Call_StartForward(g_f_on_ht); + Call_Finish(); + + //LogMessage(">>> Halftime, switching players to oposite team <<<"); + + //LogToGame(">>>>>Setting halftime to true<<<<<"); + halftime = true; + + //Loop through all players and see if they are in game and that they are on a team + //LogMessage("Players to switch: %d", GetMaxClients()); + for (new i=1; i<=GetMaxClients(); i++) + { + if (IsClientInGame (i) && IsClientConnected(i)) { + + if (IsClientInGame (i) && IsClientConnected(i) && IsFakeClient(i)) { + ForcePlayerSuicide(i); + } + + g_halftime_do_resetMoney = true; + + //LogMessage("Player %d is InGame", i); + playerTeam = GetClientTeam(i); + if (playerTeam == CS_TEAM_T) { + //LogMessage("Before switch of %d to CT", i); + CS_SwitchTeam(i, CS_TEAM_CT); + //LogMessage("After switch of %d to CT", i); + } + else if (playerTeam == CS_TEAM_CT) { + //LogMessage("Before switch of %d to T", i); + CS_SwitchTeam(i, CS_TEAM_T); + //LogMessage("After switch of %d to T", i); + } + else { + //LogMessage("No switch, not CT not T"); + } + } + else { + //LogMessage("Player %d is *NOT* InGame", i); + } + } + //CTScore = GetTeamScore(CS_TEAM_CT); + //TScore = GetTeamScore(CS_TEAM_T); + //SetTeamScore(CS_TEAM_CT, TScore); + //SetTeamScore(CS_TEAM_T, CTScore); + new tmp; + tmp = g_CtScore; + g_CtScore = g_TScore; + g_TScore = tmp; + + //LogMessage(">>>>>halftime switch completed<<<<<"); + + PrintToChatAll("\x04==========[ halftime switch ]=========="); + } + // Else just advertise that teamswitch will occur at half time + else if ((mapTimeLeft>mapTime/2) && (halftime == false)) { + //PrintToChatAll(">>> Players will switch teams at halftime <<<"); + } + SetTeamScore(CS_TEAM_CT, g_CtScore); + SetTeamScore(CS_TEAM_T, g_TScore); +} |
