diff --git a/.gitignore b/.gitignore index 8c81d4e4..17ae4b49 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ # editors *.atom-build.json .vscode/tasks.json + +\.vscode/settings\.json diff --git a/.travis.yml b/.travis.yml index e3de1b47..51a4d7b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ addons: - lib32stdc++6 # needed for spcomp env: - - SMVERSION=1.9 + - SMVERSION=1.10 before_script: # install smbuilder diff --git a/README.md b/README.md index be929baa..1fac660f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Includes a records system, map zones (start/end marks etc), bonuses, HUD with us # Requirements: * Steam version of Counter-Strike: Source or Counter-Strike: Global Offensive. -* [SourceMod 1.9 or above](http://www.sourcemod.net/downloads.php) +* [SourceMod 1.10 or above](http://www.sourcemod.net/downloads.php?branch=dev) * A MySQL database (preferably locally hosted) if your database is likely to grow big, or if you want to use the rankings plugin. MySQL server version of 5.5.5 or above (MariaDB equivalent works too) is highly recommended. # Optional requirements, for the best experience: diff --git a/addons/sourcemod/scripting/include/shavit.inc b/addons/sourcemod/scripting/include/shavit.inc index 5cadf1bf..b52af10c 100644 --- a/addons/sourcemod/scripting/include/shavit.inc +++ b/addons/sourcemod/scripting/include/shavit.inc @@ -23,13 +23,13 @@ #endif #define _shavit_included -#define SHAVIT_VERSION "2.3.6" +#define SHAVIT_VERSION "2.4.0" #define STYLE_LIMIT 256 #define MAX_ZONES 64 #define MAX_NAME_LENGTH_SQL 32 // HUD -#define HUD_NONE (0) +#define HUD_NONE 0 #define HUD_MASTER (1 << 0) // master setting #define HUD_CENTER (1 << 1) // show hud as hint text #define HUD_ZONEHUD (1 << 2) // show start/end zone hud @@ -44,26 +44,17 @@ #define HUD_NOSOUNDS (1 << 11) // disables sounds on personal best, world record etc #define HUD_NOPRACALERT (1 << 12) // hides practice mode chat alert -// for reference, not used anymore -// game types -enum ServerGame -{ - Game_CSS = 0, - Game_CSGO, - Game_Unknown -}; - // status enum TimerStatus { - Timer_Stopped = 0, + Timer_Stopped, Timer_Running, Timer_Paused }; enum ReplayStatus { - Replay_Start = 0, + Replay_Start, Replay_Running, Replay_End, Replay_Idle @@ -71,10 +62,34 @@ enum ReplayStatus enum ReplayBotType { - Replay_Central = 0, + Replay_Central, Replay_Legacy }; +enum +{ + Zone_Start, + Zone_End, + Zone_Respawn, + Zone_Stop, + Zone_Slay, + Zone_Freestyle, + Zone_NoVelLimit, + Zone_Teleport, + Zone_CustomSpawn, + Zone_Easybhop, + Zone_Slide, + ZONETYPES_SIZE +}; + +enum +{ + Track_Main, + Track_Bonus, + TRACKS_SIZE +}; + +// for Shavit_GetStyleStrings enum { sStyleName, @@ -83,46 +98,10 @@ enum sChangeCommand, sClanTag, sSpecialString, - sStylePermission, - STYLESTRINGS_SIZE -}; - -enum -{ - bAutobhop, - bEasybhop, - bPrespeed, - fVelocityLimit, - bEnableBunnyhopping, - fAiraccelerate, - fRunspeed, - fGravityMultiplier, - fSpeedMultiplier, - fTimescale, - fVelocity, - fBonusVelocity, - fMinVelocity, - bBlockW, - bBlockA, - bBlockS, - bBlockD, - bBlockUse, - iForceHSW, - iBlockPLeft, - iBlockPRight, - iBlockPStrafe, - bUnranked, - bNoReplay, - bSync, - bStrafeCountW, - bStrafeCountA, - bStrafeCountS, - bStrafeCountD, - fRankingMultiplier, - iSpecial, - STYLESETTINGS_SIZE + sStylePermission }; +// for Shavit_GetChatStrings enum { sMessagePrefix, @@ -130,26 +109,80 @@ enum sMessageWarning, sMessageVariable, sMessageVariable2, - sMessageStyle, - CHATSETTINGS_SIZE + sMessageStyle }; -enum +enum struct stylestrings_t { - bTimerEnabled, - fCurrentTime, - bClientPaused, - iJumps, - bsStyle, - iStrafes, - iTotalMeasures, - iGoodGains, - fServerTime, - iSHSWCombination, - iTimerTrack, - iMeasuredJumps, - iPerfectJumps, - TIMERSNAPSHOT_SIZE + char sStyleName[64]; + char sShortName[32]; + char sHTMLColor[32]; + char sChangeCommand[128]; + char sClanTag[32]; + char sSpecialString[128]; + char sStylePermission[64]; +}; + +enum struct stylesettings_t +{ + bool bAutobhop; + bool bEasybhop; + bool bPrespeed; + float fVelocityLimit; + bool bEnableBunnyhopping; + float fAiraccelerate; + float fRunspeed; + float fGravityMultiplier; + float fSpeedMultiplier; + float fTimescale; + float fVelocity; + float fBonusVelocity; + float fMinVelocity; + bool bBlockW; + bool bBlockA; + bool bBlockS; + bool bBlockD; + bool bBlockUse; + int iForceHSW; + int iBlockPLeft; + int iBlockPRight; + int iBlockPStrafe; + bool bUnranked; + bool bNoReplay; + bool bSync; + bool bStrafeCountW; + bool bStrafeCountA; + bool bStrafeCountS; + bool bStrafeCountD; + float fRankingMultiplier; + int iSpecial; +}; + +enum struct chatstrings_t +{ + char sPrefix[64]; + char sText[16]; + char sWarning[16]; + char sVariable[16]; + char sVariable2[16]; + char sStyle[16]; +}; + +enum struct timer_snapshot_t +{ + bool bTimerEnabled; + float fCurrentTime; + bool bClientPaused; + int iJumps; + int bsStyle; + int iStrafes; + int iTotalMeasures; + int iGoodGains; + float fServerTime; + int iSHSWCombination; + int iTimerTrack; + int iMeasuredJumps; + int iPerfectJumps; }; #if defined USES_CHAT_COLORS @@ -203,39 +236,6 @@ char gS_CSGOColors[][] = }; #endif -enum(+=1) -{ - Zone_Start = 0, - Zone_End, - Zone_Respawn, - Zone_Stop, - Zone_Slay, - Zone_Freestyle, - Zone_NoVelLimit, - Zone_Teleport, - Zone_CustomSpawn, - Zone_Easybhop, - Zone_Slide, - ZONETYPES_SIZE -}; - -enum -{ - bZoneInitialized, - iZoneType, - iZoneTrack, // 0 - main, 1 - bonus - iEntityID, - iDatabaseID, - ZONECACHE_SIZE -}; - -enum -{ - Track_Main, - Track_Bonus, - TRACKS_SIZE -}; - stock bool IsValidClient(int client, bool bAlive = false) { return (client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && !IsClientSourceTV(client) && (!bAlive || IsPlayerAlive(client))); @@ -301,11 +301,11 @@ stock void FormatSeconds(float time, char[] newtime, int newtimesize, bool preci * @param status The player's timer status. * @param track The player's timer track. * @param style The player's bhop style. - * @param stylesettings An array that contains the player's bhop style's settings. + * @param stylesettings A stylesettings_t struct that contains the player's bhop style's settings. * @param mouse Mouse direction (x, y). * @return Plugin_Continue to let shavit-core keep doing what it does, Plugin_Changed to pass different values. */ -forward Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, any stylesettings[STYLESETTINGS_SIZE], int mouse[2]); +forward Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, stylesettings_t stylesettings, int mouse[2]); /** * Called just before shavit-core adds time to a player's timer. @@ -315,10 +315,10 @@ forward Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float * @param client Client index. * @param snapshot A snapshot with the player's current timer. You cannot manipulate it here. * @param time The time to be added to the player's timer. - * @param stylesettings An array that contains the player's bhop style's settings. + * @param stylesettings A stylesettings_t struct that contains the player's bhop style's settings. * @noreturn */ -forward void Shavit_OnTimeIncrement(int client, any snapshot[TIMERSNAPSHOT_SIZE], float &time, any stylesettings[STYLESETTINGS_SIZE]); +forward void Shavit_OnTimeIncrement(int client, any snapshot[sizeof(timer_snapshot_t)], float &time, stylesettings_t stylesettings); /** * Called just before shavit-core adds time to a player's timer. @@ -328,10 +328,10 @@ forward void Shavit_OnTimeIncrement(int client, any snapshot[TIMERSNAPSHOT_SIZE] * @param client Client index. * @param snapshot A snapshot with the player's current timer. Read above in shavit.inc for more information. * @param time The time to be added to the player's timer. - * @param stylesettings An array that contains the player's bhop style's settings. + * @param stylesettings A stylesettings_t struct that contains the player's bhop style's settings. * @noreturn */ -forward void Shavit_OnTimeIncrementPost(int client, float time, any stylesettings[STYLESETTINGS_SIZE]); +forward void Shavit_OnTimeIncrementPost(int client, float time, stylesettings_t stylesettings); /** * Called when a player's timer starts. @@ -377,7 +377,7 @@ forward void Shavit_OnStop(int client, int track); * @param snapshot A snapshot of the player's timer. * @return Plugin_Continue to do nothing, Plugin_Changed to change the variables or anything else to stop the timer from finishing. */ -forward Action Shavit_OnFinishPre(int client, any snapshot[TIMERSNAPSHOT_SIZE]); +forward Action Shavit_OnFinishPre(int client, any snapshot[sizeof(timer_snapshot_t)]); /** * Called when a player finishes a map. (touches the end zone) @@ -568,7 +568,7 @@ forward void Shavit_OnReplayEnd(int client); * @return Game type. (See "enum ServerGame") */ #pragma deprecated Use GetEngineVersion() instead. -native ServerGame Shavit_GetGameType(); +native EngineVersion Shavit_GetGameType(); /** * Returns the database handle the timer is using. @@ -750,8 +750,18 @@ native float Shavit_GetSync(int client); * @param track Timer track. * @noreturn */ +#pragma deprecated Use Shavit_GetWorldRecord() instead. native void Shavit_GetWRTime(int style, float &time, int track); +/** + * Retrieves the world record for the given style/track. + * + * @param style Style to get the WR for. + * @param track Timer track. + * @return World record for the specified settings. + */ +native float Shavit_GetWorldRecord(int style, int track); + /** * Saves the WR's record ID for the current map on a variable. * Unused in base plugins, as of pre-1.4b. @@ -783,8 +793,19 @@ native void Shavit_GetWRName(int style, char[] wrname, int wrmaxlength, int trac * @param track Timer track. * @noreturn */ +#pragma deprecated Use Shavit_GetClientPB() instead. native void Shavit_GetPlayerPB(int client, int style, float &time, int track); +/** + * Retrieves the best time of a player. + * + * @param client Client index. + * @param style Style to get the PB for. + * @param track Timer track. + * @return Floating number of the player's best time for given style/track. + */ +native float Shavit_GetClientPB(int client, int style, int track); + /** * Get the amount of records on the current map/style on a track. * @@ -1022,7 +1043,7 @@ native int Shavit_GetWRCount(int client); * @param StyleSettings Reference to the settings array. * @return SP_ERROR_NONE on success, anything else on failure. */ -native int Shavit_GetStyleSettings(int style, any StyleSettings[STYLESETTINGS_SIZE]); +native int Shavit_GetStyleSettings(int style, any StyleSettings[sizeof(stylesettings_t)]); /** * Saves the style related strings on string references. @@ -1083,13 +1104,13 @@ native bool Shavit_IsPracticeMode(int client); /** * Save a client's timer into a snapshot. - * See the enumeration that ends with TIMERSNAPSHOT_SIZE. + * See the timer_snapshot_t enum struct. * * @param client Client index. * @param snapshot Full snapshot of the client's timer. * @noreturn */ -native void Shavit_SaveSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]); +native void Shavit_SaveSnapshot(int client, any snapshot[sizeof(timer_snapshot_t)]); /** * Restores the client's timer from a snapshot. @@ -1098,7 +1119,7 @@ native void Shavit_SaveSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]); * @param snapshot Full snapshot of the client's timer. * @noreturn */ -native void Shavit_LoadSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]); +native void Shavit_LoadSnapshot(int client, any snapshot[sizeof(timer_snapshot_t)]); /** * Sets a player's replay recording frames from a provided ArrayList. @@ -1141,8 +1162,9 @@ native bool Shavit_ReloadReplay(int style, int track, bool restart, char[] path native int Shavit_ReloadReplays(bool restart); /** - * Use this native to stop the chat tick sound that happens in CS:S. - * Call it before each Shavit_PrintToChat() or Shavit_PrintToChatAll(). + * Use this native to stop the click sound that plays upon chat messages. + * Call it before each Shavit_PrintToChat(). + * Shavit_PrintToChatAll() is not guaranteed to disable the sound from playing. * * @noreturn */ @@ -1215,7 +1237,7 @@ native void Shavit_LogMessage(const char[] format, any ...); // code stolen from the base halflife.inc file stock void Shavit_PrintToChatAll(const char[] format, any ...) { - char[] buffer = new char[300]; + char buffer[300]; for(int i = 1; i <= MaxClients; i++) { @@ -1249,6 +1271,7 @@ public void __pl_shavit_SetNTVOptional() MarkNativeAsOptional("Shavit_GetBhopStyle"); MarkNativeAsOptional("Shavit_GetChatStrings"); MarkNativeAsOptional("Shavit_GetClientJumps"); + MarkNativeAsOptional("Shavit_GetClientPB"); MarkNativeAsOptional("Shavit_GetClientTime"); MarkNativeAsOptional("Shavit_GetClientTrack"); MarkNativeAsOptional("Shavit_GetDatabase"); @@ -1282,6 +1305,7 @@ public void __pl_shavit_SetNTVOptional() MarkNativeAsOptional("Shavit_GetTimeForRank"); MarkNativeAsOptional("Shavit_GetTimer"); MarkNativeAsOptional("Shavit_GetTimerStatus"); + MarkNativeAsOptional("Shavit_GetWorldRecord"); MarkNativeAsOptional("Shavit_GetWRCount"); MarkNativeAsOptional("Shavit_GetWRName"); MarkNativeAsOptional("Shavit_GetWRRecordID"); diff --git a/addons/sourcemod/scripting/shavit-chat.sp b/addons/sourcemod/scripting/shavit-chat.sp index cdc1c8ce..7c6602a7 100644 --- a/addons/sourcemod/scripting/shavit-chat.sp +++ b/addons/sourcemod/scripting/shavit-chat.sp @@ -32,25 +32,24 @@ #include #define MAGIC_NUMBER 2147483648.0 -#define MAXLENGTH_NAME 192 -#define MAXLENGTH_TEXT 192 +#define MAXLENGTH_NAME 128 +#define MAXLENGTH_TEXT 128 #define MAXLENGTH_MESSAGE 255 #define MAXLENGTH_DISPLAY 192 #define MAXLENGTH_CMESSAGE 16 #define MAXLENGTH_BUFFER 255 -enum ChatRanksCache +enum struct chatranks_cache_t { - iCRRangeType, // 0 - flat, 1 - percent, 2 - point range - Float:fCRFrom, - Float:fCRTo, - bool:bCRFree, - bool:bCREasterEgg, - String:sCRAdminFlag[32], - String:sCRName[MAXLENGTH_NAME], - String:sCRMessage[MAXLENGTH_MESSAGE], - String:sCRDisplay[MAXLENGTH_DISPLAY], - CRCACHE_SIZE + int iRangeType; // 0 - flat, 1 - percent, 2 - point range + float fFrom; + float fTo; + bool bFree; + bool bEasterEgg; + char sAdminFlag[32]; + char sName[MAXLENGTH_NAME]; + char sMessage[MAXLENGTH_MESSAGE]; + char sDisplay[MAXLENGTH_DISPLAY]; } enum @@ -77,11 +76,6 @@ ConVar gCV_RankingsIntegration = null; ConVar gCV_CustomChat = null; ConVar gCV_Colon = null; -// cached cvars -bool gB_RankingsIntegration = true; -int gI_CustomChat = 1; -char gS_Colon[MAXLENGTH_CMESSAGE] = ":"; - // cache EngineVersion gEV_Type = Engine_Unknown; @@ -148,10 +142,6 @@ public void OnPluginStart() gCV_CustomChat = CreateConVar("shavit_chat_customchat", "1", "Allow custom chat names or message colors?\n0 - Disabled\n1 - Enabled (requires chat flag/'shavit_chat' override)\n2 - Allow use by everyone", 0, true, 0.0, true, 2.0); gCV_Colon = CreateConVar("shavit_chat_colon", ":", "String to use as the colon when messaging."); - gCV_RankingsIntegration.AddChangeHook(OnConVarChanged); - gCV_CustomChat.AddChangeHook(OnConVarChanged); - gCV_Colon.AddChangeHook(OnConVarChanged); - AutoExecConfig(); gSM_Messages = new StringMap(); @@ -159,7 +149,7 @@ public void OnPluginStart() HookUserMessage(GetUserMessageId("SayText2"), Hook_SayText2, true); gH_ChatCookie = RegClientCookie("shavit_chat_selection", "Chat settings", CookieAccess_Protected); - gA_ChatRanks = new ArrayList(view_as(CRCACHE_SIZE)); + gA_ChatRanks = new ArrayList(sizeof(chatranks_cache_t)); for(int i = 1; i <= MaxClients; i++) { @@ -206,18 +196,18 @@ bool LoadChatConfig() do { - any[] aChatTitle = new any[CRCACHE_SIZE]; + chatranks_cache_t chat_title; char sRanks[32]; kv.GetString("ranks", sRanks, MAXLENGTH_NAME, "0"); if(sRanks[0] == 'p') { - aChatTitle[iCRRangeType] = Rank_Points; + chat_title.iRangeType = Rank_Points; } else { - aChatTitle[iCRRangeType] = (StrContains(sRanks, "%") == -1)? Rank_Flat:Rank_Percentage; + chat_title.iRangeType = (StrContains(sRanks, "%") == -1)? Rank_Flat:Rank_Percentage; } ReplaceString(sRanks, 32, "p", ""); @@ -227,29 +217,29 @@ bool LoadChatConfig() { char sExplodedString[2][16]; ExplodeString(sRanks, "-", sExplodedString, 2, 64); - aChatTitle[fCRFrom] = StringToFloat(sExplodedString[0]); - aChatTitle[fCRTo] = StringToFloat(sExplodedString[1]); + chat_title.fFrom = StringToFloat(sExplodedString[0]); + chat_title.fTo = StringToFloat(sExplodedString[1]); } else { float fRank = StringToFloat(sRanks); - aChatTitle[fCRFrom] = fRank; - aChatTitle[fCRTo] = (aChatTitle[iCRRangeType] == Rank_Flat)? fRank:MAGIC_NUMBER; + chat_title.fFrom = fRank; + chat_title.fTo = (chat_title.iRangeType == Rank_Flat)? fRank:MAGIC_NUMBER; } - aChatTitle[bCRFree] = view_as(kv.GetNum("free", false)); - aChatTitle[bCREasterEgg] = view_as(kv.GetNum("easteregg", false)); + chat_title.bFree = view_as(kv.GetNum("free", false)); + chat_title.bEasterEgg = view_as(kv.GetNum("easteregg", false)); - kv.GetString("name", aChatTitle[sCRName], MAXLENGTH_NAME, "{name}"); - kv.GetString("message", aChatTitle[sCRMessage], MAXLENGTH_MESSAGE, ""); - kv.GetString("display", aChatTitle[sCRDisplay], MAXLENGTH_DISPLAY, ""); - kv.GetString("flag", aChatTitle[sCRAdminFlag], 32, ""); + kv.GetString("name", chat_title.sName, MAXLENGTH_NAME, "{name}"); + kv.GetString("message", chat_title.sMessage, MAXLENGTH_MESSAGE, ""); + kv.GetString("display", chat_title.sDisplay, MAXLENGTH_DISPLAY, ""); + kv.GetString("flag", chat_title.sAdminFlag, 32, ""); - if(strlen(aChatTitle[sCRDisplay]) > 0) + if(strlen(chat_title.sDisplay) > 0) { - gA_ChatRanks.PushArray(aChatTitle); + gA_ChatRanks.PushArray(chat_title); } } @@ -340,23 +330,21 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl if(gB_Protobuf) { - Protobuf pbmsg = msg; + Protobuf pbmsg = UserMessageToProtobuf(msg); client = pbmsg.ReadInt("ent_idx"); pbmsg.ReadString("msg_name", sMessage, 32); pbmsg.ReadString("params", sOriginalName, MAXLENGTH_NAME, 0); pbmsg.ReadString("params", sOriginalText, MAXLENGTH_TEXT, 1); - delete pbmsg; } else { - BfRead bfmsg = msg; + BfRead bfmsg = UserMessageToBfRead(msg); client = bfmsg.ReadByte(); bfmsg.ReadByte(); // chat parameter bfmsg.ReadString(sMessage, 32); bfmsg.ReadString(sOriginalName, MAXLENGTH_NAME); bfmsg.ReadString(sOriginalText, MAXLENGTH_TEXT); - delete bfmsg; } if(client == 0) @@ -388,10 +376,13 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl ReplaceString(sOriginalText, MAXLENGTH_TEXT, gS_ControlCharacters[i], ""); } + // fix an exploit that breaks chat colors in cs:s + while(ReplaceString(sOriginalText, MAXLENGTH_TEXT, " ", " ") > 0) { } + char sName[MAXLENGTH_NAME]; char sCMessage[MAXLENGTH_CMESSAGE]; - if((gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)) && gI_ChatSelection[client] == -1) + if((gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2)) && gI_ChatSelection[client] == -1) { if(gB_NameEnabled[client]) { @@ -412,29 +403,20 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl if(strlen(sName) > 0) { FormatChat(client, sName, MAXLENGTH_NAME); - - if(gEV_Type == Engine_CSGO) - { - FormatEx(sOriginalName, MAXLENGTH_NAME, " %s", sName); - } - - else - { - strcopy(sOriginalName, MAXLENGTH_NAME, sName); - } + strcopy(sOriginalName, MAXLENGTH_NAME, sName); } if(strlen(sMessage) > 0) { FormatChat(client, sCMessage, MAXLENGTH_CMESSAGE); - char sTemp[MAXLENGTH_CMESSAGE]; + char sFixedMessage[MAXLENGTH_MESSAGE]; // support RTL messages - if(gB_RTLer && RTLify(sTemp, MAXLENGTH_CMESSAGE, sOriginalText) > 0) + if(gB_RTLer && RTLify(sFixedMessage, MAXLENGTH_MESSAGE, sOriginalText) > 0) { TrimString(sOriginalText); - Format(sOriginalText, MAXLENGTH_MESSAGE, "%s%s", sOriginalText, sCMessage); + Format(sOriginalText, MAXLENGTH_MESSAGE, "%s%s", sFixedMessage, sCMessage); } else @@ -443,7 +425,10 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl } } - ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, gS_Colon, sOriginalText); + char sColon[MAXLENGTH_CMESSAGE]; + gCV_Colon.GetString(sColon, MAXLENGTH_CMESSAGE); + + ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, sColon, sOriginalText); DataPack pack = new DataPack(); pack.WriteCell(GetClientSerial(client)); // client serial @@ -503,38 +488,32 @@ void Frame_SendText(DataPack pack) if(gB_Protobuf) { - Protobuf pbmsg = view_as(hSayText2); + // show colors in cs:go + Format(sText, MAXLENGTH_BUFFER, " %s", sText); + + Protobuf pbmsg = UserMessageToProtobuf(hSayText2); pbmsg.SetInt("ent_idx", client); pbmsg.SetBool("chat", true); pbmsg.SetString("msg_name", sText); + // needed to not crash for(int i = 1; i <= 4; i++) { pbmsg.AddString("params", ""); } - - delete pbmsg; } else { - BfWrite bfmsg = view_as(hSayText2); + BfWrite bfmsg = UserMessageToBfWrite(hSayText2); bfmsg.WriteByte(client); bfmsg.WriteByte(true); bfmsg.WriteString(sText); - delete bfmsg; } EndMessage(); } -public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) -{ - gB_RankingsIntegration = gCV_RankingsIntegration.BoolValue; - gI_CustomChat = gCV_CustomChat.IntValue; - gCV_Colon.GetString(gS_Colon, MAXLENGTH_CMESSAGE); -} - public void Shavit_OnDatabaseLoaded() { gH_SQL = Shavit_GetDatabase(); @@ -690,7 +669,7 @@ public Action Command_CCName(int client, int args) return Plugin_Handled; } - if(!(gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2))) + if(!(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2))) { Shavit_PrintToChat(client, "%T", "NoCommandAccess", client); @@ -739,7 +718,7 @@ public Action Command_CCMessage(int client, int args) return Plugin_Handled; } - if(!(gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2))) + if(!(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2))) { Shavit_PrintToChat(client, "%T", "NoCommandAccess", client); @@ -798,7 +777,7 @@ Action ShowChatRanksMenu(int client, int item) FormatEx(sDisplay, MAXLENGTH_DISPLAY, "%T\n ", "AutoAssign", client); menu.AddItem("-2", sDisplay, (gI_ChatSelection[client] == -2)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); - if(gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)) + if(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2)) { FormatEx(sDisplay, MAXLENGTH_DISPLAY, "%T\n ", "CustomChat", client); menu.AddItem("-1", sDisplay, (gI_ChatSelection[client] == -1)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); @@ -813,11 +792,11 @@ Action ShowChatRanksMenu(int client, int item) continue; } - any[] aCache = new any[CRCACHE_SIZE]; - gA_ChatRanks.GetArray(i, aCache, view_as(CRCACHE_SIZE)); + chatranks_cache_t cache; + gA_ChatRanks.GetArray(i, cache, sizeof(chatranks_cache_t)); char sMenuDisplay[MAXLENGTH_DISPLAY]; - strcopy(sMenuDisplay, MAXLENGTH_DISPLAY, aCache[sCRDisplay]); + strcopy(sMenuDisplay, MAXLENGTH_DISPLAY, cache.sDisplay); ReplaceString(sMenuDisplay, MAXLENGTH_DISPLAY, "", "\n"); StrCat(sMenuDisplay, MAXLENGTH_DISPLAY, "\n "); // to add spacing between each entry @@ -874,11 +853,11 @@ Action ShowRanksMenu(int client, int item) for(int i = 0; i < iLength; i++) { - any[] aCache = new any[CRCACHE_SIZE]; - gA_ChatRanks.GetArray(i, aCache, view_as(CRCACHE_SIZE)); + chatranks_cache_t cache; + gA_ChatRanks.GetArray(i, cache, sizeof(chatranks_cache_t)); char sFlag[32]; - strcopy(sFlag, 32, aCache[sCRAdminFlag]); + strcopy(sFlag, 32, cache.sAdminFlag); bool bFlagAccess = false; int iSize = strlen(sFlag); @@ -903,13 +882,13 @@ Action ShowRanksMenu(int client, int item) bFlagAccess = CheckCommandAccess(client, sFlag, 0, true); } - if(aCache[bCREasterEgg] || !bFlagAccess) + if(cache.bEasterEgg || !bFlagAccess) { continue; } char sDisplay[MAXLENGTH_DISPLAY]; - strcopy(sDisplay, MAXLENGTH_DISPLAY, aCache[sCRDisplay]); + strcopy(sDisplay, MAXLENGTH_DISPLAY, cache.sDisplay); ReplaceString(sDisplay, MAXLENGTH_DISPLAY, "", "\n"); char sExplodedString[2][32]; @@ -919,9 +898,9 @@ Action ShowRanksMenu(int client, int item) char sRequirements[64]; - if(!aCache[bCRFree]) + if(!cache.bFree) { - if(aCache[fCRFrom] == 0.0 && (aCache[fCRFrom] == aCache[fCRTo] || aCache[fCRTo] == MAGIC_NUMBER)) + if(cache.fFrom == 0.0 && (cache.fFrom == cache.fTo || cache.fTo == MAGIC_NUMBER)) { FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Unranked", client); } @@ -929,44 +908,44 @@ Action ShowRanksMenu(int client, int item) else { // this is really ugly - bool bRanged = (aCache[fCRFrom] != aCache[fCRTo] && aCache[fCRTo] != MAGIC_NUMBER); + bool bRanged = (cache.fFrom != cache.fTo && cache.fTo != MAGIC_NUMBER); - if(aCache[iCRRangeType] == Rank_Flat) + if(cache.iRangeType == Rank_Flat) { if(bRanged) { - FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat_Ranged", client, RoundToZero(aCache[fCRFrom]), RoundToZero(aCache[fCRTo])); + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat_Ranged", client, RoundToZero(cache.fFrom), RoundToZero(cache.fTo)); } else { - FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat", client, RoundToZero(aCache[fCRFrom])); + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat", client, RoundToZero(cache.fFrom)); } } - else if(aCache[iCRRangeType] == Rank_Percentage) + else if(cache.iRangeType == Rank_Percentage) { if(bRanged) { - FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage_Ranged", client, aCache[fCRFrom], '%', aCache[fCRTo], '%'); + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage_Ranged", client, cache.fFrom, '%', cache.fTo, '%'); } else { - FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage", client, aCache[fCRFrom], '%'); + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage", client, cache.fFrom, '%'); } } - else if(aCache[iCRRangeType] == Rank_Points) + else if(cache.iRangeType == Rank_Points) { if(bRanged) { - FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points_Ranged", client, RoundToZero(aCache[fCRFrom]), RoundToZero(aCache[fCRTo])); + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points_Ranged", client, RoundToZero(cache.fFrom), RoundToZero(cache.fTo)); } else { - FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points", client, RoundToZero(aCache[fCRFrom])); + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points", client, RoundToZero(cache.fFrom)); } } } @@ -1025,33 +1004,27 @@ void PreviewChat(int client, int rank) ReplaceString(sOriginalName, MAXLENGTH_NAME, gS_ControlCharacters[i], ""); } - any[] aCache = new any[CRCACHE_SIZE]; - gA_ChatRanks.GetArray(rank, aCache, view_as(CRCACHE_SIZE)); + chatranks_cache_t cache; + gA_ChatRanks.GetArray(rank, cache, sizeof(chatranks_cache_t)); char sName[MAXLENGTH_NAME]; - strcopy(sName, MAXLENGTH_NAME, aCache[sCRName]); + strcopy(sName, MAXLENGTH_NAME, cache.sName); char sCMessage[MAXLENGTH_CMESSAGE]; - strcopy(sCMessage, MAXLENGTH_CMESSAGE, aCache[sCRMessage]); + strcopy(sCMessage, MAXLENGTH_CMESSAGE, cache.sMessage); FormatChat(client, sName, MAXLENGTH_NAME); - - if(gEV_Type == Engine_CSGO) - { - FormatEx(sOriginalName, MAXLENGTH_NAME, " %s", sName); - } - - else - { - strcopy(sOriginalName, MAXLENGTH_NAME, sName); - } + strcopy(sOriginalName, MAXLENGTH_NAME, sName); FormatChat(client, sCMessage, MAXLENGTH_CMESSAGE); char sSampleText[MAXLENGTH_MESSAGE]; FormatEx(sSampleText, MAXLENGTH_MESSAGE, "%sThe quick brown fox jumps over the lazy dog", sCMessage); - ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, gS_Colon, sSampleText); + char sColon[MAXLENGTH_CMESSAGE]; + gCV_Colon.GetString(sColon, MAXLENGTH_CMESSAGE); + + ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, sColon, sSampleText); Handle hSayText2 = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS); @@ -1059,7 +1032,10 @@ void PreviewChat(int client, int rank) { if(gB_Protobuf) { - Protobuf pbmsg = view_as(hSayText2); + // show colors in cs:go + Format(sTextFormatting, MAXLENGTH_BUFFER, " %s", sTextFormatting); + + Protobuf pbmsg = UserMessageToProtobuf(hSayText2); pbmsg.SetInt("ent_idx", client); pbmsg.SetBool("chat", true); pbmsg.SetString("msg_name", sTextFormatting); @@ -1068,17 +1044,14 @@ void PreviewChat(int client, int rank) { pbmsg.AddString("params", ""); } - - delete pbmsg; } else { - BfWrite bfmsg = view_as(hSayText2); + BfWrite bfmsg = UserMessageToBfWrite(hSayText2); bfmsg.WriteByte(client); bfmsg.WriteByte(true); bfmsg.WriteString(sTextFormatting); - delete bfmsg; } } @@ -1087,7 +1060,7 @@ void PreviewChat(int client, int rank) bool HasRankAccess(int client, int rank) { - bool bAllowCustom = gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2); + bool bAllowCustom = gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2); if(rank == -2 || (rank == -1 && bAllowCustom)) @@ -1100,11 +1073,11 @@ bool HasRankAccess(int client, int rank) return false; } - any[] aCache = new any[CRCACHE_SIZE]; - gA_ChatRanks.GetArray(rank, aCache, view_as(CRCACHE_SIZE)); + chatranks_cache_t cache; + gA_ChatRanks.GetArray(rank, cache, sizeof(chatranks_cache_t)); char sFlag[32]; - strcopy(sFlag, 32, aCache[sCRAdminFlag]); + strcopy(sFlag, 32, cache.sAdminFlag); bool bFlagAccess = false; int iSize = strlen(sFlag); @@ -1134,21 +1107,21 @@ bool HasRankAccess(int client, int rank) return false; } - if(aCache[bCRFree]) + if(cache.bFree) { return true; } - if(!gB_Rankings || !gB_RankingsIntegration) + if(!gB_Rankings || !gCV_RankingsIntegration.BoolValue) { return false; } - float fRank = (aCache[iCRRangeType] != Rank_Points)? float(Shavit_GetRank(client)):Shavit_GetPoints(client); + float fRank = (cache.iRangeType != Rank_Points)? float(Shavit_GetRank(client)):Shavit_GetPoints(client); - if(aCache[iCRRangeType] == Rank_Flat || aCache[iCRRangeType] == Rank_Points) + if(cache.iRangeType == Rank_Flat || cache.iRangeType == Rank_Points) { - if(aCache[fCRFrom] <= fRank <= aCache[fCRTo]) + if(cache.fFrom <= fRank <= cache.fTo) { return true; } @@ -1166,7 +1139,7 @@ bool HasRankAccess(int client, int rank) float fPercentile = (fRank / iRanked) * 100.0; - if(aCache[fCRFrom] <= fPercentile <= aCache[fCRTo]) + if(cache.fFrom <= fPercentile <= cache.fTo) { return true; } @@ -1202,11 +1175,11 @@ void GetPlayerChatSettings(int client, char[] name, char[] message) if(0 <= iRank <= (iLength - 1)) { - any[] aCache = new any[CRCACHE_SIZE]; - gA_ChatRanks.GetArray(iRank, aCache, view_as(CRCACHE_SIZE)); + chatranks_cache_t cache; + gA_ChatRanks.GetArray(iRank, cache, sizeof(chatranks_cache_t)); - strcopy(name, MAXLENGTH_NAME, aCache[sCRName]); - strcopy(message, MAXLENGTH_NAME, aCache[sCRMessage]); + strcopy(name, MAXLENGTH_NAME, cache.sName); + strcopy(message, MAXLENGTH_NAME, cache.sMessage); } } @@ -1221,7 +1194,7 @@ public Action Command_CCList(int client, int args) continue; } - if(gI_CustomChat > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)) + if(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2)) { PrintToConsole(client, "%N (%d/#%d) (name: \"%s\"; message: \"%s\")", i, i, GetClientUserId(i), gS_CustomName[i], gS_CustomMessage[i]); } @@ -1378,7 +1351,7 @@ public void SQL_CreateTable_Callback(Database db, DBResultSet results, const cha continue; } - if(gI_CustomChat > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)) + if(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2)) { LoadFromDatabase(i); } diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index 8d2a79bb..bf00d882 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -33,9 +33,33 @@ // #define DEBUG +enum struct playertimer_t +{ + bool bEnabled; + float fTimer; + bool bPaused; + int iJumps; + int iStyle; + bool bAuto; + int iLastButtons; + int iStrafes; + float fLastAngle; + int iTotalMeasures; + int iGoodGains; + bool bDoubleSteps; + float fStrafeWarning; + bool bPracticeMode; + int iSHSWCombination; + int iTrack; + int iMeasuredJumps; + int iPerfectJumps; + int iGroundTicks; + MoveType iMoveType; +} + // game type (CS:S/CS:GO/TF2) -ServerGame gSG_Type = Game_Unknown; // deperecated and here for backwards compatibility EngineVersion gEV_Type = Engine_Unknown; +bool gB_Protobuf = false; // database handle Database gH_SQL = null; @@ -58,29 +82,16 @@ Handle gH_Forwards_OnUserCmdPre = null; Handle gH_Forwards_OnTimerIncrement = null; Handle gH_Forwards_OnTimerIncrementPost = null; -// timer variables -bool gB_TimerEnabled[MAXPLAYERS+1]; -float gF_PlayerTimer[MAXPLAYERS+1]; -float gF_PausePosition[MAXPLAYERS+1][3][3]; -bool gB_ClientPaused[MAXPLAYERS+1]; -int gI_Jumps[MAXPLAYERS+1]; -int gI_Style[MAXPLAYERS+1]; -bool gB_Auto[MAXPLAYERS+1]; -int gI_ButtonCache[MAXPLAYERS+1]; -int gI_Strafes[MAXPLAYERS+1]; -float gF_AngleCache[MAXPLAYERS+1]; -int gI_TotalMeasures[MAXPLAYERS+1]; -int gI_GoodGains[MAXPLAYERS+1]; -bool gB_DoubleSteps[MAXPLAYERS+1]; -float gF_StrafeWarning[MAXPLAYERS+1]; -bool gB_PracticeMode[MAXPLAYERS+1]; -int gI_SHSW_FirstCombination[MAXPLAYERS+1]; -int gI_Track[MAXPLAYERS+1]; -int gI_MeasuredJumps[MAXPLAYERS+1]; -int gI_PerfectJumps[MAXPLAYERS+1]; - StringMap gSM_StyleCommands = null; +// player timer variables +playertimer_t gA_Timers[MAXPLAYERS+1]; + +// these are here until the compiler bug is fixed +float gF_PauseOrigin[MAXPLAYERS+1][3]; +float gF_PauseAngles[MAXPLAYERS+1][3]; +float gF_PauseVelocity[MAXPLAYERS+1][3]; + // cookies Handle gH_StyleCookie = null; Handle gH_AutoBhopCookie = null; @@ -103,14 +114,9 @@ ConVar gCV_BlockPreJump = null; ConVar gCV_NoZAxisSpeed = null; ConVar gCV_VelocityTeleport = null; ConVar gCV_DefaultStyle = null; +ConVar gCV_NoChatSound = null; // cached cvars -bool gB_Restart = true; -bool gB_Pause = true; -bool gB_AllowTimerWithoutZone = false; -bool gB_BlockPreJump = false; -bool gB_NoZAxisSpeed = true; -bool gB_VelocityTeleport = false; int gI_DefaultStyle = 0; bool gB_StyleCookies = true; @@ -125,18 +131,16 @@ ConVar sv_enablebunnyhopping = null; // timer settings bool gB_Registered = false; int gI_Styles = 0; -char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128]; -any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE]; +stylestrings_t gS_StyleStrings[STYLE_LIMIT]; +stylesettings_t gA_StyleSettings[STYLE_LIMIT]; // chat settings -char gS_ChatStrings[CHATSETTINGS_SIZE][128]; +chatstrings_t gS_ChatStrings; // misc cache bool gB_StopChatSound = false; bool gB_HookedJump = false; char gS_LogPath[PLATFORM_MAX_PATH]; -int gI_GroundTicks[MAXPLAYERS+1]; -MoveType gMT_MoveType[MAXPLAYERS+1]; char gS_DeleteMap[MAXPLAYERS+1][160]; // flags @@ -221,21 +225,15 @@ public void OnPluginStart() // game types gEV_Type = GetEngineVersion(); + gB_Protobuf = (GetUserMessageType() == UM_Protobuf); - if(gEV_Type == Engine_CSS || gEV_Type == Engine_TF2) + if(gEV_Type == Engine_CSGO) { - gSG_Type = Game_CSS; - } - - else if(gEV_Type == Engine_CSGO) - { - gSG_Type = Game_CSGO; - sv_autobunnyhopping = FindConVar("sv_autobunnyhopping"); sv_autobunnyhopping.BoolValue = false; } - else + else if(gEV_Type != Engine_CSS && gEV_Type != Engine_TF2) { SetFailState("This plugin was meant to be used in CS:S, CS:GO and TF2 *only*."); } @@ -313,13 +311,8 @@ public void OnPluginStart() gCV_NoZAxisSpeed = CreateConVar("shavit_core_nozaxisspeed", "1", "Don't start timer if vertical speed exists (btimes style).", 0, true, 0.0, true, 1.0); gCV_VelocityTeleport = CreateConVar("shavit_core_velocityteleport", "0", "Teleport the client when changing its velocity? (for special styles)", 0, true, 0.0, true, 1.0); gCV_DefaultStyle = CreateConVar("shavit_core_defaultstyle", "0", "Default style ID.\nAdd the '!' prefix to disable style cookies - i.e. \"!3\" to *force* scroll to be the default style.", 0, true, 0.0); + gCV_NoChatSound = CreateConVar("shavit_core_nochatsound", "0", "Disables click sound for chat messages.", 0, true, 0.0, true, 1.0); - gCV_Restart.AddChangeHook(OnConVarChanged); - gCV_Pause.AddChangeHook(OnConVarChanged); - gCV_AllowTimerWithoutZone.AddChangeHook(OnConVarChanged); - gCV_BlockPreJump.AddChangeHook(OnConVarChanged); - gCV_NoZAxisSpeed.AddChangeHook(OnConVarChanged); - gCV_VelocityTeleport.AddChangeHook(OnConVarChanged); gCV_DefaultStyle.AddChangeHook(OnConVarChanged); AutoExecConfig(); @@ -355,18 +348,8 @@ public void OnPluginStart() public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) { - gB_Restart = gCV_Restart.BoolValue; - gB_Pause = gCV_Pause.BoolValue; - gB_AllowTimerWithoutZone = gCV_AllowTimerWithoutZone.BoolValue; - gB_BlockPreJump = gCV_BlockPreJump.BoolValue; - gB_NoZAxisSpeed = gCV_NoZAxisSpeed.BoolValue; - gB_VelocityTeleport = gCV_VelocityTeleport.BoolValue; - - if(convar == gCV_DefaultStyle) - { - gB_StyleCookies = newValue[0] != '!'; - gI_DefaultStyle = StringToInt(newValue[1]); - } + gB_StyleCookies = (newValue[0] != '!'); + gI_DefaultStyle = StringToInt(newValue[1]); } public void OnLibraryAdded(const char[] name) @@ -455,11 +438,11 @@ public Action Command_StartTimer(int client, int args) char sCommand[16]; GetCmdArg(0, sCommand, 16); - if(!gB_Restart) + if(!gCV_Restart.BoolValue) { if(args != -1) { - Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings[sMessageVariable], sCommand, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings.sVariable, sCommand, gS_ChatStrings.sText); } return Plugin_Handled; @@ -472,14 +455,14 @@ public Action Command_StartTimer(int client, int args) track = Track_Bonus; } - if(gB_AllowTimerWithoutZone || (gB_Zones && (Shavit_ZoneExists(Zone_Start, track) || gB_KZMap))) + if(gCV_AllowTimerWithoutZone.BoolValue || (gB_Zones && (Shavit_ZoneExists(Zone_Start, track) || gB_KZMap))) { Call_StartForward(gH_Forwards_OnRestart); Call_PushCell(client); Call_PushCell(track); Call_Finish(); - if(gB_AllowTimerWithoutZone) + if(gCV_AllowTimerWithoutZone.BoolValue) { StartTimer(client, track); } @@ -487,7 +470,7 @@ public Action Command_StartTimer(int client, int args) else { - Shavit_PrintToChat(client, "%T", "StartZoneUndefined", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "StartZoneUndefined", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } return Plugin_Handled; @@ -522,7 +505,7 @@ public Action Command_TeleportEnd(int client, int args) else { - Shavit_PrintToChat(client, "%T", "EndZoneUndefined", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "EndZoneUndefined", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } return Plugin_Handled; @@ -542,52 +525,52 @@ public Action Command_StopTimer(int client, int args) public Action Command_TogglePause(int client, int args) { - if(!IsValidClient(client) || !gB_TimerEnabled[client]) + if(!IsValidClient(client) || !gA_Timers[client].bEnabled) { return Plugin_Handled; } - if(Shavit_InsideZone(client, Zone_Start, gI_Track[client])) + if(Shavit_InsideZone(client, Zone_Start, gA_Timers[client].iTrack)) { - Shavit_PrintToChat(client, "%T", "PauseStartZone", client, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "PauseStartZone", client, gS_ChatStrings.sText, gS_ChatStrings.sWarning, gS_ChatStrings.sText, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return Plugin_Handled; } - if(!gB_Pause) + if(!gCV_Pause.BoolValue) { char sCommand[16]; GetCmdArg(0, sCommand, 16); - Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings[sMessageVariable], sCommand, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings.sVariable, sCommand, gS_ChatStrings.sText); return Plugin_Handled; } if(GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1 && GetEntityMoveType(client) != MOVETYPE_LADDER) { - Shavit_PrintToChat(client, "%T", "PauseNotOnGround", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "PauseNotOnGround", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } - if(gB_ClientPaused[client]) + if(gA_Timers[client].bPaused) { - TeleportEntity(client, gF_PausePosition[client][0], gF_PausePosition[client][1], gF_PausePosition[client][2]); + TeleportEntity(client, gF_PauseOrigin[client], gF_PauseAngles[client], gF_PauseVelocity[client]); ResumeTimer(client); - Shavit_PrintToChat(client, "%T", "MessageUnpause", client, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MessageUnpause", client, gS_ChatStrings.sText, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } else { - GetClientAbsOrigin(client, gF_PausePosition[client][0]); - GetClientEyeAngles(client, gF_PausePosition[client][1]); - GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", gF_PausePosition[client][2]); + GetClientAbsOrigin(client, gF_PauseOrigin[client]); + GetClientEyeAngles(client, gF_PauseAngles[client]); + GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", gF_PauseVelocity[client]); PauseTimer(client); - Shavit_PrintToChat(client, "%T", "MessagePause", client, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MessagePause", client, gS_ChatStrings.sText, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } return Plugin_Handled; @@ -596,7 +579,7 @@ public Action Command_TogglePause(int client, int args) #if defined DEBUG public Action Command_FinishTest(int client, int args) { - Shavit_FinishMap(client, gI_Track[client]); + Shavit_FinishMap(client, gA_Timers[client].iTrack); return Plugin_Handled; } @@ -660,20 +643,20 @@ public Action Command_AutoBhop(int client, int args) return Plugin_Handled; } - gB_Auto[client] = !gB_Auto[client]; + gA_Timers[client].bAuto = !gA_Timers[client].bAuto; - if(gB_Auto[client]) + if(gA_Timers[client].bAuto) { - Shavit_PrintToChat(client, "%T", "AutobhopEnabled", client, gS_ChatStrings[sMessageVariable2], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "AutobhopEnabled", client, gS_ChatStrings.sVariable2, gS_ChatStrings.sText); } else { - Shavit_PrintToChat(client, "%T", "AutobhopDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "AutobhopDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } char sAutoBhop[4]; - IntToString(view_as(gB_Auto[client]), sAutoBhop, 4); + IntToString(view_as(gA_Timers[client].bAuto), sAutoBhop, 4); SetClientCookie(client, gH_AutoBhopCookie, sAutoBhop); UpdateStyleSettings(client); @@ -683,7 +666,7 @@ public Action Command_AutoBhop(int client, int args) public Action Command_DoubleStep(int client, const char[] command, int args) { - gB_DoubleSteps[client] = (command[0] == '+'); + gA_Timers[client].bDoubleSteps = (command[0] == '+'); return Plugin_Handled; } @@ -705,9 +688,9 @@ public Action Command_Style(int client, int args) char sDisplay[64]; - if(gA_StyleSettings[i][bUnranked]) + if(gA_StyleSettings[i].bUnranked) { - FormatEx(sDisplay, 64, "%T %s", "StyleUnranked", client, gS_StyleStrings[i][sStyleName]); + FormatEx(sDisplay, 64, "%T %s", "StyleUnranked", client, gS_StyleStrings[i].sStyleName); } else @@ -716,7 +699,7 @@ public Action Command_Style(int client, int args) if(gB_WR) { - Shavit_GetWRTime(i, time, Track_Main); + time = Shavit_GetWorldRecord(i, Track_Main); } if(time > 0.0) @@ -724,16 +707,16 @@ public Action Command_Style(int client, int args) char sTime[32]; FormatSeconds(time, sTime, 32, false); - FormatEx(sDisplay, 64, "%s - WR: %s", gS_StyleStrings[i][sStyleName], sTime); + FormatEx(sDisplay, 64, "%s - WR: %s", gS_StyleStrings[i].sStyleName, sTime); } else { - strcopy(sDisplay, 64, gS_StyleStrings[i][sStyleName]); + strcopy(sDisplay, 64, gS_StyleStrings[i].sStyleName); } } - menu.AddItem(sInfo, sDisplay, (gI_Style[client] == i || !Shavit_HasStyleAccess(client, i))? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); + menu.AddItem(sInfo, sDisplay, (gA_Timers[client].iStyle == i || !Shavit_HasStyleAccess(client, i))? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); } // should NEVER happen @@ -784,11 +767,11 @@ void CallOnStyleChanged(int client, int oldstyle, int newstyle, bool manual) Call_PushCell(client); Call_PushCell(oldstyle); Call_PushCell(newstyle); - Call_PushCell(gI_Track[client]); + Call_PushCell(gA_Timers[client].iTrack); Call_PushCell(manual); Call_Finish(); - gI_Style[client] = newstyle; + gA_Timers[client].iStyle = newstyle; UpdateStyleSettings(client); } @@ -804,7 +787,7 @@ void ChangeClientStyle(int client, int style, bool manual) { if(manual) { - Shavit_PrintToChat(client, "%T", "StyleNoAccess", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "StyleNoAccess", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } return; @@ -812,31 +795,31 @@ void ChangeClientStyle(int client, int style, bool manual) if(manual) { - Shavit_PrintToChat(client, "%T", "StyleSelection", client, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "StyleSelection", client, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText); } - if(gA_StyleSettings[style][bUnranked]) + if(gA_StyleSettings[style].bUnranked) { - Shavit_PrintToChat(client, "%T", "UnrankedWarning", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "UnrankedWarning", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } - int aa_old = RoundToZero(gA_StyleSettings[gI_Style[client]][fAiraccelerate]); - int aa_new = RoundToZero(gA_StyleSettings[style][fAiraccelerate]); + int aa_old = RoundToZero(gA_StyleSettings[gA_Timers[client].iStyle].fAiraccelerate); + int aa_new = RoundToZero(gA_StyleSettings[style].fAiraccelerate); if(aa_old != aa_new) { - Shavit_PrintToChat(client, "%T", "NewAiraccelerate", client, aa_old, gS_ChatStrings[sMessageVariable], aa_new, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "NewAiraccelerate", client, aa_old, gS_ChatStrings.sVariable, aa_new, gS_ChatStrings.sText); } - CallOnStyleChanged(client, gI_Style[client], style, manual); + CallOnStyleChanged(client, gA_Timers[client].iStyle, style, manual); StopTimer(client); - if(gB_AllowTimerWithoutZone || (gB_Zones && (Shavit_ZoneExists(Zone_Start, gI_Track[client]) || gB_KZMap))) + if(gCV_AllowTimerWithoutZone.BoolValue || (gB_Zones && (Shavit_ZoneExists(Zone_Start, gA_Timers[client].iTrack) || gB_KZMap))) { Call_StartForward(gH_Forwards_OnRestart); Call_PushCell(client); - Call_PushCell(gI_Track[client]); + Call_PushCell(gA_Timers[client].iTrack); Call_Finish(); } @@ -864,13 +847,13 @@ public void Player_Jump(Event event, const char[] name, bool dontBroadcast) void DoJump(int client) { - if(gB_TimerEnabled[client]) + if(gA_Timers[client].bEnabled) { - gI_Jumps[client]++; + gA_Timers[client].iJumps++; } // TF2 doesn't use stamina - if(gEV_Type != Engine_TF2 && (gA_StyleSettings[gI_Style[client]][bEasybhop]) || Shavit_InsideZone(client, Zone_Easybhop, gI_Track[client])) + if(gEV_Type != Engine_TF2 && (gA_StyleSettings[gA_Timers[client].iStyle].bEasybhop) || Shavit_InsideZone(client, Zone_Easybhop, gA_Timers[client].iTrack)) { SetEntPropFloat(client, Prop_Send, "m_flStamina", 0.0); } @@ -887,9 +870,9 @@ void VelocityChanges(int data) return; } - if(view_as(gA_StyleSettings[gI_Style[client]][fSpeedMultiplier]) != 1.0) + if(view_as(gA_StyleSettings[gA_Timers[client].iStyle].fSpeedMultiplier) != 1.0) { - SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", view_as(gA_StyleSettings[gI_Style[client]][fSpeedMultiplier])); + SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", view_as(gA_StyleSettings[gA_Timers[client].iStyle].fSpeedMultiplier)); } float fAbsVelocity[3]; @@ -902,9 +885,9 @@ void VelocityChanges(int data) return; } - float fVelocityMultiplier = view_as(gA_StyleSettings[gI_Style[client]][fVelocity]); - float fVelocityBonus = view_as(gA_StyleSettings[gI_Style[client]][fBonusVelocity]); - float fMin = view_as(gA_StyleSettings[gI_Style[client]][fMinVelocity]); + float fVelocityMultiplier = view_as(gA_StyleSettings[gA_Timers[client].iStyle].fVelocity); + float fVelocityBonus = view_as(gA_StyleSettings[gA_Timers[client].iStyle].fBonusVelocity); + float fMin = view_as(gA_StyleSettings[gA_Timers[client].iStyle].fMinVelocity); if(fVelocityMultiplier != 0.0) { @@ -926,7 +909,7 @@ void VelocityChanges(int data) fAbsVelocity[1] /= x; } - if(!gB_VelocityTeleport) + if(!gCV_VelocityTeleport.BoolValue) { SetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", fAbsVelocity); } @@ -947,7 +930,7 @@ public void Player_Death(Event event, const char[] name, bool dontBroadcast) public int Native_GetGameType(Handle handler, int numParams) { - return view_as(gSG_Type); + return view_as(gEV_Type); } public int Native_GetDatabase(Handle handler, int numParams) @@ -966,30 +949,30 @@ public int Native_GetTimer(Handle handler, int numParams) int client = GetNativeCell(1); // 2 - time - SetNativeCellRef(2, gF_PlayerTimer[client]); - SetNativeCellRef(3, gI_Jumps[client]); - SetNativeCellRef(4, gI_Style[client]); - SetNativeCellRef(5, gB_TimerEnabled[client]); + SetNativeCellRef(2, gA_Timers[client].fTimer); + SetNativeCellRef(3, gA_Timers[client].iJumps); + SetNativeCellRef(4, gA_Timers[client].iStyle); + SetNativeCellRef(5, gA_Timers[client].bEnabled); } public int Native_GetClientTime(Handle handler, int numParams) { - return view_as(gF_PlayerTimer[GetNativeCell(1)]); + return view_as(gA_Timers[GetNativeCell(1)].fTimer); } public int Native_GetClientTrack(Handle handler, int numParams) { - return gI_Track[GetNativeCell(1)]; + return gA_Timers[GetNativeCell(1)].iTrack; } public int Native_GetClientJumps(Handle handler, int numParams) { - return gI_Jumps[GetNativeCell(1)]; + return gA_Timers[GetNativeCell(1)].iJumps; } public int Native_GetBhopStyle(Handle handler, int numParams) { - return gI_Style[GetNativeCell(1)]; + return gA_Timers[GetNativeCell(1)].iStyle; } public int Native_GetTimerStatus(Handle handler, int numParams) @@ -1022,7 +1005,7 @@ public int Native_StopTimer(Handle handler, int numParams) Call_StartForward(gH_Forwards_Stop); Call_PushCell(client); - Call_PushCell(gI_Track[client]); + Call_PushCell(gA_Timers[client].iTrack); Call_Finish(); } @@ -1030,25 +1013,25 @@ public int Native_FinishMap(Handle handler, int numParams) { int client = GetNativeCell(1); - any[] snapshot = new any[TIMERSNAPSHOT_SIZE]; - snapshot[bTimerEnabled] = gB_TimerEnabled[client]; - snapshot[bClientPaused] = gB_ClientPaused[client]; - snapshot[iJumps] = gI_Jumps[client]; - snapshot[bsStyle] = gI_Style[client]; - snapshot[iStrafes] = gI_Strafes[client]; - snapshot[iTotalMeasures] = gI_TotalMeasures[client]; - snapshot[iGoodGains] = gI_GoodGains[client]; - snapshot[fServerTime] = GetEngineTime(); - snapshot[fCurrentTime] = gF_PlayerTimer[client]; - snapshot[iSHSWCombination] = gI_SHSW_FirstCombination[client]; - snapshot[iTimerTrack] = gI_Track[client]; - snapshot[iMeasuredJumps] = gI_MeasuredJumps[client]; - snapshot[iPerfectJumps] = gI_PerfectJumps[client]; + timer_snapshot_t snapshot; + snapshot.bTimerEnabled = gA_Timers[client].bEnabled; + snapshot.bClientPaused = gA_Timers[client].bPaused; + snapshot.iJumps = gA_Timers[client].iJumps; + snapshot.bsStyle = gA_Timers[client].iStyle; + snapshot.iStrafes = gA_Timers[client].iStrafes; + snapshot.iTotalMeasures = gA_Timers[client].iTotalMeasures; + snapshot.iGoodGains = gA_Timers[client].iGoodGains; + snapshot.fServerTime = GetEngineTime(); + snapshot.fCurrentTime = gA_Timers[client].fTimer; + snapshot.iSHSWCombination = gA_Timers[client].iSHSWCombination; + snapshot.iTimerTrack = gA_Timers[client].iTrack; + snapshot.iMeasuredJumps = gA_Timers[client].iMeasuredJumps; + snapshot.iPerfectJumps = gA_Timers[client].iPerfectJumps; Action result = Plugin_Continue; Call_StartForward(gH_Forwards_FinishPre); Call_PushCell(client); - Call_PushArrayEx(snapshot, TIMERSNAPSHOT_SIZE, SM_PARAM_COPYBACK); + Call_PushArrayEx(snapshot, sizeof(timer_snapshot_t), SM_PARAM_COPYBACK); Call_Finish(result); if(result != Plugin_Continue && result != Plugin_Changed) @@ -1065,31 +1048,31 @@ public int Native_FinishMap(Handle handler, int numParams) if(result == Plugin_Continue) { - Call_PushCell(style = gI_Style[client]); - Call_PushCell(gF_PlayerTimer[client]); - Call_PushCell(gI_Jumps[client]); - Call_PushCell(gI_Strafes[client]); - Call_PushCell((gA_StyleSettings[gI_Style[client]][bSync])? (gI_GoodGains[client] == 0)? 0.0:(gI_GoodGains[client] / float(gI_TotalMeasures[client]) * 100.0):-1.0); - Call_PushCell(track = gI_Track[client]); - perfs = (gI_MeasuredJumps[client] == 0)? 100.0:(gI_PerfectJumps[client] / float(gI_MeasuredJumps[client]) * 100.0); + Call_PushCell(style = gA_Timers[client].iStyle); + Call_PushCell(gA_Timers[client].fTimer); + Call_PushCell(gA_Timers[client].iJumps); + Call_PushCell(gA_Timers[client].iStrafes); + Call_PushCell((gA_StyleSettings[gA_Timers[client].iStyle].bSync)? (gA_Timers[client].iGoodGains == 0)? 0.0:(gA_Timers[client].iGoodGains / float(gA_Timers[client].iTotalMeasures) * 100.0):-1.0); + Call_PushCell(track = gA_Timers[client].iTrack); + perfs = (gA_Timers[client].iMeasuredJumps == 0)? 100.0:(gA_Timers[client].iPerfectJumps / float(gA_Timers[client].iMeasuredJumps) * 100.0); } else { - Call_PushCell(style = snapshot[bsStyle]); - Call_PushCell(snapshot[fCurrentTime]); - Call_PushCell(snapshot[iJumps]); - Call_PushCell(snapshot[iStrafes]); - Call_PushCell((gA_StyleSettings[snapshot[bsStyle]][bSync])? (snapshot[iGoodGains] == 0)? 0.0:(snapshot[iGoodGains] / float(snapshot[iTotalMeasures]) * 100.0):-1.0); - Call_PushCell(track = snapshot[iTimerTrack]); - perfs = (snapshot[iMeasuredJumps] == 0)? 100.0:(snapshot[iPerfectJumps] / float(snapshot[iMeasuredJumps]) * 100.0); + Call_PushCell(style = snapshot.bsStyle); + Call_PushCell(snapshot.fCurrentTime); + Call_PushCell(snapshot.iJumps); + Call_PushCell(snapshot.iStrafes); + Call_PushCell((gA_StyleSettings[snapshot.bsStyle].bSync)? (snapshot.iGoodGains == 0)? 0.0:(snapshot.iGoodGains / float(snapshot.iTotalMeasures) * 100.0):-1.0); + Call_PushCell(track = snapshot.iTimerTrack); + perfs = (snapshot.iMeasuredJumps == 0)? 100.0:(snapshot.iPerfectJumps / float(snapshot.iMeasuredJumps) * 100.0); } float oldtime = 0.0; if(gB_WR) { - Shavit_GetPlayerPB(client, style, oldtime, track); + oldtime = Shavit_GetClientPB(client, style, track); } Call_PushCell(oldtime); @@ -1129,27 +1112,37 @@ public int Native_PrintToChat(Handle handler, int numParams) char sBuffer[300]; FormatNativeString(0, 2, 3, 300, iWritten, sBuffer); - Format(sBuffer, 300, "%s %s%s", gS_ChatStrings[sMessagePrefix], gS_ChatStrings[sMessageText], sBuffer); + Format(sBuffer, 300, "%s %s%s", gS_ChatStrings.sPrefix, gS_ChatStrings.sText, sBuffer); - if(IsSource2013(gEV_Type)) + Handle hSayText2 = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS); + + if(gB_Protobuf) { - Handle hSayText2 = StartMessageOne("SayText2", client); + // show colors in cs:go + Format(sBuffer, 300, " %s", sBuffer); - if(hSayText2 != null) + Protobuf pbmsg = UserMessageToProtobuf(hSayText2); + pbmsg.SetInt("ent_idx", client); + pbmsg.SetBool("chat", !(gB_StopChatSound || gCV_NoChatSound.BoolValue)); + pbmsg.SetString("msg_name", sBuffer); + + // needed to not crash + for(int i = 1; i <= 4; i++) { - BfWriteByte(hSayText2, 0); - BfWriteByte(hSayText2, !gB_StopChatSound); - BfWriteString(hSayText2, sBuffer); + pbmsg.AddString("params", ""); } - - EndMessage(); } else { - PrintToChat(client, " %s", sBuffer); + BfWrite bfmsg = UserMessageToBfWrite(hSayText2); + bfmsg.WriteByte(client); + bfmsg.WriteByte(!(gB_StopChatSound || gCV_NoChatSound.BoolValue)); + bfmsg.WriteString(sBuffer); } + EndMessage(); + gB_StopChatSound = false; } @@ -1170,19 +1163,19 @@ public int Native_GetPerfectJumps(Handle handler, int numParams) { int client = GetNativeCell(1); - return view_as((gI_MeasuredJumps[client] == 0)? 100.0:(gI_PerfectJumps[client] / float(gI_MeasuredJumps[client]) * 100.0)); + return view_as((gA_Timers[client].iMeasuredJumps == 0)? 100.0:(gA_Timers[client].iPerfectJumps / float(gA_Timers[client].iMeasuredJumps) * 100.0)); } public int Native_GetStrafeCount(Handle handler, int numParams) { - return gI_Strafes[GetNativeCell(1)]; + return gA_Timers[GetNativeCell(1)].iStrafes; } public int Native_GetSync(Handle handler, int numParams) { int client = GetNativeCell(1); - return view_as((gA_StyleSettings[gI_Style[client]][bSync])? (gI_GoodGains[client] == 0)? 0.0:(gI_GoodGains[client] / float(gI_TotalMeasures[client]) * 100.0):-1.0); + return view_as((gA_StyleSettings[gA_Timers[client].iStyle].bSync)? (gA_Timers[client].iGoodGains == 0)? 0.0:(gA_Timers[client].iGoodGains / float(gA_Timers[client].iTotalMeasures) * 100.0):-1.0); } public int Native_GetStyleCount(Handle handler, int numParams) @@ -1192,17 +1185,45 @@ public int Native_GetStyleCount(Handle handler, int numParams) public int Native_GetStyleSettings(Handle handler, int numParams) { - return SetNativeArray(2, gA_StyleSettings[GetNativeCell(1)], STYLESETTINGS_SIZE); + return SetNativeArray(2, gA_StyleSettings[GetNativeCell(1)], sizeof(stylesettings_t)); } public int Native_GetStyleStrings(Handle handler, int numParams) { - return SetNativeString(3, gS_StyleStrings[GetNativeCell(1)][GetNativeCell(2)], GetNativeCell(4)); + int style = GetNativeCell(1); + int type = GetNativeCell(2); + int size = GetNativeCell(4); + + switch(type) + { + case sStyleName: return SetNativeString(3, gS_StyleStrings[style].sStyleName, size); + case sShortName: return SetNativeString(3, gS_StyleStrings[style].sShortName, size); + case sHTMLColor: return SetNativeString(3, gS_StyleStrings[style].sHTMLColor, size); + case sChangeCommand: return SetNativeString(3, gS_StyleStrings[style].sChangeCommand, size); + case sClanTag: return SetNativeString(3, gS_StyleStrings[style].sClanTag, size); + case sSpecialString: return SetNativeString(3, gS_StyleStrings[style].sSpecialString, size); + case sStylePermission: return SetNativeString(3, gS_StyleStrings[style].sStylePermission, size); + } + + return -1; } public int Native_GetChatStrings(Handle handler, int numParams) { - return SetNativeString(2, gS_ChatStrings[GetNativeCell(1)], GetNativeCell(3)); + int type = GetNativeCell(1); + int size = GetNativeCell(3); + + switch(type) + { + case sMessagePrefix: return SetNativeString(2, gS_ChatStrings.sPrefix, size); + case sMessageText: return SetNativeString(2, gS_ChatStrings.sText, size); + case sMessageWarning: return SetNativeString(2, gS_ChatStrings.sWarning, size); + case sMessageVariable: return SetNativeString(2, gS_ChatStrings.sVariable, size); + case sMessageVariable2: return SetNativeString(2, gS_ChatStrings.sVariable2, size); + case sMessageStyle: return SetNativeString(2, gS_ChatStrings.sStyle, size); + } + + return -1; } public int Native_SetPracticeMode(Handle handler, int numParams) @@ -1211,66 +1232,66 @@ public int Native_SetPracticeMode(Handle handler, int numParams) bool practice = view_as(GetNativeCell(2)); bool alert = view_as(GetNativeCell(3)); - if(alert && practice && !gB_PracticeMode[client] && (!gB_HUD || (Shavit_GetHUDSettings(client) & HUD_NOPRACALERT) == 0)) + if(alert && practice && !gA_Timers[client].bPracticeMode && (!gB_HUD || (Shavit_GetHUDSettings(client) & HUD_NOPRACALERT) == 0)) { - Shavit_PrintToChat(client, "%T", "PracticeModeAlert", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "PracticeModeAlert", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } - gB_PracticeMode[client] = practice; + gA_Timers[client].bPracticeMode = practice; } public int Native_IsPracticeMode(Handle handler, int numParams) { - return view_as(gB_PracticeMode[GetNativeCell(1)]); + return view_as(gA_Timers[GetNativeCell(1)].bPracticeMode); } public int Native_SaveSnapshot(Handle handler, int numParams) { int client = GetNativeCell(1); - any[] snapshot = new any[TIMERSNAPSHOT_SIZE]; - snapshot[bTimerEnabled] = gB_TimerEnabled[client]; - snapshot[bClientPaused] = gB_ClientPaused[client]; - snapshot[iJumps] = gI_Jumps[client]; - snapshot[bsStyle] = gI_Style[client]; - snapshot[iStrafes] = gI_Strafes[client]; - snapshot[iTotalMeasures] = gI_TotalMeasures[client]; - snapshot[iGoodGains] = gI_GoodGains[client]; - snapshot[fServerTime] = GetEngineTime(); - snapshot[fCurrentTime] = gF_PlayerTimer[client]; - snapshot[iSHSWCombination] = gI_SHSW_FirstCombination[client]; - snapshot[iTimerTrack] = gI_Track[client]; - snapshot[iMeasuredJumps] = gI_MeasuredJumps[client]; - snapshot[iPerfectJumps] = gI_PerfectJumps[client]; + timer_snapshot_t snapshot; + snapshot.bTimerEnabled = gA_Timers[client].bEnabled; + snapshot.bClientPaused = gA_Timers[client].bPaused; + snapshot.iJumps = gA_Timers[client].iJumps; + snapshot.bsStyle = gA_Timers[client].iStyle; + snapshot.iStrafes = gA_Timers[client].iStrafes; + snapshot.iTotalMeasures = gA_Timers[client].iTotalMeasures; + snapshot.iGoodGains = gA_Timers[client].iGoodGains; + snapshot.fServerTime = GetEngineTime(); + snapshot.fCurrentTime = gA_Timers[client].fTimer; + snapshot.iSHSWCombination = gA_Timers[client].iSHSWCombination; + snapshot.iTimerTrack = gA_Timers[client].iTrack; + snapshot.iMeasuredJumps = gA_Timers[client].iMeasuredJumps; + snapshot.iPerfectJumps = gA_Timers[client].iPerfectJumps; - return SetNativeArray(2, snapshot, TIMERSNAPSHOT_SIZE); + return SetNativeArray(2, snapshot, sizeof(timer_snapshot_t)); } public int Native_LoadSnapshot(Handle handler, int numParams) { int client = GetNativeCell(1); - any[] snapshot = new any[TIMERSNAPSHOT_SIZE]; - GetNativeArray(2, snapshot, TIMERSNAPSHOT_SIZE); + timer_snapshot_t snapshot; + GetNativeArray(2, snapshot, sizeof(timer_snapshot_t)); - gI_Track[client] = view_as(snapshot[iTimerTrack]); + gA_Timers[client].iTrack = snapshot.iTimerTrack; - if(gI_Style[client] != snapshot[bsStyle] && Shavit_HasStyleAccess(client, snapshot[bsStyle])) + if(gA_Timers[client].iStyle != snapshot.bsStyle && Shavit_HasStyleAccess(client, snapshot.bsStyle)) { - CallOnStyleChanged(client, gI_Style[client], snapshot[bsStyle], false); + CallOnStyleChanged(client, gA_Timers[client].iStyle, snapshot.bsStyle, false); } - gB_TimerEnabled[client] = view_as(snapshot[bTimerEnabled]); - gB_ClientPaused[client] = view_as(snapshot[bClientPaused]); - gI_Jumps[client] = view_as(snapshot[iJumps]); - gI_Style[client] = snapshot[bsStyle]; - gI_Strafes[client] = view_as(snapshot[iStrafes]); - gI_TotalMeasures[client] = view_as(snapshot[iTotalMeasures]); - gI_GoodGains[client] = view_as(snapshot[iGoodGains]); - gF_PlayerTimer[client] = snapshot[fCurrentTime]; - gI_SHSW_FirstCombination[client] = view_as(snapshot[iSHSWCombination]); - gI_MeasuredJumps[client] = view_as(snapshot[iMeasuredJumps]); - gI_PerfectJumps[client] = view_as(snapshot[iPerfectJumps]); + gA_Timers[client].bEnabled = snapshot.bTimerEnabled; + gA_Timers[client].bPaused = snapshot.bClientPaused; + gA_Timers[client].iJumps = snapshot.iJumps; + gA_Timers[client].iStyle = snapshot.bsStyle; + gA_Timers[client].iStrafes = snapshot.iStrafes; + gA_Timers[client].iTotalMeasures = snapshot.iTotalMeasures; + gA_Timers[client].iGoodGains = snapshot.iGoodGains; + gA_Timers[client].fTimer = snapshot.fCurrentTime; + gA_Timers[client].iSHSWCombination = snapshot.iSHSWCombination; + gA_Timers[client].iMeasuredJumps = snapshot.iMeasuredJumps; + gA_Timers[client].iPerfectJumps = snapshot.iPerfectJumps; } public int Native_LogMessage(Handle plugin, int numParams) @@ -1297,12 +1318,12 @@ public int Native_MarkKZMap(Handle handler, int numParams) int GetTimerStatus(int client) { - if(!gB_TimerEnabled[client]) + if(!gA_Timers[client].bEnabled) { return view_as(Timer_Stopped); } - else if(gB_ClientPaused[client]) + else if(gA_Timers[client].bPaused) { return view_as(Timer_Paused); } @@ -1320,7 +1341,7 @@ void StartTimer(int client, int track) float fSpeed[3]; GetEntPropVector(client, Prop_Data, "m_vecVelocity", fSpeed); - if(!gB_NoZAxisSpeed || gA_StyleSettings[gI_Style[client]][bPrespeed] || (fSpeed[2] == 0.0 && SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0)) <= 290.0)) + if(!gCV_NoZAxisSpeed.BoolValue || gA_StyleSettings[gA_Timers[client].iStyle].bPrespeed || (fSpeed[2] == 0.0 && SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0)) <= 290.0)) { Action result = Plugin_Continue; Call_StartForward(gH_Forwards_Start); @@ -1330,27 +1351,26 @@ void StartTimer(int client, int track) if(result == Plugin_Continue) { - gB_ClientPaused[client] = false; - gI_Strafes[client] = 0; - gI_Jumps[client] = 0; - gI_TotalMeasures[client] = 0; - gI_GoodGains[client] = 0; - gF_PlayerTimer[client] = 0.0; - gI_Track[client] = track; - gB_TimerEnabled[client] = true; - gI_SHSW_FirstCombination[client] = -1; - gF_PlayerTimer[client] = 0.0; - gB_PracticeMode[client] = false; - gI_MeasuredJumps[client] = 0; - gI_PerfectJumps[client] = 0; + gA_Timers[client].bPaused = false; + gA_Timers[client].iStrafes = 0; + gA_Timers[client].iJumps = 0; + gA_Timers[client].iTotalMeasures = 0; + gA_Timers[client].iGoodGains = 0; + gA_Timers[client].iTrack = track; + gA_Timers[client].bEnabled = true; + gA_Timers[client].iSHSWCombination = -1; + gA_Timers[client].fTimer = 0.0; + gA_Timers[client].bPracticeMode = false; + gA_Timers[client].iMeasuredJumps = 0; + gA_Timers[client].iPerfectJumps = 0; - SetEntityGravity(client, view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier])); - SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", view_as(gA_StyleSettings[gI_Style[client]][fSpeedMultiplier])); + SetEntityGravity(client, view_as(gA_StyleSettings[gA_Timers[client].iStyle].fGravityMultiplier)); + SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", view_as(gA_StyleSettings[gA_Timers[client].iStyle].fSpeedMultiplier)); } else if(result == Plugin_Handled || result == Plugin_Stop) { - gB_TimerEnabled[client] = false; + gA_Timers[client].bEnabled = false; } } } @@ -1362,13 +1382,13 @@ void StopTimer(int client) return; } - gB_TimerEnabled[client] = false; - gI_Jumps[client] = 0; - gF_PlayerTimer[client] = 0.0; - gB_ClientPaused[client] = false; - gI_Strafes[client] = 0; - gI_TotalMeasures[client] = 0; - gI_GoodGains[client] = 0; + gA_Timers[client].bEnabled = false; + gA_Timers[client].iJumps = 0; + gA_Timers[client].fTimer = 0.0; + gA_Timers[client].bPaused = false; + gA_Timers[client].iStrafes = 0; + gA_Timers[client].iTotalMeasures = 0; + gA_Timers[client].iGoodGains = 0; } void PauseTimer(int client) @@ -1380,10 +1400,10 @@ void PauseTimer(int client) Call_StartForward(gH_Forwards_OnPause); Call_PushCell(client); - Call_PushCell(gI_Track[client]); + Call_PushCell(gA_Timers[client].iTrack); Call_Finish(); - gB_ClientPaused[client] = true; + gA_Timers[client].bPaused = true; } void ResumeTimer(int client) @@ -1395,10 +1415,10 @@ void ResumeTimer(int client) Call_StartForward(gH_Forwards_OnResume); Call_PushCell(client); - Call_PushCell(gI_Track[client]); + Call_PushCell(gA_Timers[client].iTrack); Call_Finish(); - gB_ClientPaused[client] = false; + gA_Timers[client].bPaused = false; } public void OnClientDisconnect(int client) @@ -1420,7 +1440,7 @@ public void OnClientCookiesCached(int client) GetClientCookie(client, gH_AutoBhopCookie, sCookie, 4); } - gB_Auto[client] = (strlen(sCookie) > 0)? view_as(StringToInt(sCookie)):true; + gA_Timers[client].bAuto = (strlen(sCookie) > 0)? view_as(StringToInt(sCookie)):true; int style = gI_DefaultStyle; @@ -1437,7 +1457,7 @@ public void OnClientCookiesCached(int client) if(Shavit_HasStyleAccess(client, style)) { - CallOnStyleChanged(client, gI_Style[client], style, false); + CallOnStyleChanged(client, gA_Timers[client].iStyle, style, false); } } @@ -1450,13 +1470,13 @@ public void OnClientPutInServer(int client) return; } - gB_Auto[client] = true; - gB_DoubleSteps[client] = false; - gF_StrafeWarning[client] = 0.0; - gB_PracticeMode[client] = false; - gI_SHSW_FirstCombination[client] = -1; - gI_Track[client] = 0; - gI_Style[client] = 0; + gA_Timers[client].bAuto = true; + gA_Timers[client].bDoubleSteps = false; + gA_Timers[client].fStrafeWarning = 0.0; + gA_Timers[client].bPracticeMode = false; + gA_Timers[client].iSHSWCombination = -1; + gA_Timers[client].iTrack = 0; + gA_Timers[client].iStyle = 0; strcopy(gS_DeleteMap[client], 160, ""); if(AreClientCookiesCached(client)) @@ -1559,53 +1579,53 @@ bool LoadStyles() do { - kv.GetString("name", gS_StyleStrings[i][sStyleName], 128, ""); - kv.GetString("shortname", gS_StyleStrings[i][sShortName], 128, ""); - kv.GetString("htmlcolor", gS_StyleStrings[i][sHTMLColor], 128, ""); - kv.GetString("command", gS_StyleStrings[i][sChangeCommand], 128, ""); - kv.GetString("clantag", gS_StyleStrings[i][sClanTag], 128, ""); - kv.GetString("specialstring", gS_StyleStrings[i][sSpecialString], 128, ""); - kv.GetString("permission", gS_StyleStrings[i][sStylePermission], 128, ""); + kv.GetString("name", gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName), ""); + kv.GetString("shortname", gS_StyleStrings[i].sShortName, sizeof(stylestrings_t::sShortName), ""); + kv.GetString("htmlcolor", gS_StyleStrings[i].sHTMLColor, sizeof(stylestrings_t::sHTMLColor), ""); + kv.GetString("command", gS_StyleStrings[i].sChangeCommand, sizeof(stylestrings_t::sChangeCommand), ""); + kv.GetString("clantag", gS_StyleStrings[i].sClanTag, sizeof(stylestrings_t::sClanTag), ""); + kv.GetString("specialstring", gS_StyleStrings[i].sSpecialString, sizeof(stylestrings_t::sSpecialString), ""); + kv.GetString("permission", gS_StyleStrings[i].sStylePermission, sizeof(stylestrings_t::sStylePermission), ""); - gA_StyleSettings[i][bAutobhop] = view_as(kv.GetNum("autobhop", 1)); - gA_StyleSettings[i][bEasybhop] = view_as(kv.GetNum("easybhop", 1)); - gA_StyleSettings[i][bPrespeed] = view_as(kv.GetNum("prespeed", 0)); - gA_StyleSettings[i][fVelocityLimit] = kv.GetFloat("velocity_limit", 0.0); - gA_StyleSettings[i][fAiraccelerate] = kv.GetFloat("airaccelerate", 1000.0); - gA_StyleSettings[i][bEnableBunnyhopping] = view_as(kv.GetNum("bunnyhopping", 1)); - gA_StyleSettings[i][fRunspeed] = kv.GetFloat("runspeed", 260.00); - gA_StyleSettings[i][fGravityMultiplier] = kv.GetFloat("gravity", 1.0); - gA_StyleSettings[i][fSpeedMultiplier] = kv.GetFloat("speed", 1.0); - gA_StyleSettings[i][fTimescale] = view_as(kv.GetNum("halftime", 0))? 0.5:kv.GetFloat("timescale", 1.0); // backwards compat for old halftime setting - gA_StyleSettings[i][fVelocity] = kv.GetFloat("velocity", 1.0); - gA_StyleSettings[i][fBonusVelocity] = kv.GetFloat("bonus_velocity", 0.0); - gA_StyleSettings[i][fMinVelocity] = kv.GetFloat("min_velocity", 0.0); - gA_StyleSettings[i][bBlockW] = view_as(kv.GetNum("block_w", 0)); - gA_StyleSettings[i][bBlockA] = view_as(kv.GetNum("block_a", 0)); - gA_StyleSettings[i][bBlockS] = view_as(kv.GetNum("block_s", 0)); - gA_StyleSettings[i][bBlockD] = view_as(kv.GetNum("block_d", 0)); - gA_StyleSettings[i][bBlockUse] = view_as(kv.GetNum("block_use", 0)); - gA_StyleSettings[i][iForceHSW] = kv.GetNum("force_hsw", 0); - gA_StyleSettings[i][iBlockPLeft] = kv.GetNum("block_pleft", 0); - gA_StyleSettings[i][iBlockPRight] = kv.GetNum("block_pright", 0); - gA_StyleSettings[i][iBlockPStrafe] = kv.GetNum("block_pstrafe", 0); - gA_StyleSettings[i][bUnranked] = view_as(kv.GetNum("unranked", 0)); - gA_StyleSettings[i][bNoReplay] = view_as(kv.GetNum("noreplay", 0)); - gA_StyleSettings[i][bSync] = view_as(kv.GetNum("sync", 1)); - gA_StyleSettings[i][bStrafeCountW] = view_as(kv.GetNum("strafe_count_w", false)); - gA_StyleSettings[i][bStrafeCountA] = view_as(kv.GetNum("strafe_count_a", 1)); - gA_StyleSettings[i][bStrafeCountS] = view_as(kv.GetNum("strafe_count_s", false)); - gA_StyleSettings[i][bStrafeCountD] = view_as(kv.GetNum("strafe_count_d", 1)); - gA_StyleSettings[i][fRankingMultiplier] = kv.GetFloat("rankingmultiplier", 1.00); - gA_StyleSettings[i][iSpecial] = kv.GetNum("special", 0); + gA_StyleSettings[i].bAutobhop = view_as(kv.GetNum("autobhop", 1)); + gA_StyleSettings[i].bEasybhop = view_as(kv.GetNum("easybhop", 1)); + gA_StyleSettings[i].bPrespeed = view_as(kv.GetNum("prespeed", 0)); + gA_StyleSettings[i].fVelocityLimit = kv.GetFloat("velocity_limit", 0.0); + gA_StyleSettings[i].fAiraccelerate = kv.GetFloat("airaccelerate", 1000.0); + gA_StyleSettings[i].bEnableBunnyhopping = view_as(kv.GetNum("bunnyhopping", 1)); + gA_StyleSettings[i].fRunspeed = kv.GetFloat("runspeed", 260.00); + gA_StyleSettings[i].fGravityMultiplier = kv.GetFloat("gravity", 1.0); + gA_StyleSettings[i].fSpeedMultiplier = kv.GetFloat("speed", 1.0); + gA_StyleSettings[i].fTimescale = view_as(kv.GetNum("halftime", 0))? 0.5:kv.GetFloat("timescale", 1.0); // backwards compat for old halftime settig + gA_StyleSettings[i].fVelocity = kv.GetFloat("velocity", 1.0); + gA_StyleSettings[i].fBonusVelocity = kv.GetFloat("bonus_velocity", 0.0); + gA_StyleSettings[i].fMinVelocity = kv.GetFloat("min_velocity", 0.0); + gA_StyleSettings[i].bBlockW = view_as(kv.GetNum("block_w", 0)); + gA_StyleSettings[i].bBlockA = view_as(kv.GetNum("block_a", 0)); + gA_StyleSettings[i].bBlockS = view_as(kv.GetNum("block_s", 0)); + gA_StyleSettings[i].bBlockD = view_as(kv.GetNum("block_d", 0)); + gA_StyleSettings[i].bBlockUse = view_as(kv.GetNum("block_use", 0)); + gA_StyleSettings[i].iForceHSW = kv.GetNum("force_hsw", 0); + gA_StyleSettings[i].iBlockPLeft = kv.GetNum("block_pleft", 0); + gA_StyleSettings[i].iBlockPRight = kv.GetNum("block_pright", 0); + gA_StyleSettings[i].iBlockPStrafe = kv.GetNum("block_pstrafe", 0); + gA_StyleSettings[i].bUnranked = view_as(kv.GetNum("unranked", 0)); + gA_StyleSettings[i].bNoReplay = view_as(kv.GetNum("noreplay", 0)); + gA_StyleSettings[i].bSync = view_as(kv.GetNum("sync", 1)); + gA_StyleSettings[i].bStrafeCountW = view_as(kv.GetNum("strafe_count_w", false)); + gA_StyleSettings[i].bStrafeCountA = view_as(kv.GetNum("strafe_count_a", true)); + gA_StyleSettings[i].bStrafeCountS = view_as(kv.GetNum("strafe_count_s", false)); + gA_StyleSettings[i].bStrafeCountD = view_as(kv.GetNum("strafe_count_d", true)); + gA_StyleSettings[i].fRankingMultiplier = kv.GetFloat("rankingmultiplier", 1.00); + gA_StyleSettings[i].iSpecial = kv.GetNum("special", 0); - if(!gB_Registered && strlen(gS_StyleStrings[i][sChangeCommand]) > 0) + if(!gB_Registered && strlen(gS_StyleStrings[i].sChangeCommand) > 0) { char sStyleCommands[32][32]; - int iCommands = ExplodeString(gS_StyleStrings[i][sChangeCommand], ";", sStyleCommands, 32, 32, false); + int iCommands = ExplodeString(gS_StyleStrings[i].sChangeCommand, ";", sStyleCommands, 32, 32, false); char sDescription[128]; - FormatEx(sDescription, 128, "Change style to %s.", gS_StyleStrings[i][sStyleName]); + FormatEx(sDescription, 128, "Change style to %s.", gS_StyleStrings[i].sStyleName); for(int x = 0; x < iCommands; x++) { @@ -1621,10 +1641,10 @@ bool LoadStyles() } } - if(StrContains(gS_StyleStrings[i][sStylePermission], ";") != -1) + if(StrContains(gS_StyleStrings[i].sStylePermission, ";") != -1) { char sText[2][32]; - int iCount = ExplodeString(gS_StyleStrings[i][sStylePermission], ";", sText, 2, 32); + int iCount = ExplodeString(gS_StyleStrings[i].sStylePermission, ";", sText, 2, 32); AdminFlag flag = Admin_Reservation; @@ -1670,6 +1690,22 @@ public Action Command_StyleChange(int client, int args) return Plugin_Continue; } +void ReplaceColors(char[] string, int size) +{ + for(int x = 0; x < sizeof(gS_GlobalColorNames); x++) + { + ReplaceString(string, size, gS_GlobalColorNames[x], gS_GlobalColors[x]); + } + + for(int x = 0; x < sizeof(gS_CSGOColorNames); x++) + { + ReplaceString(string, size, gS_CSGOColorNames[x], gS_CSGOColors[x]); + } + + ReplaceString(string, size, "{RGB}", "\x07"); + ReplaceString(string, size, "{RGBA}", "\x08"); +} + bool LoadMessages() { char sPath[PLATFORM_MAX_PATH]; @@ -1686,30 +1722,21 @@ bool LoadMessages() kv.JumpToKey((IsSource2013(gEV_Type))? "CS:S":"CS:GO"); - kv.GetString("prefix", gS_ChatStrings[sMessagePrefix], 128, "\x075e70d0[Timer]"); - kv.GetString("text", gS_ChatStrings[sMessageText], 128, "\x07ffffff"); - kv.GetString("warning", gS_ChatStrings[sMessageWarning], 128, "\x07af2a22"); - kv.GetString("variable", gS_ChatStrings[sMessageVariable], 128, "\x077fd772"); - kv.GetString("variable2", gS_ChatStrings[sMessageVariable2], 128, "\x07276f5c"); - kv.GetString("style", gS_ChatStrings[sMessageStyle], 128, "\x07db88c2"); + kv.GetString("prefix", gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix), "\x075e70d0[Timer]"); + kv.GetString("text", gS_ChatStrings.sText, sizeof(chatstrings_t::sText), "\x07ffffff"); + kv.GetString("warning", gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning), "\x07af2a22"); + kv.GetString("variable", gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable), "\x077fd772"); + kv.GetString("variable2", gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2), "\x07276f5c"); + kv.GetString("style", gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle), "\x07db88c2"); delete kv; - for(int i = 0; i < CHATSETTINGS_SIZE; i++) - { - for(int x = 0; x < sizeof(gS_GlobalColorNames); x++) - { - ReplaceString(gS_ChatStrings[i], 128, gS_GlobalColorNames[x], gS_GlobalColors[x]); - } - - for(int x = 0; x < sizeof(gS_CSGOColorNames); x++) - { - ReplaceString(gS_ChatStrings[i], 128, gS_CSGOColorNames[x], gS_CSGOColors[x]); - } - - ReplaceString(gS_ChatStrings[i], 128, "{RGB}", "\x07"); - ReplaceString(gS_ChatStrings[i], 128, "{RGBA}", "\x08"); - } + ReplaceColors(gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + ReplaceColors(gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + ReplaceColors(gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + ReplaceColors(gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + ReplaceColors(gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + ReplaceColors(gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); Call_StartForward(gH_Forwards_OnChatConfigLoaded); Call_Finish(); @@ -1780,7 +1807,7 @@ void SQL_DBConnect() if(gB_MySQL) { - FormatEx(sQuery, 512, "CREATE TABLE IF NOT EXISTS `%susers` (`auth` CHAR(32) NOT NULL, `name` VARCHAR(32) COLLATE 'utf8mb4_unicode_ci', `country` CHAR(32), `ip` CHAR(64), `lastlogin` INT NOT NULL DEFAULT -1, `points` FLOAT NOT NULL DEFAULT 0, PRIMARY KEY (`auth`), INDEX `points` (`points`)) ENGINE=INNODB;", gS_MySQLPrefix); + FormatEx(sQuery, 512, "CREATE TABLE IF NOT EXISTS `%susers` (`auth` CHAR(32) NOT NULL, `name` VARCHAR(32) COLLATE 'utf8mb4_general_ci', `country` CHAR(32), `ip` CHAR(64), `lastlogin` INT NOT NULL DEFAULT -1, `points` FLOAT NOT NULL DEFAULT 0, PRIMARY KEY (`auth`), INDEX `points` (`points`)) ENGINE=INNODB;", gS_MySQLPrefix); } else @@ -1910,23 +1937,23 @@ public void PreThinkPost(int client) { if(IsPlayerAlive(client)) { - sv_airaccelerate.FloatValue = view_as(gA_StyleSettings[gI_Style[client]][fAiraccelerate]); + sv_airaccelerate.FloatValue = view_as(gA_StyleSettings[gA_Timers[client].iStyle].fAiraccelerate); if(sv_enablebunnyhopping != null) { - sv_enablebunnyhopping.BoolValue = view_as(gA_StyleSettings[gI_Style[client]][bEnableBunnyhopping]); + sv_enablebunnyhopping.BoolValue = view_as(gA_StyleSettings[gA_Timers[client].iStyle].bEnableBunnyhopping); } MoveType mtMoveType = GetEntityMoveType(client); - if(view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier]) != 1.0 && + if(view_as(gA_StyleSettings[gA_Timers[client].iStyle].fGravityMultiplier) != 1.0 && (mtMoveType == MOVETYPE_WALK || mtMoveType == MOVETYPE_ISOMETRIC) && - (gMT_MoveType[client] == MOVETYPE_LADDER || GetEntityGravity(client) == 1.0)) + (gA_Timers[client].iMoveType == MOVETYPE_LADDER || GetEntityGravity(client) == 1.0)) { - SetEntityGravity(client, view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier])); + SetEntityGravity(client, view_as(gA_StyleSettings[gA_Timers[client].iStyle].fGravityMultiplier)); } - gMT_MoveType[client] = mtMoveType; + gA_Timers[client].iMoveType = mtMoveType; } } @@ -1936,39 +1963,39 @@ public void OnGameFrame() for(int i = 1; i <= MaxClients; i++) { - if(gB_ClientPaused[i] || !gB_TimerEnabled[i]) + if(gA_Timers[i].bPaused || !gA_Timers[i].bEnabled) { continue; } - float time = frametime * view_as(gA_StyleSettings[gI_Style[i]][fTimescale]); + float time = frametime * view_as(gA_StyleSettings[gA_Timers[i].iStyle].fTimescale); - any[] snapshot = new any[TIMERSNAPSHOT_SIZE]; - snapshot[bTimerEnabled] = gB_TimerEnabled[i]; - snapshot[bClientPaused] = gB_ClientPaused[i]; - snapshot[iJumps] = gI_Jumps[i]; - snapshot[bsStyle] = gI_Style[i]; - snapshot[iStrafes] = gI_Strafes[i]; - snapshot[iTotalMeasures] = gI_TotalMeasures[i]; - snapshot[iGoodGains] = gI_GoodGains[i]; - snapshot[fServerTime] = GetEngineTime(); - snapshot[fCurrentTime] = gF_PlayerTimer[i]; - snapshot[iSHSWCombination] = gI_SHSW_FirstCombination[i]; - snapshot[iTimerTrack] = gI_Track[i]; + timer_snapshot_t snapshot; + snapshot.bTimerEnabled = gA_Timers[i].bEnabled; + snapshot.bClientPaused = gA_Timers[i].bPaused; + snapshot.iJumps = gA_Timers[i].iJumps; + snapshot.bsStyle = gA_Timers[i].iStyle; + snapshot.iStrafes = gA_Timers[i].iStrafes; + snapshot.iTotalMeasures = gA_Timers[i].iTotalMeasures; + snapshot.iGoodGains = gA_Timers[i].iGoodGains; + snapshot.fServerTime = GetEngineTime(); + snapshot.fCurrentTime = gA_Timers[i].fTimer; + snapshot.iSHSWCombination = gA_Timers[i].iSHSWCombination; + snapshot.iTimerTrack = gA_Timers[i].iTrack; Call_StartForward(gH_Forwards_OnTimerIncrement); Call_PushCell(i); - Call_PushArray(snapshot, TIMERSNAPSHOT_SIZE); + Call_PushArray(snapshot, sizeof(timer_snapshot_t)); Call_PushCellRef(time); - Call_PushArray(gA_StyleSettings[gI_Style[i]], STYLESETTINGS_SIZE); + Call_PushArray(gA_StyleSettings[gA_Timers[i].iStyle], sizeof(stylesettings_t)); Call_Finish(); - gF_PlayerTimer[i] += time; + gA_Timers[i].fTimer += time; Call_StartForward(gH_Forwards_OnTimerIncrementPost); Call_PushCell(i); Call_PushCell(time); - Call_PushArray(gA_StyleSettings[gI_Style[i]], STYLESETTINGS_SIZE); + Call_PushArray(gA_StyleSettings[gA_Timers[i].iStyle], sizeof(stylesettings_t)); Call_Finish(); } } @@ -1982,7 +2009,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 int flags = GetEntityFlags(client); - if(gB_ClientPaused[client]) + if(gA_Timers[client].bPaused) { buttons = 0; vel = view_as({0.0, 0.0, 0.0}); @@ -2002,9 +2029,9 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 Call_PushArrayEx(vel, 3, SM_PARAM_COPYBACK); Call_PushArrayEx(angles, 3, SM_PARAM_COPYBACK); Call_PushCell(GetTimerStatus(client)); - Call_PushCell(gI_Track[client]); - Call_PushCell(gI_Style[client]); - Call_PushArray(gA_StyleSettings[gI_Style[client]], STYLESETTINGS_SIZE); + Call_PushCell(gA_Timers[client].iTrack); + Call_PushCell(gA_Timers[client].iStyle); + Call_PushArray(gA_StyleSettings[gA_Timers[client].iStyle], sizeof(stylesettings_t)); Call_PushArrayEx(mouse, 2, SM_PARAM_COPYBACK); Call_Finish(result); @@ -2014,18 +2041,18 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } int iGroundEntity = GetEntPropEnt(client, Prop_Send, "m_hGroundEntity"); - bool bInStart = Shavit_InsideZone(client, Zone_Start, gI_Track[client]); + bool bInStart = Shavit_InsideZone(client, Zone_Start, gA_Timers[client].iTrack); - if(gB_TimerEnabled[client] && !gB_ClientPaused[client]) + if(gA_Timers[client].bEnabled && !gA_Timers[client].bPaused) { // +left/right block - if(!gB_Zones || (!bInStart && ((gA_StyleSettings[gI_Style[client]][iBlockPLeft] > 0 && - (buttons & IN_LEFT) > 0) || (gA_StyleSettings[gI_Style[client]][iBlockPRight] > 0 && (buttons & IN_RIGHT) > 0)))) + if(!gB_Zones || (!bInStart && ((gA_StyleSettings[gA_Timers[client].iStyle].iBlockPLeft > 0 && + (buttons & IN_LEFT) > 0) || (gA_StyleSettings[gA_Timers[client].iStyle].iBlockPRight > 0 && (buttons & IN_RIGHT) > 0)))) { vel[0] = 0.0; vel[1] = 0.0; - if(gA_StyleSettings[gI_Style[client]][iBlockPRight] >= 2) + if(gA_StyleSettings[gA_Timers[client].iStyle].iBlockPRight >= 2) { char sCheatDetected[64]; FormatEx(sCheatDetected, 64, "%T", "LeftRightCheat", client); @@ -2034,13 +2061,13 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } // +strafe block - if(gA_StyleSettings[gI_Style[client]][iBlockPStrafe] > 0 && + if(gA_StyleSettings[gA_Timers[client].iStyle].iBlockPStrafe > 0 && ((vel[0] > 0.0 && (buttons & IN_FORWARD) == 0) || (vel[0] < 0.0 && (buttons & IN_BACK) == 0) || (vel[1] > 0.0 && (buttons & IN_MOVERIGHT) == 0) || (vel[1] < 0.0 && (buttons & IN_MOVELEFT) == 0))) { - if(gF_StrafeWarning[client] < gF_PlayerTimer[client]) + if(gA_Timers[client].fStrafeWarning < gA_Timers[client].fTimer) { - if(gA_StyleSettings[gI_Style[client]][iBlockPStrafe] >= 2) + if(gA_StyleSettings[gA_Timers[client].iStyle].iBlockPStrafe >= 2) { char sCheatDetected[64]; FormatEx(sCheatDetected, 64, "%T", "Inconsistencies", client); @@ -2053,7 +2080,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 return Plugin_Changed; } - gF_StrafeWarning[client] = gF_PlayerTimer[client] + 0.3; + gA_Timers[client].fStrafeWarning = gA_Timers[client].fTimer + 0.3; } } @@ -2073,32 +2100,32 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 if(mtMoveType != MOVETYPE_NOCLIP && mtMoveType != MOVETYPE_LADDER && !Shavit_InsideZone(client, Zone_Freestyle, -1)) { // block E - if(gA_StyleSettings[gI_Style[client]][bBlockUse] && (buttons & IN_USE) > 0) + if(gA_StyleSettings[gA_Timers[client].iStyle].bBlockUse && (buttons & IN_USE) > 0) { buttons &= ~IN_USE; } if(iGroundEntity == -1) { - if(gA_StyleSettings[gI_Style[client]][bBlockW] && ((buttons & IN_FORWARD) > 0 || vel[0] > 0.0)) + if(gA_StyleSettings[gA_Timers[client].iStyle].bBlockW && ((buttons & IN_FORWARD) > 0 || vel[0] > 0.0)) { vel[0] = 0.0; buttons &= ~IN_FORWARD; } - if(gA_StyleSettings[gI_Style[client]][bBlockA] && ((buttons & IN_MOVELEFT) > 0 || vel[1] < 0.0)) + if(gA_StyleSettings[gA_Timers[client].iStyle].bBlockA && ((buttons & IN_MOVELEFT) > 0 || vel[1] < 0.0)) { vel[1] = 0.0; buttons &= ~IN_MOVELEFT; } - if(gA_StyleSettings[gI_Style[client]][bBlockS] && ((buttons & IN_BACK) > 0 || vel[0] < 0.0)) + if(gA_StyleSettings[gA_Timers[client].iStyle].bBlockS && ((buttons & IN_BACK) > 0 || vel[0] < 0.0)) { vel[0] = 0.0; buttons &= ~IN_BACK; } - if(gA_StyleSettings[gI_Style[client]][bBlockD] && ((buttons & IN_MOVERIGHT) > 0 || vel[1] > 0.0)) + if(gA_StyleSettings[gA_Timers[client].iStyle].bBlockD && ((buttons & IN_MOVERIGHT) > 0 || vel[1] > 0.0)) { vel[1] = 0.0; buttons &= ~IN_MOVERIGHT; @@ -2108,9 +2135,9 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 // Theory about blocking non-HSW strafes while playing HSW: // Block S and W without A or D. // Block A and D without S or W. - if(gA_StyleSettings[gI_Style[client]][iForceHSW] > 0) + if(gA_StyleSettings[gA_Timers[client].iStyle].iForceHSW > 0) { - bool bSHSW = (gA_StyleSettings[gI_Style[client]][iForceHSW] == 2) && !bInStart; // don't decide on the first valid input until out of start zone! + bool bSHSW = (gA_StyleSettings[gA_Timers[client].iStyle].iForceHSW == 2) && !bInStart; // don't decide on the first valid input until out of start zone! int iCombination = -1; bool bForward = ((buttons & IN_FORWARD) > 0 && vel[0] >= 100.0); @@ -2131,20 +2158,20 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } // int gI_SHSW_FirstCombination[MAXPLAYERS+1]; // 0 - W/A S/D | 1 - W/D S/A - if(gI_SHSW_FirstCombination[client] == -1 && iCombination != -1) + if(gA_Timers[client].iSHSWCombination == -1 && iCombination != -1) { - Shavit_PrintToChat(client, "%T", (iCombination == 0)? "SHSWCombination0":"SHSWCombination1", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); - gI_SHSW_FirstCombination[client] = iCombination; + Shavit_PrintToChat(client, "%T", (iCombination == 0)? "SHSWCombination0":"SHSWCombination1", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText); + gA_Timers[client].iSHSWCombination = iCombination; } bool bStop = false; // W/A S/D - if((gI_SHSW_FirstCombination[client] == 0 && iCombination != 0) || + if((gA_Timers[client].iSHSWCombination == 0 && iCombination != 0) || // W/D S/A - (gI_SHSW_FirstCombination[client] == 1 && iCombination != 1) || + (gA_Timers[client].iSHSWCombination == 1 && iCombination != 1) || // no valid combination & no valid input - (gI_SHSW_FirstCombination[client] == -1 && iCombination == -1)) + (gA_Timers[client].iSHSWCombination == -1 && iCombination == -1)) { bStop = true; } @@ -2183,34 +2210,34 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } } - if(gA_StyleSettings[gI_Style[client]][bStrafeCountW] && !gA_StyleSettings[gI_Style[client]][bBlockW] && - (gI_ButtonCache[client] & IN_FORWARD) == 0 && (buttons & IN_FORWARD) > 0) + if(gA_StyleSettings[gA_Timers[client].iStyle].bStrafeCountW && !gA_StyleSettings[gA_Timers[client].iStyle].bBlockW && + (gA_Timers[client].iLastButtons & IN_FORWARD) == 0 && (buttons & IN_FORWARD) > 0) { - gI_Strafes[client]++; + gA_Timers[client].iStrafes++; } - if(gA_StyleSettings[gI_Style[client]][bStrafeCountA] && !gA_StyleSettings[gI_Style[client]][bBlockA] && (gI_ButtonCache[client] & IN_MOVELEFT) == 0 && - (buttons & IN_MOVELEFT) > 0 && (gA_StyleSettings[gI_Style[client]][iForceHSW] > 0 || ((buttons & IN_FORWARD) == 0 && (buttons & IN_BACK) == 0))) + if(gA_StyleSettings[gA_Timers[client].iStyle].bStrafeCountA && !gA_StyleSettings[gA_Timers[client].iStyle].bBlockA && (gA_Timers[client].iLastButtons & IN_MOVELEFT) == 0 && + (buttons & IN_MOVELEFT) > 0 && (gA_StyleSettings[gA_Timers[client].iStyle].iForceHSW > 0 || ((buttons & IN_FORWARD) == 0 && (buttons & IN_BACK) == 0))) { - gI_Strafes[client]++; + gA_Timers[client].iStrafes++; } - if(gA_StyleSettings[gI_Style[client]][bStrafeCountS] && !gA_StyleSettings[gI_Style[client]][bBlockS] && - (gI_ButtonCache[client] & IN_BACK) == 0 && (buttons & IN_BACK) > 0) + if(gA_StyleSettings[gA_Timers[client].iStyle].bStrafeCountS && !gA_StyleSettings[gA_Timers[client].iStyle].bBlockS && + (gA_Timers[client].iLastButtons & IN_BACK) == 0 && (buttons & IN_BACK) > 0) { - gI_Strafes[client]++; + gA_Timers[client].iStrafes++; } - if(gA_StyleSettings[gI_Style[client]][bStrafeCountD] && !gA_StyleSettings[gI_Style[client]][bBlockD] && (gI_ButtonCache[client] & IN_MOVERIGHT) == 0 && - (buttons & IN_MOVERIGHT) > 0 && (gA_StyleSettings[gI_Style[client]][iForceHSW] > 0 || ((buttons & IN_FORWARD) == 0 && (buttons & IN_BACK) == 0))) + if(gA_StyleSettings[gA_Timers[client].iStyle].bStrafeCountD && !gA_StyleSettings[gA_Timers[client].iStyle].bBlockD && (gA_Timers[client].iLastButtons & IN_MOVERIGHT) == 0 && + (buttons & IN_MOVERIGHT) > 0 && (gA_StyleSettings[gA_Timers[client].iStyle].iForceHSW > 0 || ((buttons & IN_FORWARD) == 0 && (buttons & IN_BACK) == 0))) { - gI_Strafes[client]++; + gA_Timers[client].iStrafes++; } bool bInWater = (GetEntProp(client, Prop_Send, "m_nWaterLevel") >= 2); // enable duck-jumping/bhop in tf2 - if(gEV_Type == Engine_TF2 && gA_StyleSettings[gI_Style[client]][bEnableBunnyhopping] && (buttons & IN_JUMP) > 0 && iGroundEntity != -1) + if(gEV_Type == Engine_TF2 && gA_StyleSettings[gA_Timers[client].iStyle].bEnableBunnyhopping && (buttons & IN_JUMP) > 0 && iGroundEntity != -1) { float fSpeed[3]; GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", fSpeed); @@ -2221,14 +2248,14 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 int iPButtons = buttons; - if(gA_StyleSettings[gI_Style[client]][bAutobhop] && gB_Auto[client] && (buttons & IN_JUMP) > 0 && mtMoveType == MOVETYPE_WALK && !bInWater) + if(gA_StyleSettings[gA_Timers[client].iStyle].bAutobhop && gA_Timers[client].bAuto && (buttons & IN_JUMP) > 0 && mtMoveType == MOVETYPE_WALK && !bInWater) { int iOldButtons = GetEntProp(client, Prop_Data, "m_nOldButtons"); SetEntProp(client, Prop_Data, "m_nOldButtons", (iOldButtons & ~IN_JUMP)); iPButtons &= ~IN_JUMP; } - else if(gB_DoubleSteps[client] && (buttons & IN_JUMP) == 0) + else if(gA_Timers[client].bDoubleSteps && (buttons & IN_JUMP) == 0) { iPButtons = buttons |= IN_JUMP; } @@ -2236,33 +2263,33 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 // perf jump measuring if(!bInWater && mtMoveType == MOVETYPE_WALK && iGroundEntity != -1) { - gI_GroundTicks[client]++; + gA_Timers[client].iGroundTicks++; - if((((gI_ButtonCache[client] & IN_JUMP) == 0 && (iPButtons & IN_JUMP) > 0) || iPButtons != buttons) && - 1 <= gI_GroundTicks[client] <= 8) + if((((gA_Timers[client].iLastButtons & IN_JUMP) == 0 && (iPButtons & IN_JUMP) > 0) || iPButtons != buttons) && + 1 <= gA_Timers[client].iGroundTicks <= 8) { - gI_MeasuredJumps[client]++; + gA_Timers[client].iMeasuredJumps++; - if(gI_GroundTicks[client] == 1) + if(gA_Timers[client].iGroundTicks == 1) { - gI_PerfectJumps[client]++; + gA_Timers[client].iPerfectJumps++; } } } else { - gI_GroundTicks[client] = 0; + gA_Timers[client].iGroundTicks = 0; } - if(bInStart && gB_BlockPreJump && !gA_StyleSettings[gI_Style[client]][bPrespeed] && (vel[2] > 0 || (buttons & IN_JUMP) > 0)) + if(bInStart && gCV_BlockPreJump.BoolValue && !gA_StyleSettings[gA_Timers[client].iStyle].bPrespeed && (vel[2] > 0 || (buttons & IN_JUMP) > 0)) { vel[2] = 0.0; buttons &= ~IN_JUMP; } // velocity limit - if(iGroundEntity != -1 && view_as(gA_StyleSettings[gI_Style[client]][fVelocityLimit] > 0.0) && + if(iGroundEntity != -1 && view_as(gA_StyleSettings[gA_Timers[client].iStyle].fVelocityLimit > 0.0) && (!gB_Zones || !Shavit_InsideZone(client, Zone_NoVelLimit, -1))) { float fSpeed[3]; @@ -2272,7 +2299,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 if(fSpeed_New > 0.0) { - float fScale = view_as(gA_StyleSettings[gI_Style[client]][fVelocityLimit]) / fSpeed_New; + float fScale = view_as(gA_StyleSettings[gA_Timers[client].iStyle].fVelocityLimit) / fSpeed_New; if(fScale < 1.0) { @@ -2282,7 +2309,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } } - float fAngle = (angles[1] - gF_AngleCache[client]); + float fAngle = (angles[1] - gA_Timers[client].fLastAngle); while(fAngle > 180.0) { @@ -2320,28 +2347,28 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 if(fDirectionAngle < 22.5 || fDirectionAngle > 337.5) { - gI_TotalMeasures[client]++; + gA_Timers[client].iTotalMeasures++; if((fAngle > 0.0 && vel[1] <= -100.0) || (fAngle < 0.0 && vel[1] >= 100.0)) { - gI_GoodGains[client]++; + gA_Timers[client].iGoodGains++; } } else if((fDirectionAngle > 67.5 && fDirectionAngle < 112.5) || (fDirectionAngle > 247.5 && fDirectionAngle < 292.5)) { - gI_TotalMeasures[client]++; + gA_Timers[client].iTotalMeasures++; if(vel[0] <= -100.0 || vel[0] >= 100.0) { - gI_GoodGains[client]++; + gA_Timers[client].iGoodGains++; } } } } - gI_ButtonCache[client] = iPButtons; - gF_AngleCache[client] = angles[1]; + gA_Timers[client].iLastButtons = iPButtons; + gA_Timers[client].fLastAngle = angles[1]; return Plugin_Continue; } @@ -2349,24 +2376,24 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 void StopTimer_Cheat(int client, const char[] message) { Shavit_StopTimer(client); - Shavit_PrintToChat(client, "%T", "CheatTimerStop", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText], message); + Shavit_PrintToChat(client, "%T", "CheatTimerStop", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText, message); } void UpdateStyleSettings(int client) { if(sv_autobunnyhopping != null) { - sv_autobunnyhopping.ReplicateToClient(client, (gA_StyleSettings[gI_Style[client]][bAutobhop] && gB_Auto[client])? "1":"0"); + sv_autobunnyhopping.ReplicateToClient(client, (gA_StyleSettings[gA_Timers[client].iStyle].bAutobhop && gA_Timers[client].bAuto)? "1":"0"); } if(sv_enablebunnyhopping != null) { - sv_enablebunnyhopping.ReplicateToClient(client, (gA_StyleSettings[gI_Style[client]][bEnableBunnyhopping])? "1":"0"); + sv_enablebunnyhopping.ReplicateToClient(client, (gA_StyleSettings[gA_Timers[client].iStyle].bEnableBunnyhopping)? "1":"0"); } char sAiraccelerate[8]; - FloatToString(gA_StyleSettings[gI_Style[client]][fAiraccelerate], sAiraccelerate, 8); + FloatToString(gA_StyleSettings[gA_Timers[client].iStyle].fAiraccelerate, sAiraccelerate, 8); sv_airaccelerate.ReplicateToClient(client, sAiraccelerate); - SetEntityGravity(client, view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier])); + SetEntityGravity(client, view_as(gA_StyleSettings[gA_Timers[client].iStyle].fGravityMultiplier)); } diff --git a/addons/sourcemod/scripting/shavit-hud.sp b/addons/sourcemod/scripting/shavit-hud.sp index 65674d60..e810d031 100644 --- a/addons/sourcemod/scripting/shavit-hud.sp +++ b/addons/sourcemod/scripting/shavit-hud.sp @@ -30,7 +30,51 @@ #pragma newdecls required #pragma semicolon 1 +// HUD2 - these settings will *disable* elements for the main hud +#define HUD2_TIME (1 << 0) +#define HUD2_SPEED (1 << 1) +#define HUD2_JUMPS (1 << 2) +#define HUD2_STRAFE (1 << 3) +#define HUD2_SYNC (1 << 4) +#define HUD2_STYLE (1 << 5) +#define HUD2_RANK (1 << 6) +#define HUD2_TRACK (1 << 7) + #define HUD_DEFAULT (HUD_MASTER|HUD_CENTER|HUD_ZONEHUD|HUD_OBSERVE|HUD_TOPLEFT|HUD_SYNC|HUD_TIMELEFT|HUD_2DVEL|HUD_SPECTATORS) +#define HUD_DEFAULT2 0 + +enum ZoneHUD +{ + ZoneHUD_None, + ZoneHUD_Start, + ZoneHUD_End +}; + +enum struct huddata_t +{ + int iTarget; + float fTime; + int iSpeed; + int iStyle; + int iTrack; + int iJumps; + int iStrafes; + int iRank; + float fSync; + float fPB; + float fWR; + bool bReplay; + bool bPractice; + TimerStatus iTimerStatus; + ZoneHUD iZoneHUD; +}; + +enum struct color_t +{ + int r; + int g; + int b; +}; // game type (CS:S/CS:GO/TF2) EngineVersion gEV_Type = Engine_Unknown; @@ -43,18 +87,21 @@ bool gB_BhopStats = false; // cache int gI_Cycle = 0; -int gI_GradientColors[3]; +color_t gI_Gradient; int gI_GradientDirection = -1; int gI_Styles = 0; Handle gH_HUDCookie = null; +Handle gH_HUDCookieMain = null; int gI_HUDSettings[MAXPLAYERS+1]; +int gI_HUD2Settings[MAXPLAYERS+1]; int gI_NameLength = MAX_NAME_LENGTH; int gI_LastScrollCount[MAXPLAYERS+1]; int gI_ScrollCount[MAXPLAYERS+1]; int gI_Buttons[MAXPLAYERS+1]; float gF_ConnectTime[MAXPLAYERS+1]; bool gB_FirstPrint[MAXPLAYERS+1]; +int gI_PreviousSpeed[MAXPLAYERS+1]; bool gB_Late = false; @@ -66,14 +113,10 @@ ConVar gCV_GradientStepSize = null; ConVar gCV_TicksPerUpdate = null; ConVar gCV_SpectatorList = null; -// cached cvars -int gI_GradientStepSize = 5; -int gI_TicksPerUpdate = 5; -int gI_SpectatorList = 1; - // timer settings -char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128]; -any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE]; +stylestrings_t gS_StyleStrings[STYLE_LIMIT]; +stylesettings_t gA_StyleSettings[STYLE_LIMIT]; +chatstrings_t gS_ChatStrings; public Plugin myinfo = { @@ -113,7 +156,8 @@ public void OnPluginStart() else { - gI_NameLength = 14; // 14 because long names will make it look spammy in CS:GO due to the font + // long names make it look bad in CS:GO due to the font size + gI_NameLength = 14; } if(gEV_Type == Engine_TF2) @@ -137,18 +181,36 @@ public void OnPluginStart() gCV_TicksPerUpdate = CreateConVar("shavit_hud_ticksperupdate", "5", "How often (in ticks) should the HUD update?\nPlay around with this value until you find the best for your server.\nThe maximum value is your tickrate.", 0, true, 1.0, true, (1.0 / GetTickInterval())); gCV_SpectatorList = CreateConVar("shavit_hud_speclist", "1", "Who to show in the specators list?\n0 - everyone\n1 - all admins (admin_speclisthide override to bypass)\n2 - players you can target", 0, true, 0.0, true, 2.0); - gCV_GradientStepSize.AddChangeHook(OnConVarChanged); - gCV_TicksPerUpdate.AddChangeHook(OnConVarChanged); - gCV_SpectatorList.AddChangeHook(OnConVarChanged); - AutoExecConfig(); // commands - RegConsoleCmd("sm_hud", Command_HUD, "Opens the HUD settings menu"); - RegConsoleCmd("sm_options", Command_HUD, "Opens the HUD settings menu (alias for sm_hud"); + RegConsoleCmd("sm_hud", Command_HUD, "Opens the HUD settings menu."); + RegConsoleCmd("sm_options", Command_HUD, "Opens the HUD settings menu. (alias for sm_hud)"); + + // hud togglers + RegConsoleCmd("sm_keys", Command_Keys, "Toggles key display."); + RegConsoleCmd("sm_showkeys", Command_Keys, "Toggles key display. (alias for sm_keys)"); + RegConsoleCmd("sm_showmykeys", Command_Keys, "Toggles key display. (alias for sm_keys)"); + + RegConsoleCmd("sm_master", Command_Master, "Toggles HUD."); + RegConsoleCmd("sm_masterhud", Command_Master, "Toggles HUD. (alias for sm_master)"); + + RegConsoleCmd("sm_center", Command_Center, "Toggles center text HUD."); + RegConsoleCmd("sm_centerhud", Command_Center, "Toggles center text HUD. (alias for sm_center)"); + + RegConsoleCmd("sm_zonehud", Command_ZoneHUD, "Toggles zone HUD."); + + RegConsoleCmd("sm_hideweapon", Command_HideWeapon, "Toggles weapon hiding."); + RegConsoleCmd("sm_hideweap", Command_HideWeapon, "Toggles weapon hiding. (alias for sm_hideweapon)"); + RegConsoleCmd("sm_hidewep", Command_HideWeapon, "Toggles weapon hiding. (alias for sm_hideweapon)"); + + RegConsoleCmd("sm_truevel", Command_TrueVel, "Toggles 2D ('true') velocity."); + RegConsoleCmd("sm_truvel", Command_TrueVel, "Toggles 2D ('true') velocity. (alias for sm_truevel)"); + RegConsoleCmd("sm_2dvel", Command_TrueVel, "Toggles 2D ('true') velocity. (alias for sm_truevel)"); // cookies gH_HUDCookie = RegClientCookie("shavit_hud_setting", "HUD settings", CookieAccess_Protected); + gH_HUDCookieMain = RegClientCookie("shavit_hud_settingmain", "HUD settings for main ", CookieAccess_Protected); if(gB_Late) { @@ -167,18 +229,12 @@ public void OnPluginStart() } } -public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) -{ - gI_GradientStepSize = gCV_GradientStepSize.IntValue; - gI_TicksPerUpdate = gCV_TicksPerUpdate.IntValue; - gI_SpectatorList = gCV_SpectatorList.IntValue; -} - public void OnMapStart() { if(gB_Late) { Shavit_OnStyleConfigLoaded(-1); + Shavit_OnChatConfigLoaded(); } } @@ -250,12 +306,12 @@ public void Shavit_OnStyleConfigLoaded(int styles) for(int i = 0; i < styles; i++) { Shavit_GetStyleSettings(i, gA_StyleSettings[i]); - Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i][sStyleName], 128); - Shavit_GetStyleStrings(i, sHTMLColor, gS_StyleStrings[i][sHTMLColor], 128); + Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName)); + Shavit_GetStyleStrings(i, sHTMLColor, gS_StyleStrings[i].sHTMLColor, sizeof(stylestrings_t::sHTMLColor)); } } -public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, any stylesettings[STYLESETTINGS_SIZE]) +public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, stylesettings_t stylsettings) { gI_Buttons[client] = buttons; @@ -270,6 +326,16 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float return Plugin_Continue; } +public void Shavit_OnChatConfigLoaded() +{ + Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); +} + public void OnClientPutInServer(int client) { gI_LastScrollCount[client] = 0; @@ -317,6 +383,22 @@ public void OnClientCookiesCached(int client) { gI_HUDSettings[client] = StringToInt(sHUDSettings); } + + char sHUDSettingsMain[8]; + GetClientCookie(client, gH_HUDCookieMain, sHUDSettingsMain, 8); + + if(strlen(sHUDSettingsMain) == 0) + { + IntToString(HUD_DEFAULT2, sHUDSettingsMain, 8); + + SetClientCookie(client, gH_HUDCookieMain, sHUDSettingsMain); + gI_HUD2Settings[client] = HUD_DEFAULT2; + } + + else + { + gI_HUD2Settings[client] = StringToInt(sHUDSettingsMain); + } } public void Player_ChangeClass(Event event, const char[] name, bool dontBroadcast) @@ -366,6 +448,95 @@ void FillerHintText(int client) gB_FirstPrint[client] = true; } +void ToggleHUD(int client, int hud, bool chat) +{ + if(!(1 <= client <= MaxClients)) + { + return; + } + + char sCookie[16]; + gI_HUDSettings[client] ^= hud; + IntToString(gI_HUDSettings[client], sCookie, 16); + SetClientCookie(client, gH_HUDCookie, sCookie); + + if(chat) + { + char sHUDSetting[64]; + + switch(hud) + { + case HUD_MASTER: FormatEx(sHUDSetting, 64, "%T", "HudMaster", client); + case HUD_CENTER: FormatEx(sHUDSetting, 64, "%T", "HudCenter", client); + case HUD_ZONEHUD: FormatEx(sHUDSetting, 64, "%T", "HudZoneHud", client); + case HUD_OBSERVE: FormatEx(sHUDSetting, 64, "%T", "HudObserve", client); + case HUD_SPECTATORS: FormatEx(sHUDSetting, 64, "%T", "HudSpectators", client); + case HUD_KEYOVERLAY: FormatEx(sHUDSetting, 64, "%T", "HudKeyOverlay", client); + case HUD_HIDEWEAPON: FormatEx(sHUDSetting, 64, "%T", "HudHideWeapon", client); + case HUD_TOPLEFT: FormatEx(sHUDSetting, 64, "%T", "HudTopLeft", client); + case HUD_SYNC: FormatEx(sHUDSetting, 64, "%T", "HudSync", client); + case HUD_TIMELEFT: FormatEx(sHUDSetting, 64, "%T", "HudTimeLeft", client); + case HUD_2DVEL: FormatEx(sHUDSetting, 64, "%T", "Hud2dVel", client); + case HUD_NOSOUNDS: FormatEx(sHUDSetting, 64, "%T", "HudNoRecordSounds", client); + case HUD_NOPRACALERT: FormatEx(sHUDSetting, 64, "%T", "HudPracticeModeAlert", client); + } + + if((gI_HUDSettings[client] & hud) > 0) + { + Shavit_PrintToChat(client, "%T", "HudEnabledComponent", client, + gS_ChatStrings.sVariable, sHUDSetting, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, gS_ChatStrings.sText); + } + + else + { + Shavit_PrintToChat(client, "%T", "HudDisabledComponent", client, + gS_ChatStrings.sVariable, sHUDSetting, gS_ChatStrings.sText, gS_ChatStrings.sWarning, gS_ChatStrings.sText); + } + } +} + +public Action Command_Master(int client, int args) +{ + ToggleHUD(client, HUD_MASTER, true); + + return Plugin_Handled; +} + +public Action Command_Center(int client, int args) +{ + ToggleHUD(client, HUD_CENTER, true); + + return Plugin_Handled; +} + +public Action Command_ZoneHUD(int client, int args) +{ + ToggleHUD(client, HUD_ZONEHUD, true); + + return Plugin_Handled; +} + +public Action Command_HideWeapon(int client, int args) +{ + ToggleHUD(client, HUD_HIDEWEAPON, true); + + return Plugin_Handled; +} + +public Action Command_TrueVel(int client, int args) +{ + ToggleHUD(client, HUD_2DVEL, true); + + return Plugin_Handled; +} + +public Action Command_Keys(int client, int args) +{ + ToggleHUD(client, HUD_KEYOVERLAY, true); + + return Plugin_Handled; +} + public Action Command_HUD(int client, int args) { return ShowHUDMenu(client, 0); @@ -383,64 +554,97 @@ Action ShowHUDMenu(int client, int item) char sInfo[16]; char sHudItem[64]; - IntToString(HUD_MASTER, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_MASTER); FormatEx(sHudItem, 64, "%T", "HudMaster", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_CENTER, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_CENTER); FormatEx(sHudItem, 64, "%T", "HudCenter", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_ZONEHUD, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_ZONEHUD); FormatEx(sHudItem, 64, "%T", "HudZoneHud", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_OBSERVE, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_OBSERVE); FormatEx(sHudItem, 64, "%T", "HudObserve", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_SPECTATORS, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_SPECTATORS); FormatEx(sHudItem, 64, "%T", "HudSpectators", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_KEYOVERLAY, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_KEYOVERLAY); FormatEx(sHudItem, 64, "%T", "HudKeyOverlay", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_HIDEWEAPON, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_HIDEWEAPON); FormatEx(sHudItem, 64, "%T", "HudHideWeapon", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_TOPLEFT, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_TOPLEFT); FormatEx(sHudItem, 64, "%T", "HudTopLeft", client); menu.AddItem(sInfo, sHudItem); if(IsSource2013(gEV_Type)) { - IntToString(HUD_SYNC, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_SYNC); FormatEx(sHudItem, 64, "%T", "HudSync", client); menu.AddItem(sInfo, sHudItem); - IntToString(HUD_TIMELEFT, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_TIMELEFT); FormatEx(sHudItem, 64, "%T", "HudTimeLeft", client); menu.AddItem(sInfo, sHudItem); } - IntToString(HUD_2DVEL, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_2DVEL); FormatEx(sHudItem, 64, "%T", "Hud2dVel", client); menu.AddItem(sInfo, sHudItem); if(gB_Sounds) { - IntToString(HUD_NOSOUNDS, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_NOSOUNDS); FormatEx(sHudItem, 64, "%T", "HudNoRecordSounds", client); menu.AddItem(sInfo, sHudItem); } - IntToString(HUD_NOPRACALERT, sInfo, 16); + FormatEx(sInfo, 16, "!%d", HUD_NOPRACALERT); FormatEx(sHudItem, 64, "%T", "HudPracticeModeAlert", client); menu.AddItem(sInfo, sHudItem); + // HUD2 - disables selected elements + FormatEx(sInfo, 16, "@%d", HUD2_TIME); + FormatEx(sHudItem, 64, "%T", "HudTimeText", client); + menu.AddItem(sInfo, sHudItem); + + FormatEx(sInfo, 16, "@%d", HUD2_SPEED); + FormatEx(sHudItem, 64, "%T", "HudSpeedText", client); + menu.AddItem(sInfo, sHudItem); + + FormatEx(sInfo, 16, "@%d", HUD2_JUMPS); + FormatEx(sHudItem, 64, "%T", "HudJumpsText", client); + menu.AddItem(sInfo, sHudItem); + + FormatEx(sInfo, 16, "@%d", HUD2_STRAFE); + FormatEx(sHudItem, 64, "%T", "HudStrafeText", client); + menu.AddItem(sInfo, sHudItem); + + FormatEx(sInfo, 16, "@%d", HUD2_SYNC); + FormatEx(sHudItem, 64, "%T", "HudSync", client); + menu.AddItem(sInfo, sHudItem); + + FormatEx(sInfo, 16, "@%d", HUD2_STYLE); + FormatEx(sHudItem, 64, "%T", "HudStyleText", client); + menu.AddItem(sInfo, sHudItem); + + FormatEx(sInfo, 16, "@%d", HUD2_RANK); + FormatEx(sHudItem, 64, "%T", "HudRankText", client); + menu.AddItem(sInfo, sHudItem); + + FormatEx(sInfo, 16, "@%d", HUD2_TRACK); + FormatEx(sHudItem, 64, "%T", "HudTrackText", client); + menu.AddItem(sInfo, sHudItem); + menu.ExitButton = true; menu.DisplayAt(client, item, 60); @@ -453,18 +657,32 @@ public int MenuHandler_HUD(Menu menu, MenuAction action, int param1, int param2) { char sCookie[16]; menu.GetItem(param2, sCookie, 16); + + int type = (sCookie[0] == '!')? 1:2; + ReplaceString(sCookie, 16, "!", ""); + ReplaceString(sCookie, 16, "@", ""); + int iSelection = StringToInt(sCookie); - gI_HUDSettings[param1] ^= iSelection; - IntToString(gI_HUDSettings[param1], sCookie, 16); // string recycling Kappa + if(type == 1) + { + gI_HUDSettings[param1] ^= iSelection; + IntToString(gI_HUDSettings[param1], sCookie, 16); + SetClientCookie(param1, gH_HUDCookie, sCookie); + } + + else + { + gI_HUD2Settings[param1] ^= iSelection; + IntToString(gI_HUD2Settings[param1], sCookie, 16); + SetClientCookie(param1, gH_HUDCookieMain, sCookie); + } if(gEV_Type == Engine_TF2 && iSelection == HUD_CENTER && (gI_HUDSettings[param1] & HUD_MASTER) > 0) { FillerHintText(param1); } - SetClientCookie(param1, gH_HUDCookie, sCookie); - ShowHUDMenu(param1, GetMenuSelectionPosition()); } @@ -475,7 +693,19 @@ public int MenuHandler_HUD(Menu menu, MenuAction action, int param1, int param2) int style = 0; menu.GetItem(param2, sInfo, 16, style, sDisplay, 64); - Format(sDisplay, 64, "[%s] %s", ((gI_HUDSettings[param1] & StringToInt(sInfo)) > 0)? "x":" ", sDisplay); + int type = (sInfo[0] == '!')? 1:2; + ReplaceString(sInfo, 16, "!", ""); + ReplaceString(sInfo, 16, "@", ""); + + if(type == 1) + { + Format(sDisplay, 64, "[%s] %s", ((gI_HUDSettings[param1] & StringToInt(sInfo)) > 0)? "+":"-", sDisplay); + } + + else + { + Format(sDisplay, 64, "[%s] %s", ((gI_HUD2Settings[param1] & StringToInt(sInfo)) == 0)? "+":"-", sDisplay); + } return RedrawMenuItem(sDisplay); } @@ -490,7 +720,7 @@ public int MenuHandler_HUD(Menu menu, MenuAction action, int param1, int param2) public void OnGameFrame() { - if(GetGameTickCount() % gI_TicksPerUpdate == 0) + if((GetGameTickCount() % gCV_TicksPerUpdate.IntValue) == 0) { Cron(); } @@ -507,73 +737,73 @@ void Cron() { case 0: { - gI_GradientColors[2] += gI_GradientStepSize; + gI_Gradient.b += gCV_GradientStepSize.IntValue; - if(gI_GradientColors[2] >= 255) + if(gI_Gradient.b >= 255) { - gI_GradientColors[2] = 255; + gI_Gradient.b = 255; gI_GradientDirection = 1; } } case 1: { - gI_GradientColors[0] -= gI_GradientStepSize; + gI_Gradient.r -= gCV_GradientStepSize.IntValue; - if(gI_GradientColors[0] <= 0) + if(gI_Gradient.r <= 0) { - gI_GradientColors[0] = 0; + gI_Gradient.r = 0; gI_GradientDirection = 2; } } case 2: { - gI_GradientColors[1] += gI_GradientStepSize; + gI_Gradient.g += gCV_GradientStepSize.IntValue; - if(gI_GradientColors[1] >= 255) + if(gI_Gradient.g >= 255) { - gI_GradientColors[1] = 255; + gI_Gradient.g = 255; gI_GradientDirection = 3; } } case 3: { - gI_GradientColors[2] -= gI_GradientStepSize; + gI_Gradient.b -= gCV_GradientStepSize.IntValue; - if(gI_GradientColors[2] <= 0) + if(gI_Gradient.b <= 0) { - gI_GradientColors[2] = 0; + gI_Gradient.b = 0; gI_GradientDirection = 4; } } case 4: { - gI_GradientColors[0] += gI_GradientStepSize; + gI_Gradient.r += gCV_GradientStepSize.IntValue; - if(gI_GradientColors[0] >= 255) + if(gI_Gradient.r >= 255) { - gI_GradientColors[0] = 255; + gI_Gradient.r = 255; gI_GradientDirection = 5; } } case 5: { - gI_GradientColors[1] -= gI_GradientStepSize; + gI_Gradient.g -= gCV_GradientStepSize.IntValue; - if(gI_GradientColors[1] <= 0) + if(gI_Gradient.g <= 0) { - gI_GradientColors[1] = 0; + gI_Gradient.g = 0; gI_GradientDirection = 0; } } default: { - gI_GradientColors[0] = 255; + gI_Gradient.r = 255; gI_GradientDirection = 0; } } @@ -585,6 +815,13 @@ void Cron() continue; } + if((gI_Cycle % 50) == 0) + { + float fSpeed[3]; + GetEntPropVector(GetHUDTarget(i), Prop_Data, "m_vecVelocity", fSpeed); + gI_PreviousSpeed[i] = RoundToNearest(((gI_HUDSettings[i] & HUD_2DVEL) == 0)? GetVectorLength(fSpeed):(SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0)))); + } + TriggerHUDUpdate(i); } } @@ -593,7 +830,7 @@ void TriggerHUDUpdate(int client, bool keysonly = false) // keysonly because CS: { if(!keysonly) { - UpdateHUD(client); + UpdateMainHUD(client); SetEntProp(client, Prop_Data, "m_bDrawViewmodel", ((gI_HUDSettings[client] & HUD_HIDEWEAPON) > 0)? 0:1); UpdateTopLeftHUD(client, true); } @@ -627,262 +864,445 @@ void TriggerHUDUpdate(int client, bool keysonly = false) // keysonly because CS: } } -void FixCSGOText(char[] buffer, int maxlen) +void AddHUDLine(char[] buffer, int maxlen, const char[] line) { - if(gEV_Type == Engine_CSGO) + if(strlen(buffer) > 0) { - Format(buffer, maxlen, "
%s
", buffer); + Format(buffer, maxlen, "%s\n%s", buffer, line); + } + + else + { + StrCat(buffer, maxlen, line); } } -void UpdateHUD(int client) +void GetRGB(int color, color_t arr) +{ + arr.r = ((color >> 16) & 0xFF); + arr.g = ((color >> 8) & 0xFF); + arr.b = (color & 0xFF); +} + +int GetHex(color_t color) +{ + return (((color.r & 0xFF) << 16) + ((color.g & 0xFF) << 8) + (color.b & 0xFF)); +} + +int GetGradient(int start, int end, int steps) +{ + color_t aColorStart; + GetRGB(start, aColorStart); + + color_t aColorEnd; + GetRGB(end, aColorEnd); + + color_t aColorGradient; + aColorGradient.r = (aColorStart.r + RoundToZero((aColorEnd.r - aColorStart.r) * steps / 100.0)); + aColorGradient.g = (aColorStart.g + RoundToZero((aColorEnd.g - aColorStart.g) * steps / 100.0)); + aColorGradient.b = (aColorStart.b + RoundToZero((aColorEnd.b - aColorStart.b) * steps / 100.0)); + + return GetHex(aColorGradient); +} + +int AddHUDToBuffer_Source2013(int client, huddata_t data, char[] buffer, int maxlen) +{ + int iLines = 0; + char sLine[128]; + + if(data.bReplay) + { + if(data.iStyle != -1 && data.fTime > 0.0 && data.fTime <= data.fWR && Shavit_IsReplayDataLoaded(data.iStyle, data.iTrack)) + { + char sTrack[32]; + + if(data.iTrack != Track_Main && (gI_HUD2Settings[client] & HUD2_TRACK) == 0) + { + GetTrackName(client, data.iTrack, sTrack, 32); + Format(sTrack, 32, "(%s) ", sTrack); + } + + if((gI_HUD2Settings[client] & HUD2_STYLE) == 0) + { + FormatEx(sLine, 128, "%s %s%T", gS_StyleStrings[data.iStyle].sStyleName, sTrack, "ReplayText", client); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + char sPlayerName[MAX_NAME_LENGTH]; + Shavit_GetReplayName(data.iStyle, data.iTrack, sPlayerName, MAX_NAME_LENGTH); + AddHUDLine(buffer, maxlen, sPlayerName); + iLines++; + + if((gI_HUD2Settings[client] & HUD2_TIME) == 0) + { + char sTime[32]; + FormatSeconds(data.fTime, sTime, 32, false); + + char sWR[32]; + FormatSeconds(data.fWR, sWR, 32, false); + + FormatEx(sLine, 128, "%s / %s\n(%.1f%)", sTime, sWR, ((data.fTime / data.fWR) * 100)); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if((gI_HUD2Settings[client] & HUD2_SPEED) == 0) + { + FormatEx(sLine, 128, "%d u/s", data.iSpeed); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + } + + else + { + FormatEx(sLine, 128, "%T", (gEV_Type == Engine_TF2)? "NoReplayDataTF2":"NoReplayData", client); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + return iLines; + } + + if((gI_HUDSettings[client] & HUD_ZONEHUD) > 0 && data.iZoneHUD != ZoneHUD_None) + { + FormatEx(sLine, 128, "%T ", (data.iZoneHUD == ZoneHUD_Start)? "HudInStartZone":"HudInEndZone", client, data.iSpeed); + AddHUDLine(buffer, maxlen, sLine); + + return ++iLines; + } + + if(data.iTimerStatus != Timer_Stopped) + { + if((gI_HUD2Settings[client] & HUD2_STYLE) == 0) + { + AddHUDLine(buffer, maxlen, gS_StyleStrings[data.iStyle].sStyleName); + iLines++; + } + + if(data.bPractice || data.iTimerStatus == Timer_Paused) + { + FormatEx(sLine, 128, "%T", (data.iTimerStatus == Timer_Paused)? "HudPaused":"HudPracticeMode", client); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if((gI_HUD2Settings[client] & HUD2_TIME) == 0) + { + char sTime[32]; + FormatSeconds(data.fTime, sTime, 32, false); + + if((gI_HUD2Settings[client] & HUD2_RANK) == 0) + { + FormatEx(sLine, 128, "%T: %s (%d)", "HudTimeText", client, sTime, data.iRank); + } + + else + { + FormatEx(sLine, 128, "%T: %s", "HudTimeText", client, sTime); + } + + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if((gI_HUD2Settings[client] & HUD2_JUMPS) == 0) + { + FormatEx(sLine, 128, "%T: %d", "HudJumpsText", client, data.iJumps); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if((gI_HUD2Settings[client] & HUD2_STRAFE) == 0) + { + FormatEx(sLine, 128, "%T: %d", "HudStrafeText", client, data.iStrafes); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + } + + if((gI_HUD2Settings[client] & HUD2_SPEED) == 0) + { + // timer: Speed: %d + // no timer: straight up number + if(data.iTimerStatus != Timer_Stopped) + { + FormatEx(sLine, 128, "%T: %d", "HudSpeedText", client, data.iSpeed); + } + + else + { + IntToString(data.iSpeed, sLine, 128); + } + + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if(data.iTimerStatus != Timer_Stopped && data.iTrack != Track_Main && (gI_HUD2Settings[client] & HUD2_TRACK) == 0) + { + char sTrack[32]; + GetTrackName(client, data.iTrack, sTrack, 32); + Format(sTrack, 32, "%s", sTrack); + + AddHUDLine(buffer, maxlen, sTrack); + iLines++; + } + + return iLines; +} + +int AddHUDToBuffer_CSGO(int client, huddata_t data, char[] buffer, int maxlen) +{ + int iLines = 0; + char sLine[128]; + + if(data.bReplay) + { + StrCat(buffer, maxlen, ""); + + if(data.iStyle != -1 && data.fTime > 0.0 && data.fTime <= data.fWR && Shavit_IsReplayDataLoaded(data.iStyle, data.iTrack)) + { + char sPlayerName[MAX_NAME_LENGTH]; + Shavit_GetReplayName(data.iStyle, data.iTrack, sPlayerName, MAX_NAME_LENGTH); + + char sTrack[32]; + + if(data.iTrack != Track_Main && (gI_HUD2Settings[client] & HUD2_TRACK) == 0) + { + GetTrackName(client, data.iTrack, sTrack, 32); + Format(sTrack, 32, "(%s) ", sTrack); + } + + FormatEx(sLine, 128, "%s %s%T %s", gS_StyleStrings[data.iStyle].sHTMLColor, gS_StyleStrings[data.iStyle].sStyleName, sTrack, "ReplayText", client, sPlayerName); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + + if((gI_HUD2Settings[client] & HUD2_TIME) == 0) + { + char sTime[32]; + FormatSeconds(data.fTime, sTime, 32, false); + + char sWR[32]; + FormatSeconds(data.fWR, sWR, 32, false); + + FormatEx(sLine, 128, "%s / %s (%.1f%%)", sTime, sWR, ((data.fTime / data.fWR) * 100)); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if((gI_HUD2Settings[client] & HUD2_SPEED) == 0) + { + FormatEx(sLine, 128, "%d u/s", data.iSpeed); + AddHUDLine(buffer, maxlen, sLine); + } + } + + else + { + FormatEx(sLine, 128, "%T", "NoReplayData", client); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + StrCat(buffer, maxlen, ""); + + return iLines; + } + + if((gI_HUDSettings[client] & HUD_ZONEHUD) > 0 && data.iZoneHUD != ZoneHUD_None) + { + char sZoneHUD[64]; + FormatEx(sZoneHUD, 64, "", ((gI_Gradient.r << 16) + (gI_Gradient.g << 8) + (gI_Gradient.b))); + StrCat(buffer, maxlen, sZoneHUD); + + FormatEx(sZoneHUD, 64, "%T", (data.iZoneHUD == ZoneHUD_Start)? "HudInStartZoneCSGO":"HudInEndZoneCSGO", client, data.iSpeed); + StrCat(buffer, maxlen, sZoneHUD); + + return ++iLines; + } + + StrCat(buffer, maxlen, ""); + + if(data.iTimerStatus != Timer_Stopped) + { + if(data.bPractice || data.iTimerStatus == Timer_Paused) + { + FormatEx(sLine, 128, "%T", (data.iTimerStatus == Timer_Paused)? "HudPaused":"HudPracticeMode", client); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if(data.iTimerStatus != Timer_Stopped && data.iTrack != Track_Main && (gI_HUD2Settings[client] & HUD2_TRACK) == 0) + { + char sTrack[32]; + GetTrackName(client, data.iTrack, sTrack, 32); + Format(sTrack, 32, "%s", sTrack); + + AddHUDLine(buffer, maxlen, sTrack); + iLines++; + } + + if((gI_HUD2Settings[client] & HUD2_TIME) == 0) + { + int iColor = 0xFF0000; // red, worse than both pb and wr + + if(data.iTimerStatus == Timer_Paused) iColor = 0xA9C5E8; // blue sky + else if(data.fTime < data.fWR || data.fWR == 0.0) iColor = GetGradient(0x00FF00, 0x96172C, RoundToZero((data.fTime / data.fWR) * 100)); + else if(data.fPB != 0.0 && data.fTime < data.fPB) iColor = 0xFFA500; // orange + + char sTime[32]; + FormatSeconds(data.fTime, sTime, 32, false); + + if((gI_HUD2Settings[client] & HUD2_RANK) == 0) + { + FormatEx(sLine, 128, "%s (#%d)", iColor, sTime, data.iRank); + } + + else + { + FormatEx(sLine, 128, "%s", iColor, sTime); + } + + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + } + + if((gI_HUD2Settings[client] & HUD2_SPEED) == 0) + { + int iColor = 0xA0FFFF; + + if((data.iSpeed - gI_PreviousSpeed[client]) < 0) + { + iColor = 0xFFC966; + } + + FormatEx(sLine, 128, "%d u/s", iColor, data.iSpeed); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if(data.iTimerStatus != Timer_Stopped) + { + if((gI_HUD2Settings[client] & HUD2_JUMPS) == 0) + { + FormatEx(sLine, 128, "%d %T", data.iJumps, "HudJumpsText", client); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + if((gI_HUD2Settings[client] & HUD2_STRAFE) == 0) + { + if((gI_HUD2Settings[client] & HUD2_SYNC) == 0) + { + FormatEx(sLine, 128, "%d %T (%.1f%%)", data.iStrafes, "HudStrafeText", client, data.fSync); + } + + else + { + FormatEx(sLine, 128, "%d %T", data.iStrafes, "HudStrafeText", client); + } + + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + } + + if((gI_HUD2Settings[client] & HUD2_STYLE) == 0) + { + FormatEx(sLine, 128, "%s", gS_StyleStrings[data.iStyle].sHTMLColor, gS_StyleStrings[data.iStyle].sStyleName); + AddHUDLine(buffer, maxlen, sLine); + iLines++; + } + + StrCat(buffer, maxlen, ""); + + return iLines; +} + +void UpdateMainHUD(int client) { int target = GetHUDTarget(client); - if(((gI_HUDSettings[client] & HUD_OBSERVE) == 0 && client != target) || + if((gI_HUDSettings[client] & HUD_CENTER) == 0 || + ((gI_HUDSettings[client] & HUD_OBSERVE) == 0 && client != target) || (gEV_Type == Engine_TF2 && (!gB_FirstPrint[target] || GetEngineTime() - gF_ConnectTime[target] < 1.5))) // TF2 has weird handling for hint text { return; } - int style = Shavit_GetBhopStyle(target); - float fSpeed[3]; GetEntPropVector(target, Prop_Data, "m_vecVelocity", fSpeed); - int iSpeed = RoundToNearest(((gI_HUDSettings[client] & HUD_2DVEL) == 0)? GetVectorLength(fSpeed):(SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0)))); + bool bReplay = (gB_Replay && IsFakeClient(target)); + ZoneHUD iZoneHUD = ZoneHUD_None; + int iReplayStyle = 0; + int iReplayTrack = 0; + float fReplayTime = 0.0; + float fReplayLength = 0.0; - char sHintText[512]; - strcopy(sHintText, 512, ""); - - if(!IsFakeClient(target) && (gI_HUDSettings[client] & HUD_ZONEHUD) > 0) + if(!bReplay) { if(Shavit_InsideZone(target, Zone_Start, -1)) { - if(gEV_Type == Engine_CSGO) - { - FormatEx(sHintText, 128, " %T\n\t %T: %d", ((gI_GradientColors[0] << 16) + (gI_GradientColors[1] << 8) + (gI_GradientColors[2])), "HudStartZone", client, "HudSpeedText", client, iSpeed); - } - - else - { - // yes, this space is intentional - FormatEx(sHintText, 32, "%T ", "HudInStartZone", client, iSpeed); - } + iZoneHUD = ZoneHUD_Start; } - + else if(Shavit_InsideZone(target, Zone_End, -1)) { - if(gEV_Type == Engine_CSGO) - { - FormatEx(sHintText, 128, " %T\n\t %T: %d", ((gI_GradientColors[0] << 16) + (gI_GradientColors[1] << 8) + (gI_GradientColors[2])), "HudEndZone", client, "HudSpeedText", client, iSpeed); - } - - else - { - FormatEx(sHintText, 32, "%T ", "HudInEndZone", client, iSpeed); - } + iZoneHUD = ZoneHUD_End; } } - if(strlen(sHintText) > 0) + else { - FixCSGOText(sHintText, 512); - PrintHintText(client, "%s", sHintText); + iReplayStyle = Shavit_GetReplayBotStyle(target); + iReplayTrack = Shavit_GetReplayBotTrack(target); + + if(iReplayStyle != -1) + { + fReplayTime = (Shavit_GetReplayTime(iReplayStyle, iReplayTrack) * gA_StyleSettings[iReplayStyle].fTimescale); + fReplayLength = Shavit_GetReplayLength(iReplayStyle, iReplayTrack); + } } - else if((gI_HUDSettings[client] & HUD_CENTER) > 0) + huddata_t huddata; + huddata.iTarget = target; + huddata.iSpeed = RoundToNearest(((gI_HUDSettings[client] & HUD_2DVEL) == 0)? GetVectorLength(fSpeed):(SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0)))); + huddata.iZoneHUD = iZoneHUD; + huddata.iStyle = (bReplay)? iReplayStyle:Shavit_GetBhopStyle(target); + huddata.iTrack = (bReplay)? iReplayTrack:Shavit_GetClientTrack(target); + huddata.fTime = (bReplay)? fReplayTime:Shavit_GetClientTime(target); + huddata.iJumps = (bReplay)? 0:Shavit_GetClientJumps(target); + huddata.iStrafes = (bReplay)? 0:Shavit_GetStrafeCount(target); + huddata.iRank = (bReplay)? 0:Shavit_GetRankForTime(huddata.iStyle, huddata.fTime, huddata.iTrack); + huddata.fSync = (bReplay)? 0.0:Shavit_GetSync(target); + huddata.fPB = (bReplay)? 0.0:Shavit_GetClientPB(target, huddata.iStyle, huddata.iTrack); + huddata.fWR = (bReplay)? fReplayLength:Shavit_GetWorldRecord(huddata.iStyle, huddata.iTrack); + huddata.iTimerStatus = (bReplay)? Timer_Running:Shavit_GetTimerStatus(target); + huddata.bReplay = bReplay; + huddata.bPractice = (bReplay)? false:Shavit_IsPracticeMode(target); + + char sBuffer[512]; + int iLines = 0; + + if(IsSource2013(gEV_Type)) { - int track = Shavit_GetClientTrack(target); + iLines = AddHUDToBuffer_Source2013(client, huddata, sBuffer, 512); + } - if(!IsFakeClient(target)) - { - char sTrack[32]; + else + { + StrCat(sBuffer, 512, "
");
+		iLines = AddHUDToBuffer_CSGO(client, huddata, sBuffer, 512);
+		StrCat(sBuffer, 512, "
"); + } - if(track != Track_Main) - { - GetTrackName(client, track, sTrack, 32); - } - - float time = Shavit_GetClientTime(target); - int jumps = Shavit_GetClientJumps(target); - TimerStatus status = Shavit_GetTimerStatus(target); - int strafes = Shavit_GetStrafeCount(target); - int rank = Shavit_GetRankForTime(style, time, track); - - float fWR = 0.0; - Shavit_GetWRTime(style, fWR, track); - - float fPB = 0.0; - Shavit_GetPlayerPB(target, style, fPB, track); - - char sPB[32]; - FormatSeconds(fPB, sPB, 32); - - char sTime[32]; - FormatSeconds(time, sTime, 32, false); - - if(gEV_Type == Engine_CSGO) - { - strcopy(sHintText, 512, ""); - - if(status >= Timer_Running) - { - char sColor[8]; - - if(status == Timer_Paused) - { - strcopy(sColor, 8, "A9C5E8"); - } - - else if(time < fWR || fWR == 0.0) - { - strcopy(sColor, 8, "00FF00"); - } - - else if(fPB != 0.0 && time < fPB) - { - strcopy(sColor, 8, "FFA500"); - } - - else - { - strcopy(sColor, 8, "FF0000"); - } - - if(track != Track_Main) - { - Format(sHintText, 512, "%s[%s] ", sHintText, sTrack); - } - - Format(sHintText, 512, "%s%s (%d)", sHintText, sColor, sTime, rank); - } - - else if(fPB > 0.0) - { - Format(sHintText, 512, "%s%T: %s (#%d)", sHintText, "HudBestText", client, sPB, Shavit_GetRankForTime(style, fPB, track)); - } - - if(status >= Timer_Running) - { - Format(sHintText, 512, "%s\n%T: %d%s\t%T: %s", sHintText, "HudJumpsText", client, jumps, (jumps < 1000)? "\t":"", "HudStyleText", client, gS_StyleStrings[style][sHTMLColor], gS_StyleStrings[style][sStyleName]); - } - - else - { - Format(sHintText, 512, "%s\n%T: %s", sHintText, "HudStyleText", client, gS_StyleStrings[style][sHTMLColor], gS_StyleStrings[style][sStyleName]); - } - - Format(sHintText, 512, "%s\n%T: %d", sHintText, "HudSpeedText", client, iSpeed); - - if(status >= Timer_Running) - { - if(gA_StyleSettings[style][bSync]) - { - Format(sHintText, 512, "%s%s\t%T: %d (%.01f%%)", sHintText, (iSpeed < 1000)? "\t":"", "HudStrafeText", client, strafes, Shavit_GetSync(target)); - } - - else - { - Format(sHintText, 512, "%s%s\t%T: %d", sHintText, (iSpeed < 1000)? "\t":"", "HudStrafeText", client, strafes); - } - } - } - - else - { - if(status != Timer_Stopped) - { - char sFirstLine[64]; - strcopy(sFirstLine, 64, gS_StyleStrings[style][sStyleName]); - - if(Shavit_IsPracticeMode(target)) - { - Format(sFirstLine, 64, "%s %T", sFirstLine, "HudPracticeMode", client); - } - - FormatEx(sHintText, 512, "%s\n%T: %s (%d)\n%T: %d\n%T: %d\n%T: %d%s", sFirstLine, "HudTimeText", client, sTime, rank, "HudJumpsText", client, jumps, "HudStrafeText", client, strafes, "HudSpeedText", client, iSpeed, (gA_StyleSettings[style][fVelocityLimit] > 0.0 && Shavit_InsideZone(target, Zone_NoVelLimit, -1))? "\nNo Speed Limit":""); - - if(Shavit_GetTimerStatus(target) == Timer_Paused) - { - Format(sHintText, 512, "%s\n%T", sHintText, "HudPaused", client); - } - - if(track != Track_Main) - { - Format(sHintText, 512, "%s\n%s", sHintText, sTrack); - } - } - - else - { - IntToString(iSpeed, sHintText, 8); - } - } - - FixCSGOText(sHintText, 512); - PrintHintText(client, "%s", sHintText); - } - - else if(gB_Replay) - { - style = Shavit_GetReplayBotStyle(target); - - if(style == -1) - { - FixCSGOText(sHintText, 512); - PrintHintText(client, "%T", (gEV_Type != Engine_TF2)? "NoReplayData":"NoReplayDataTF2", client); - - return; - } - - iSpeed = RoundToNearest(float(iSpeed) / view_as(gA_StyleSettings[style][fSpeedMultiplier])); - track = Shavit_GetReplayBotTrack(target); - - float fReplayTime = Shavit_GetReplayTime(style, track) * view_as(gA_StyleSettings[style][fTimescale]); - float fReplayLength = Shavit_GetReplayLength(style, track); - - if(fReplayTime < 0.0 || fReplayTime > fReplayLength || !Shavit_IsReplayDataLoaded(style, track)) - { - return; - } - - char sReplayTime[32]; - FormatSeconds(fReplayTime, sReplayTime, 32, false); - - char sReplayLength[32]; - FormatSeconds(fReplayLength, sReplayLength, 32, false); - - char sTrack[32]; - - if(track != Track_Main) - { - GetTrackName(client, track, sTrack, 32); - Format(sTrack, 32, "(%s) ", sTrack); - } - - if(gEV_Type == Engine_CSGO) - { - FormatEx(sHintText, 512, ""); - Format(sHintText, 512, "%s\t%s %T", sHintText, gS_StyleStrings[style][sHTMLColor], gS_StyleStrings[style][sStyleName], "ReplayText", client); - Format(sHintText, 512, "%s\n\t%T: %s / %s", sHintText, "HudTimeText", client, sReplayTime, sReplayLength); - Format(sHintText, 512, "%s\n\t%T: %d", sHintText, "HudSpeedText", client, iSpeed); - } - - else - { - char sPlayerName[MAX_NAME_LENGTH]; - Shavit_GetReplayName(style, track, sPlayerName, MAX_NAME_LENGTH); - - FormatEx(sHintText, 512, "%s %s%T", gS_StyleStrings[style][sStyleName], sTrack, "ReplayText", client); - Format(sHintText, 512, "%s\n%s", sHintText, sPlayerName); - Format(sHintText, 512, "%s\n%T: %s/%s", sHintText, "HudTimeText", client, sReplayTime, sReplayLength); - Format(sHintText, 512, "%s\n%T: %d", sHintText, "HudSpeedText", client, iSpeed); - } - - FixCSGOText(sHintText, 512); - PrintHintText(client, "%s", sHintText); - } + if(iLines > 0) + { + PrintHintText(client, "%s", sBuffer); } } @@ -902,9 +1322,6 @@ void UpdateKeyOverlay(int client, Panel panel, bool &draw) // to make it shorter int buttons = gI_Buttons[target]; - - char sPanelLine[128]; - int style = (IsFakeClient(target))? Shavit_GetReplayBotStyle(target):Shavit_GetBhopStyle(target); if(!(0 <= style < gI_Styles)) @@ -912,7 +1329,9 @@ void UpdateKeyOverlay(int client, Panel panel, bool &draw) style = 0; } - if(gB_BhopStats && !gA_StyleSettings[style][bAutobhop]) + char sPanelLine[128]; + + if(gB_BhopStats && !gA_StyleSettings[style].bAutobhop) { FormatEx(sPanelLine, 64, " %d%s%d\n", gI_ScrollCount[target], (gI_ScrollCount[target] > 9)? " ":" ", gI_LastScrollCount[target]); } @@ -966,7 +1385,7 @@ void UpdateCenterKeys(int client) style = 0; } - if(gB_BhopStats && !gA_StyleSettings[style][bAutobhop]) + if(gB_BhopStats && !gA_StyleSettings[style].bAutobhop) { Format(sCenterText, 64, "%s\n  %d %d", sCenterText, gI_ScrollCount[target], gI_LastScrollCount[target]); } @@ -999,8 +1418,8 @@ void UpdateSpectatorList(int client, Panel panel, bool &draw) continue; } - if((gI_SpectatorList == 1 && !bIsAdmin && CheckCommandAccess(i, "admin_speclisthide", ADMFLAG_KICK)) || - (gI_SpectatorList == 2 && !CanUserTarget(client, i))) + if((gCV_SpectatorList.IntValue == 1 && !bIsAdmin && CheckCommandAccess(i, "admin_speclisthide", ADMFLAG_KICK)) || + (gCV_SpectatorList.IntValue == 2 && !CanUserTarget(client, i))) { continue; } @@ -1064,8 +1483,7 @@ void UpdateTopLeftHUD(int client, bool wait) return; } - float fWRTime = 0.0; - Shavit_GetWRTime(style, fWRTime, track); + float fWRTime = Shavit_GetWorldRecord(style, track); if(fWRTime != 0.0) { @@ -1075,8 +1493,7 @@ void UpdateTopLeftHUD(int client, bool wait) char sWRName[MAX_NAME_LENGTH]; Shavit_GetWRName(style, sWRName, MAX_NAME_LENGTH, track); - float fPBTime = 0.0; - Shavit_GetPlayerPB(target, style, fPBTime, track); + float fPBTime = Shavit_GetClientPB(target, style, track); char sPBTime[16]; FormatSeconds(fPBTime, sPBTime, MAX_NAME_LENGTH); @@ -1117,11 +1534,11 @@ void UpdateKeyHint(int client) { int style = Shavit_GetBhopStyle(target); - if((gI_HUDSettings[client] & HUD_SYNC) > 0 && Shavit_GetTimerStatus(target) == Timer_Running && gA_StyleSettings[style][bSync] && !IsFakeClient(target) && (!gB_Zones || !Shavit_InsideZone(target, Zone_Start, -1))) + if((gI_HUDSettings[client] & HUD_SYNC) > 0 && Shavit_GetTimerStatus(target) == Timer_Running && gA_StyleSettings[style].bSync && !IsFakeClient(target) && (!gB_Zones || !Shavit_InsideZone(target, Zone_Start, -1))) { Format(sMessage, 256, "%s%s%T: %.01f", sMessage, (strlen(sMessage) > 0)? "\n\n":"", "HudSync", client, Shavit_GetSync(target)); - if(!gA_StyleSettings[style][bAutobhop]) + if(!gA_StyleSettings[style].bAutobhop) { Format(sMessage, 256, "%s\n%T: %.1f", sMessage, "HudPerfs", client, Shavit_GetPerfectJumps(target)); } @@ -1140,8 +1557,8 @@ void UpdateKeyHint(int client) continue; } - if((gI_SpectatorList == 1 && !bIsAdmin && CheckCommandAccess(i, "admin_speclisthide", ADMFLAG_KICK)) || - (gI_SpectatorList == 2 && !CanUserTarget(client, i))) + if((gCV_SpectatorList.IntValue == 1 && !bIsAdmin && CheckCommandAccess(i, "admin_speclisthide", ADMFLAG_KICK)) || + (gCV_SpectatorList.IntValue == 2 && !CanUserTarget(client, i))) { continue; } diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 729b62cc..7597bd7a 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -33,32 +33,6 @@ #undef REQUIRE_PLUGIN #include -// this one is here because enum structs don't work with new syntax -enum CheckpointsCache -{ - Float:fCPPosition[3], - Float:fCPAngles[3], - Float:fCPVelocity[3], - MoveType:mtCPMoveType, - Float:fCPGravity, - Float:fCPSpeed, - Float:fCPStamina, - bool:bCPDucked, - bool:bCPDucking, - Float:fCPDucktime, // m_flDuckAmount in csgo - Float:fCPDuckSpeed, // m_flDuckSpeed in csgo, doesn't exist in css - iCPFlags, - any:aCPSnapshot[TIMERSNAPSHOT_SIZE], - iCPTargetname, - iCPClassname, - ArrayList:aCPFrames, - bool:bCPSegmented, - iCPSerial, - bool:bCPPractice, - iCPGroundEntity, - PCPCACHE_SIZE -} - #pragma newdecls required #pragma semicolon 1 #pragma dynamic 524288 @@ -68,13 +42,44 @@ enum CheckpointsCache #define CP_DEFAULT (CP_ANGLES|CP_VELOCITY) +enum struct cp_cache_t +{ + float fPosition[3]; + float fAngles[3]; + float fVelocity[3]; + float fBaseVelocity[3]; + MoveType iMoveType; + float fGravity; + float fSpeed; + float fStamina; + bool bDucked; + bool bDucking; + float fDucktime; // m_flDuckAmount in csgo + float fDuckSpeed; // m_flDuckSpeed in csgo; doesn't exist in css + int iFlags; + timer_snapshot_t aSnapshot; + int iTargetname; + int iClassname; + ArrayList aFrames; + bool bSegmented; + int iSerial; + bool bPractice; + int iGroundEntity; +} + +enum struct player_cpcache_t +{ + int iCheckpoints; + int iCurrentCheckpoint; +}; + // game specific EngineVersion gEV_Type = Engine_Unknown; int gI_Ammo = -1; -char gS_RadioCommands[][] = {"coverme", "takepoint", "holdpos", "regroup", "followme", "takingfire", "go", "fallback", "sticktog", +char gS_RadioCommands[][] = { "coverme", "takepoint", "holdpos", "regroup", "followme", "takingfire", "go", "fallback", "sticktog", "getinpos", "stormfront", "report", "roger", "enemyspot", "needbackup", "sectorclear", "inposition", "reportingin", - "getout", "negative", "enemydown", "compliment", "thanks", "cheer"}; + "getout", "negative", "enemydown", "compliment", "thanks", "cheer" }; // cache ConVar sv_disable_immunity_alpha = null; @@ -91,22 +96,16 @@ int gI_AdvertisementsCycle = 0; char gS_CurrentMap[192]; int gI_Style[MAXPLAYERS+1]; -enum -{ - iCheckpoints, - iCurrentCheckpoint, - CPCACHE_SIZE -}; - -int gI_CheckpointsCache[MAXPLAYERS+1][CPCACHE_SIZE]; +player_cpcache_t gA_CheckpointsCache[MAXPLAYERS+1]; int gI_CheckpointsSettings[MAXPLAYERS+1]; StringMap gSM_Checkpoints = null; ArrayList gA_Targetnames = null; ArrayList gA_Classnames = null; // save states +bool gB_SaveStatesSegmented[MAXPLAYERS+1]; float gF_SaveStateData[MAXPLAYERS+1][3][3]; -any gA_SaveStates[MAXPLAYERS+1][TIMERSNAPSHOT_SIZE]; +timer_snapshot_t gA_SaveStates[MAXPLAYERS+1]; bool gB_SaveStates[MAXPLAYERS+1]; char gS_SaveStateTargetname[MAXPLAYERS+1][32]; ArrayList gA_SaveFrames[MAXPLAYERS+1]; @@ -149,38 +148,7 @@ ConVar gCV_MaxCP = null; ConVar gCV_MaxCP_Segmented = null; // cached cvars -int gI_GodMode = 3; -int gI_PreSpeed = 1; -bool gB_HideTeamChanges = true; -bool gB_RespawnOnTeam = true; -bool gB_RespawnOnRestart = true; -bool gB_StartOnSpawn = true; -float gF_PrestrafeLimit = 30.00; -bool gB_HideRadar = true; -bool gB_TeleportCommands = true; -bool gB_NoWeaponDrops = true; -bool gB_NoBlock = true; -bool gB_NoBlood = false; -float gF_AutoRespawn = 1.5; -int gI_CreateSpawnPoints = 6; -bool gB_DisableRadio = false; -bool gB_Scoreboard = true; -int gI_WeaponCommands = 2; -int gI_PlayerOpacity = -1; -bool gB_StaticPrestrafe = true; -int gI_NoclipMe = true; -float gF_AdvertisementInterval = 600.0; -bool gB_Checkpoints = true; -int gI_RemoveRagdolls = 1; -char gS_ClanTag[32] = "{tr}{styletag} :: {time}"; -bool gB_DropAll = true; -bool gB_ResetTargetname = false; -bool gB_RestoreStates = false; -bool gB_JointeamHook = true; int gI_HumanTeam = 0; -int gI_SpectatorList = 1; -int gI_MaxCP = 1000; -int gI_MaxCP_Segmented = 10; // dhooks Handle gH_GetPlayerMaxSpeed = null; @@ -191,11 +159,11 @@ bool gB_Replay = false; bool gB_Zones = false; // timer settings -char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128]; -any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE]; +stylestrings_t gS_StyleStrings[STYLE_LIMIT]; +stylesettings_t gA_StyleSettings[STYLE_LIMIT]; // chat settings -char gS_ChatStrings[CHATSETTINGS_SIZE][128]; +chatstrings_t gS_ChatStrings; public Plugin myinfo = { @@ -293,12 +261,6 @@ public void OnPluginStart() gA_Advertisements = new ArrayList(300); hostname = FindConVar("hostname"); hostport = FindConVar("hostport"); - mp_humanteam = FindConVar("mp_humanteam"); - - if(mp_humanteam == null) - { - mp_humanteam = FindConVar("mp_humans_must_join_team"); - } // cvars and stuff gCV_GodMode = CreateConVar("shavit_misc_godmode", "3", "Enable godmode for players?\n0 - Disabled\n1 - Only prevent fall/world damage.\n2 - Only prevent damage from other players.\n3 - Full godmode.", 0, true, 0.0, true, 3.0); @@ -333,42 +295,17 @@ public void OnPluginStart() gCV_MaxCP = CreateConVar("shavit_misc_maxcp", "1000", "Maximum amount of checkpoints.\nNote: Very high values will result in high memory usage!", 0, true, 1.0, true, 10000.0); gCV_MaxCP_Segmented = CreateConVar("shavit_misc_maxcp_seg", "10", "Maximum amount of segmented checkpoints. Make this less or equal to shavit_misc_maxcp.\nNote: Very high values will result in HUGE memory usage!", 0, true, 1.0, true, 50.0); - gCV_GodMode.AddChangeHook(OnConVarChanged); - gCV_PreSpeed.AddChangeHook(OnConVarChanged); - gCV_HideTeamChanges.AddChangeHook(OnConVarChanged); - gCV_RespawnOnTeam.AddChangeHook(OnConVarChanged); - gCV_RespawnOnRestart.AddChangeHook(OnConVarChanged); - gCV_StartOnSpawn.AddChangeHook(OnConVarChanged); - gCV_PrestrafeLimit.AddChangeHook(OnConVarChanged); - gCV_HideRadar.AddChangeHook(OnConVarChanged); - gCV_TeleportCommands.AddChangeHook(OnConVarChanged); - gCV_NoWeaponDrops.AddChangeHook(OnConVarChanged); - gCV_NoBlock.AddChangeHook(OnConVarChanged); - gCV_NoBlood.AddChangeHook(OnConVarChanged); - gCV_AutoRespawn.AddChangeHook(OnConVarChanged); - gCV_CreateSpawnPoints.AddChangeHook(OnConVarChanged); - gCV_DisableRadio.AddChangeHook(OnConVarChanged); - gCV_Scoreboard.AddChangeHook(OnConVarChanged); - gCV_WeaponCommands.AddChangeHook(OnConVarChanged); - gCV_PlayerOpacity.AddChangeHook(OnConVarChanged); - gCV_StaticPrestrafe.AddChangeHook(OnConVarChanged); - gCV_NoclipMe.AddChangeHook(OnConVarChanged); - gCV_AdvertisementInterval.AddChangeHook(OnConVarChanged); - gCV_Checkpoints.AddChangeHook(OnConVarChanged); - gCV_RemoveRagdolls.AddChangeHook(OnConVarChanged); - gCV_ClanTag.AddChangeHook(OnConVarChanged); - gCV_DropAll.AddChangeHook(OnConVarChanged); - gCV_ResetTargetname.AddChangeHook(OnConVarChanged); - gCV_RestoreStates.AddChangeHook(OnConVarChanged); - gCV_JointeamHook.AddChangeHook(OnConVarChanged); - gCV_SpectatorList.AddChangeHook(OnConVarChanged); - gCV_MaxCP.AddChangeHook(OnConVarChanged); - gCV_MaxCP_Segmented.AddChangeHook(OnConVarChanged); + AutoExecConfig(); + + mp_humanteam = FindConVar("mp_humanteam"); + + if(mp_humanteam == null) + { + mp_humanteam = FindConVar("mp_humans_must_join_team"); + } mp_humanteam.AddChangeHook(OnConVarChanged); - AutoExecConfig(); - // crons if(gEV_Type != Engine_TF2) { @@ -468,18 +405,20 @@ public void Shavit_OnStyleConfigLoaded(int styles) for(int i = 0; i < styles; i++) { Shavit_GetStyleSettings(i, gA_StyleSettings[i]); - Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i][sStyleName], 128); - Shavit_GetStyleStrings(i, sClanTag, gS_StyleStrings[i][sClanTag], 128); - Shavit_GetStyleStrings(i, sSpecialString, gS_StyleStrings[i][sSpecialString], 128); + Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName)); + Shavit_GetStyleStrings(i, sClanTag, gS_StyleStrings[i].sClanTag, sizeof(stylestrings_t::sClanTag)); + Shavit_GetStyleStrings(i, sSpecialString, gS_StyleStrings[i].sSpecialString, sizeof(stylestrings_t::sSpecialString)); } } public void Shavit_OnChatConfigLoaded() { - for(int i = 0; i < CHATSETTINGS_SIZE; i++) - { - Shavit_GetChatStrings(i, gS_ChatStrings[i], 128); - } + Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); if(!LoadAdvertisementsConfig()) { @@ -491,47 +430,15 @@ public void Shavit_OnStyleChanged(int client, int oldstyle, int newstyle, int tr { gI_Style[client] = newstyle; - if(StrContains(gS_StyleStrings[newstyle][sSpecialString], "segments") != -1) + if(StrContains(gS_StyleStrings[newstyle].sSpecialString, "segments") != -1) { OpenCheckpointsMenu(client, 0); - Shavit_PrintToChat(client, "%T", "MiscSegmentedCommand", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MiscSegmentedCommand", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText); } } public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) { - gI_GodMode = gCV_GodMode.IntValue; - gI_PreSpeed = gCV_PreSpeed.IntValue; - gB_HideTeamChanges = gCV_HideTeamChanges.BoolValue; - gB_RespawnOnTeam = gCV_RespawnOnTeam.BoolValue; - gB_RespawnOnRestart = gCV_RespawnOnRestart.BoolValue; - gB_StartOnSpawn = gCV_StartOnSpawn.BoolValue; - gF_PrestrafeLimit = gCV_PrestrafeLimit.FloatValue; - gB_HideRadar = gCV_HideRadar.BoolValue; - gB_TeleportCommands = gCV_TeleportCommands.BoolValue; - gB_NoWeaponDrops = gCV_NoWeaponDrops.BoolValue; - gB_NoBlock = gCV_NoBlock.BoolValue; - gB_NoBlood = gCV_NoBlood.BoolValue; - gF_AutoRespawn = gCV_AutoRespawn.FloatValue; - gI_CreateSpawnPoints = gCV_CreateSpawnPoints.IntValue; - gB_DisableRadio = gCV_DisableRadio.BoolValue; - gB_Scoreboard = gCV_Scoreboard.BoolValue; - gI_WeaponCommands = gCV_WeaponCommands.IntValue; - gI_PlayerOpacity = gCV_PlayerOpacity.IntValue; - gB_StaticPrestrafe = gCV_StaticPrestrafe.BoolValue; - gI_NoclipMe = gCV_NoclipMe.IntValue; - gF_AdvertisementInterval = gCV_AdvertisementInterval.FloatValue; - gB_Checkpoints = gCV_Checkpoints.BoolValue; - gI_RemoveRagdolls = gCV_RemoveRagdolls.IntValue; - gCV_ClanTag.GetString(gS_ClanTag, 32); - gB_DropAll = gCV_DropAll.BoolValue; - gB_ResetTargetname = gCV_ResetTargetname.BoolValue; - gB_RestoreStates = gCV_RestoreStates.BoolValue; - gB_JointeamHook = gCV_JointeamHook.BoolValue; - gI_SpectatorList = gCV_SpectatorList.IntValue; - gI_MaxCP = gCV_MaxCP.IntValue; - gI_MaxCP_Segmented = gCV_MaxCP_Segmented.IntValue; - if(convar == mp_humanteam) { if(StrEqual(newValue, "t", false) || StrEqual(newValue, "red", false)) @@ -573,7 +480,7 @@ public void OnMapStart() GetCurrentMap(gS_CurrentMap, 192); GetMapDisplayName(gS_CurrentMap, gS_CurrentMap, 192); - if(gI_CreateSpawnPoints > 0) + if(gCV_CreateSpawnPoints.IntValue > 0) { int iEntity = -1; @@ -585,7 +492,7 @@ public void OnMapStart() float fOrigin[3]; GetEntPropVector(iEntity, Prop_Send, "m_vecOrigin", fOrigin); - for(int i = 1; i <= gI_CreateSpawnPoints; i++) + for(int i = 1; i <= gCV_CreateSpawnPoints.IntValue; i++) { for(int iTeam = 1; iTeam <= 2; iTeam++) { @@ -606,9 +513,9 @@ public void OnMapStart() Shavit_OnChatConfigLoaded(); } - if(gF_AdvertisementInterval > 0.0) + if(gCV_AdvertisementInterval.FloatValue > 0.0) { - CreateTimer(gF_AdvertisementInterval, Timer_Advertisement, 0, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); + CreateTimer(gCV_AdvertisementInterval.FloatValue, Timer_Advertisement, 0, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); } } @@ -641,11 +548,11 @@ bool LoadAdvertisementsConfig() char sTempMessage[300]; kv.GetString(NULL_STRING, sTempMessage, 300, ""); - ReplaceString(sTempMessage, 300, "{text}", gS_ChatStrings[sMessageText]); - ReplaceString(sTempMessage, 300, "{warning}", gS_ChatStrings[sMessageWarning]); - ReplaceString(sTempMessage, 300, "{variable}", gS_ChatStrings[sMessageVariable]); - ReplaceString(sTempMessage, 300, "{variable2}", gS_ChatStrings[sMessageVariable2]); - ReplaceString(sTempMessage, 300, "{style}", gS_ChatStrings[sMessageStyle]); + ReplaceString(sTempMessage, 300, "{text}", gS_ChatStrings.sText); + ReplaceString(sTempMessage, 300, "{warning}", gS_ChatStrings.sWarning); + ReplaceString(sTempMessage, 300, "{variable}", gS_ChatStrings.sVariable); + ReplaceString(sTempMessage, 300, "{variable2}", gS_ChatStrings.sVariable2); + ReplaceString(sTempMessage, 300, "{style}", gS_ChatStrings.sStyle); gA_Advertisements.PushString(sTempMessage); } @@ -695,7 +602,7 @@ public void OnLibraryRemoved(const char[] name) public Action Command_Jointeam(int client, const char[] command, int args) { - if(!IsValidClient(client) || !gB_JointeamHook) + if(!IsValidClient(client) || !gCV_JointeamHook.BoolValue) { return Plugin_Continue; } @@ -752,7 +659,7 @@ public Action Command_Jointeam(int client, const char[] command, int args) } } - if(gB_RespawnOnTeam && bRespawn) + if(gCV_RespawnOnTeam.BoolValue && bRespawn) { if(gEV_Type == Engine_TF2) { @@ -790,7 +697,7 @@ void CleanSwitchTeam(int client, int team, bool change = false) public Action Command_Radio(int client, const char[] command, int args) { - if(gB_DisableRadio) + if(gCV_DisableRadio.BoolValue) { return Plugin_Handled; } @@ -800,12 +707,12 @@ public Action Command_Radio(int client, const char[] command, int args) public MRESReturn CCSPlayer__GetPlayerMaxSpeed(int pThis, Handle hReturn) { - if(!gB_StaticPrestrafe || !IsValidClient(pThis, true)) + if(!gCV_StaticPrestrafe.BoolValue || !IsValidClient(pThis, true)) { return MRES_Ignored; } - DHookSetReturn(hReturn, view_as(gA_StyleSettings[gI_Style[pThis]][fRunspeed])); + DHookSetReturn(hReturn, view_as(gA_StyleSettings[gI_Style[pThis]].fRunspeed)); return MRES_Override; } @@ -819,7 +726,7 @@ public Action Timer_Scoreboard(Handle Timer) continue; } - if(gB_Scoreboard) + if(gCV_Scoreboard.BoolValue) { UpdateScoreboard(i); } @@ -890,8 +797,7 @@ void UpdateScoreboard(int client) return; } - float fPB = 0.0; - Shavit_GetPlayerPB(client, 0, fPB, Track_Main); + float fPB = Shavit_GetClientPB(client, 0, Track_Main); int iScore = (fPB != 0.0 && fPB < 2000)? -RoundToFloor(fPB):-2000; @@ -914,7 +820,10 @@ void UpdateScoreboard(int client) void UpdateClanTag(int client) { // no clan tags in tf2 - if(gEV_Type == Engine_TF2 || StrEqual(gS_ClanTag, "0")) + char sTag[32]; + gCV_ClanTag.GetString(sTag, 32); + + if(gEV_Type == Engine_TF2 || StrEqual(sTag, "0")) { return; } @@ -965,9 +874,9 @@ void UpdateClanTag(int client) } char sCustomTag[32]; - strcopy(sCustomTag, 32, gS_ClanTag); - ReplaceString(sCustomTag, 32, "{style}", gS_StyleStrings[gI_Style[client]][sStyleName]); - ReplaceString(sCustomTag, 32, "{styletag}", gS_StyleStrings[gI_Style[client]][sClanTag]); + strcopy(sCustomTag, 32, sTag); + ReplaceString(sCustomTag, 32, "{style}", gS_StyleStrings[gI_Style[client]].sStyleName); + ReplaceString(sCustomTag, 32, "{styletag}", gS_StyleStrings[gI_Style[client]].sClanTag); ReplaceString(sCustomTag, 32, "{time}", sTime); ReplaceString(sCustomTag, 32, "{tr}", sTrack); @@ -984,7 +893,7 @@ void RemoveRagdoll(int client) } } -public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, any stylesettings[STYLESETTINGS_SIZE]) +public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, stylesettings_t stylesettings) { bool bNoclip = (GetEntityMoveType(client) == MOVETYPE_NOCLIP); @@ -997,33 +906,30 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float int iGroundEntity = GetEntPropEnt(client, Prop_Send, "m_hGroundEntity"); // prespeed - if(!bNoclip && !gA_StyleSettings[gI_Style[client]][bPrespeed] && Shavit_InsideZone(client, Zone_Start, track)) + if(!bNoclip && !gA_StyleSettings[gI_Style[client]].bPrespeed && Shavit_InsideZone(client, Zone_Start, track)) { - if((gI_PreSpeed == 2 || gI_PreSpeed == 3) && gI_GroundEntity[client] == -1 && iGroundEntity != -1 && (buttons & IN_JUMP) > 0) + if((gCV_PreSpeed.IntValue == 2 || gCV_PreSpeed.IntValue == 3) && gI_GroundEntity[client] == -1 && iGroundEntity != -1 && (buttons & IN_JUMP) > 0) { TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, view_as({0.0, 0.0, 0.0})); - Shavit_PrintToChat(client, "%T", "BHStartZoneDisallowed", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "BHStartZoneDisallowed", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText, gS_ChatStrings.sWarning, gS_ChatStrings.sText); gI_GroundEntity[client] = iGroundEntity; return Plugin_Continue; } - if(gI_PreSpeed == 1 || gI_PreSpeed >= 3) + if(gCV_PreSpeed.IntValue == 1 || gCV_PreSpeed.IntValue >= 3) { float fSpeed[3]; GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", fSpeed); - float fLimit = view_as(gA_StyleSettings[gI_Style[client]][fRunspeed]) + gF_PrestrafeLimit; + float fLimit = (gA_StyleSettings[gI_Style[client]].fRunspeed + gCV_PrestrafeLimit.FloatValue); - if(gI_PreSpeed < 4) + // if trying to jump, add a very low limit to stop prespeeding in an elegant way + // otherwise, make sure nothing weird is happening (such as sliding at ridiculous speeds, at zone enter) + if(gCV_PreSpeed.IntValue < 4 && fSpeed[2] > 0.0) { - // if trying to jump, add a very low limit to stop prespeeding in an elegant way - // otherwise, make sure nothing weird is happening (such as sliding at ridiculous speeds, at zone enter) - if(fSpeed[2] > 0.0) - { - fLimit /= 3.0; - } + fLimit /= 3.0; } float fSpeedXY = (SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0))); @@ -1080,7 +986,7 @@ public void OnClientPutInServer(int client) public void OnClientDisconnect(int client) { - if(gB_NoWeaponDrops) + if(gCV_NoWeaponDrops.BoolValue) { int entity = -1; @@ -1109,22 +1015,22 @@ void ResetCheckpoints(int client) int serial = GetClientSerial(client); char key[32]; - for(int i = 0; i < gI_CheckpointsCache[client][iCheckpoints]; i++) + for(int i = 0; i < gA_CheckpointsCache[client].iCheckpoints; i++) { FormatEx(key, 32, "%d_%d", serial, i); - CheckpointsCache cpcache[PCPCACHE_SIZE]; + cp_cache_t cpcache; - if(gSM_Checkpoints.GetArray(key, cpcache[0], view_as(PCPCACHE_SIZE))) + if(gSM_Checkpoints.GetArray(key, cpcache, sizeof(cp_cache_t))) { - delete cpcache[aCPFrames]; // free up replay frames if there are any + delete cpcache.aFrames; // free up replay frames if there are any } gSM_Checkpoints.Remove(key); } - gI_CheckpointsCache[client][iCheckpoints] = 0; - gI_CheckpointsCache[client][iCurrentCheckpoint] = 1; + gA_CheckpointsCache[client].iCheckpoints = 0; + gA_CheckpointsCache[client].iCurrentCheckpoint = 1; } public Action OnTakeDamage(int victim, int attacker) @@ -1145,7 +1051,7 @@ public Action OnTakeDamage(int victim, int attacker) } } - switch(gI_GodMode) + switch(gCV_GodMode.IntValue) { case 0: { @@ -1181,7 +1087,7 @@ public Action OnTakeDamage(int victim, int attacker) public void OnWeaponDrop(int client, int entity) { - if(gB_NoWeaponDrops && IsValidEntity(entity)) + if(gCV_NoWeaponDrops.BoolValue && IsValidEntity(entity)) { AcceptEntityInput(entity, "Kill"); } @@ -1204,7 +1110,7 @@ public void OnPreThink(int client) if(IsPlayerAlive(client)) { // not the best method, but only one i found for tf2 - SetEntPropFloat(client, Prop_Send, "m_flMaxspeed", view_as(gA_StyleSettings[gI_Style[client]][fRunspeed])); + SetEntPropFloat(client, Prop_Send, "m_flMaxspeed", gA_StyleSettings[gI_Style[client]].fRunspeed); } } @@ -1259,12 +1165,12 @@ public Action Command_Hide(int client, int args) if(gB_Hide[client]) { - Shavit_PrintToChat(client, "%T", "HideEnabled", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "HideEnabled", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText); } else { - Shavit_PrintToChat(client, "%T", "HideDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "HideDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } return Plugin_Handled; @@ -1314,9 +1220,9 @@ public Action Command_Teleport(int client, int args) return Plugin_Handled; } - if(!gB_TeleportCommands) + if(!gCV_TeleportCommands.BoolValue) { - Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } @@ -1398,7 +1304,7 @@ bool Teleport(int client, int targetserial) if(Shavit_InsideZone(client, Zone_Start, -1) || Shavit_InsideZone(client, Zone_End, -1)) { - Shavit_PrintToChat(client, "%T", "TeleportInZone", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "TeleportInZone", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return false; } @@ -1427,16 +1333,16 @@ public Action Command_Weapon(int client, int args) return Plugin_Handled; } - if(gI_WeaponCommands == 0) + if(gCV_WeaponCommands.IntValue == 0) { - Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } if(!IsPlayerAlive(client)) { - Shavit_PrintToChat(client, "%T", "WeaponAlive", client, gS_ChatStrings[sMessageVariable2], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "WeaponAlive", client, gS_ChatStrings.sVariable2, gS_ChatStrings.sText); return Plugin_Handled; } @@ -1517,15 +1423,15 @@ public Action Command_Save(int client, int args) int iMaxCPs = GetMaxCPs(client); bool bSegmenting = CanSegment(client); - if(!gB_Checkpoints && !bSegmenting) + if(!gCV_Checkpoints.BoolValue && !bSegmenting) { - Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } - bool bOverflow = gI_CheckpointsCache[client][iCheckpoints] >= iMaxCPs; - int index = gI_CheckpointsCache[client][iCheckpoints] + 1; + bool bOverflow = gA_CheckpointsCache[client].iCheckpoints >= iMaxCPs; + int index = gA_CheckpointsCache[client].iCheckpoints + 1; if(!bSegmenting) { @@ -1536,15 +1442,15 @@ public Action Command_Save(int client, int args) if(bOverflow) { - Shavit_PrintToChat(client, "%T", "MiscCheckpointsOverflow", client, index, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MiscCheckpointsOverflow", client, index, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return Plugin_Handled; } if(SaveCheckpoint(client, index)) { - gI_CheckpointsCache[client][iCurrentCheckpoint] = ++gI_CheckpointsCache[client][iCheckpoints]; - Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + gA_CheckpointsCache[client].iCurrentCheckpoint = ++gA_CheckpointsCache[client].iCheckpoints; + Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gA_CheckpointsCache[client].iCurrentCheckpoint, gS_ChatStrings.sVariable, gS_ChatStrings.sText); } } @@ -1552,8 +1458,8 @@ public Action Command_Save(int client, int args) { if(SaveCheckpoint(client, index, bOverflow)) { - gI_CheckpointsCache[client][iCurrentCheckpoint] = (bOverflow)? iMaxCPs:++gI_CheckpointsCache[client][iCheckpoints]; - Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + gA_CheckpointsCache[client].iCurrentCheckpoint = (bOverflow)? iMaxCPs:++gA_CheckpointsCache[client].iCheckpoints; + Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gA_CheckpointsCache[client].iCurrentCheckpoint, gS_ChatStrings.sVariable, gS_ChatStrings.sText); } } @@ -1569,14 +1475,14 @@ public Action Command_Tele(int client, int args) return Plugin_Handled; } - if(!gB_Checkpoints) + if(!gCV_Checkpoints.BoolValue) { - Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } - int index = gI_CheckpointsCache[client][iCurrentCheckpoint]; + int index = gA_CheckpointsCache[client].iCurrentCheckpoint; if(args > 0) { @@ -1585,7 +1491,7 @@ public Action Command_Tele(int client, int args) int parsed = StringToInt(arg); - if(0 < parsed <= gI_MaxCP) + if(0 < parsed <= gCV_MaxCP.IntValue) { index = parsed; } @@ -1600,9 +1506,9 @@ public Action OpenCheckpointsMenu(int client, int item) { bool bSegmented = CanSegment(client); - if(!gB_Checkpoints && !bSegmented) + if(!gCV_Checkpoints.BoolValue && !bSegmented) { - Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } @@ -1620,12 +1526,12 @@ public Action OpenCheckpointsMenu(int client, int item) } char sDisplay[64]; - FormatEx(sDisplay, 64, "%T", "MiscCheckpointSave", client, (gI_CheckpointsCache[client][iCheckpoints] + 1)); - menu.AddItem("save", sDisplay, (gI_CheckpointsCache[client][iCheckpoints] < gI_MaxCP)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); + FormatEx(sDisplay, 64, "%T", "MiscCheckpointSave", client, (gA_CheckpointsCache[client].iCheckpoints + 1)); + menu.AddItem("save", sDisplay, (gA_CheckpointsCache[client].iCheckpoints < gCV_MaxCP.IntValue)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); - if(gI_CheckpointsCache[client][iCheckpoints] > 0) + if(gA_CheckpointsCache[client].iCheckpoints > 0) { - FormatEx(sDisplay, 64, "%T", "MiscCheckpointTeleport", client, gI_CheckpointsCache[client][iCurrentCheckpoint]); + FormatEx(sDisplay, 64, "%T", "MiscCheckpointTeleport", client, gA_CheckpointsCache[client].iCurrentCheckpoint); menu.AddItem("tele", sDisplay, ITEMDRAW_DEFAULT); } @@ -1668,14 +1574,14 @@ public int MenuHandler_Checkpoints(Menu menu, MenuAction action, int param1, int if(action == MenuAction_Select) { int iMaxCPs = GetMaxCPs(param1); - int iCurrent = gI_CheckpointsCache[param1][iCurrentCheckpoint]; + int iCurrent = gA_CheckpointsCache[param1].iCurrentCheckpoint; switch(param2) { case 0: { bool bSegmenting = CanSegment(param1); - bool bOverflow = gI_CheckpointsCache[param1][iCheckpoints] >= iMaxCPs; + bool bOverflow = gA_CheckpointsCache[param1].iCheckpoints >= iMaxCPs; if(!bSegmenting) { @@ -1685,14 +1591,14 @@ public int MenuHandler_Checkpoints(Menu menu, MenuAction action, int param1, int return 0; } - SaveCheckpoint(param1, ++gI_CheckpointsCache[param1][iCheckpoints]); - gI_CheckpointsCache[param1][iCurrentCheckpoint] = gI_CheckpointsCache[param1][iCheckpoints]; + SaveCheckpoint(param1, ++gA_CheckpointsCache[param1].iCheckpoints); + gA_CheckpointsCache[param1].iCurrentCheckpoint = gA_CheckpointsCache[param1].iCheckpoints; } else { - SaveCheckpoint(param1, gI_CheckpointsCache[param1][iCheckpoints] + 1, bOverflow); - gI_CheckpointsCache[param1][iCurrentCheckpoint] = (bOverflow)? iMaxCPs:++gI_CheckpointsCache[param1][iCheckpoints]; + SaveCheckpoint(param1, gA_CheckpointsCache[param1].iCheckpoints + 1, bOverflow); + gA_CheckpointsCache[param1].iCurrentCheckpoint = (bOverflow)? iMaxCPs:++gA_CheckpointsCache[param1].iCheckpoints; } } @@ -1705,17 +1611,17 @@ public int MenuHandler_Checkpoints(Menu menu, MenuAction action, int param1, int { if(iCurrent > 1) { - gI_CheckpointsCache[param1][iCurrentCheckpoint]--; + gA_CheckpointsCache[param1].iCurrentCheckpoint--; } } case 3: { - CheckpointsCache cpcache[PCPCACHE_SIZE]; + cp_cache_t cpcache; if(iCurrent++ < iMaxCPs && GetCheckpoint(param1, iCurrent, cpcache)) { - gI_CheckpointsCache[param1][iCurrentCheckpoint]++; + gA_CheckpointsCache[param1].iCurrentCheckpoint++; } } @@ -1781,7 +1687,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) else if(!IsPlayerAlive(client)) { - Shavit_PrintToChat(client, "%T", "CommandAliveSpectate", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandAliveSpectate", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return false; } @@ -1790,25 +1696,28 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) int iSerial = GetClientSerial(client); FormatEx(sKey, 32, "%d_%d", iSerial, index); - CheckpointsCache cpcacheprev[PCPCACHE_SIZE]; + cp_cache_t cpcacheprev; - if(gSM_Checkpoints.GetArray(sKey, cpcacheprev[0], view_as(PCPCACHE_SIZE))) + if(gSM_Checkpoints.GetArray(sKey, cpcacheprev, sizeof(cp_cache_t))) { - delete cpcacheprev[aCPFrames]; + delete cpcacheprev.aFrames; gSM_Checkpoints.Remove(sKey); } - CheckpointsCache cpcache[PCPCACHE_SIZE]; + cp_cache_t cpcache; float temp[3]; GetClientAbsOrigin(target, temp); - CopyArray(temp, cpcache[fCPPosition], 3); + CopyArray(temp, cpcache.fPosition, 3); GetClientEyeAngles(target, temp); - CopyArray(temp, cpcache[fCPAngles], 3); + CopyArray(temp, cpcache.fAngles, 3); - GetEntPropVector(target, Prop_Data, "m_vecAbsVelocity", temp); - CopyArray(temp, cpcache[fCPVelocity], 3); + GetEntPropVector(target, Prop_Data, "m_vecVelocity", temp); + CopyArray(temp, cpcache.fVelocity, 3); + + GetEntPropVector(target, Prop_Data, "m_vecBaseVelocity", temp); + CopyArray(temp, cpcache.fBaseVelocity, 3); char sTargetname[64]; GetEntPropString(target, Prop_Data, "m_iName", sTargetname, 64); @@ -1830,13 +1739,9 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) iClassname = gA_Classnames.PushString(sClassname); } - cpcache[iCPTargetname] = iTargetname; - cpcache[iCPClassname] = iClassname; - cpcache[mtCPMoveType] = GetEntityMoveType(target); - cpcache[fCPGravity] = GetEntityGravity(target); - cpcache[fCPSpeed] = GetEntPropFloat(target, Prop_Send, "m_flLaggedMovementValue"); - cpcache[fCPStamina] = (gEV_Type != Engine_TF2)? GetEntPropFloat(target, Prop_Send, "m_flStamina"):0.0; - cpcache[iCPGroundEntity] = GetEntPropEnt(target, Prop_Data, "m_hGroundEntity"); + cpcache.iMoveType = GetEntityMoveType(target); + cpcache.fGravity = GetEntityGravity(target); + cpcache.fSpeed = GetEntPropFloat(target, Prop_Send, "m_flLaggedMovementValue"); int iFlags = GetEntityFlags(target); @@ -1844,28 +1749,43 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) { iFlags |= FL_CLIENT; iFlags |= FL_AIMTARGET; + iFlags &= ~FL_ATCONTROLS; + iFlags &= ~FL_FAKECLIENT; + + cpcache.fStamina = 0.0; + cpcache.iGroundEntity = -1; + cpcache.iTargetname = -1; + cpcache.iClassname = -1; } - cpcache[iCPFlags] = iFlags; + else + { + cpcache.fStamina = (gEV_Type != Engine_TF2)? GetEntPropFloat(target, Prop_Send, "m_flStamina"):0.0; + cpcache.iGroundEntity = GetEntPropEnt(target, Prop_Data, "m_hGroundEntity"); + cpcache.iTargetname = iTargetname; + cpcache.iClassname = iClassname; + } + + cpcache.iFlags = iFlags; if(gEV_Type != Engine_TF2) { - cpcache[bCPDucked] = view_as(GetEntProp(target, Prop_Send, "m_bDucked")); - cpcache[bCPDucking] = view_as(GetEntProp(target, Prop_Send, "m_bDucking")); + cpcache.bDucked = view_as(GetEntProp(target, Prop_Send, "m_bDucked")); + cpcache.bDucking = view_as(GetEntProp(target, Prop_Send, "m_bDucking")); } if(gEV_Type == Engine_CSS) { - cpcache[fCPDucktime] = GetEntPropFloat(target, Prop_Send, "m_flDucktime"); + cpcache.fDucktime = GetEntPropFloat(target, Prop_Send, "m_flDucktime"); } else if(gEV_Type == Engine_CSGO) { - cpcache[fCPDucktime] = GetEntPropFloat(target, Prop_Send, "m_flDuckAmount"); - cpcache[fCPDuckSpeed] = GetEntPropFloat(target, Prop_Send, "m_flDuckSpeed"); + cpcache.fDucktime = GetEntPropFloat(target, Prop_Send, "m_flDuckAmount"); + cpcache.fDuckSpeed = GetEntPropFloat(target, Prop_Send, "m_flDuckSpeed"); } - any snapshot[TIMERSNAPSHOT_SIZE]; + timer_snapshot_t snapshot; if(IsFakeClient(target)) { @@ -1875,22 +1795,22 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) if(style < 0 || track < 0) { - Shavit_PrintToChat(client, "%T", "CommandAliveSpectate", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandAliveSpectate", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return false; } - snapshot[bTimerEnabled] = true; - snapshot[fCurrentTime] = Shavit_GetReplayTime(style, track); - snapshot[bClientPaused] = false; - snapshot[bsStyle] = style; - snapshot[iJumps] = 0; - snapshot[iStrafes] = 0; - snapshot[iTotalMeasures] = 0; - snapshot[iGoodGains] = 0; - snapshot[fServerTime] = GetEngineTime(); - snapshot[iSHSWCombination] = -1; - snapshot[iTimerTrack] = track; + snapshot.bTimerEnabled = true; + snapshot.fCurrentTime = Shavit_GetReplayTime(style, track); + snapshot.bClientPaused = false; + snapshot.bsStyle = style; + snapshot.iJumps = 0; + snapshot.iStrafes = 0; + snapshot.iTotalMeasures = 0; + snapshot.iGoodGains = 0; + snapshot.fServerTime = GetEngineTime(); + snapshot.iSHSWCombination = -1; + snapshot.iTimerTrack = track; } else @@ -1898,26 +1818,26 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) Shavit_SaveSnapshot(target, snapshot); } - CopyArray(snapshot, cpcache[aCPSnapshot], TIMERSNAPSHOT_SIZE); + CopyArray(snapshot, cpcache.aSnapshot, sizeof(timer_snapshot_t)); if(CanSegment(target)) { if(gB_Replay) { - cpcache[aCPFrames] = Shavit_GetReplayData(target); + cpcache.aFrames = Shavit_GetReplayData(target); } - cpcache[bCPSegmented] = true; + cpcache.bSegmented = true; } else { - cpcache[aCPFrames] = null; - cpcache[bCPSegmented] = false; + cpcache.aFrames = null; + cpcache.bSegmented = false; } - cpcache[iCPSerial] = GetClientSerial(target); - cpcache[bCPPractice] = Shavit_IsPracticeMode(target); + cpcache.iSerial = GetClientSerial(target); + cpcache.bPractice = Shavit_IsPracticeMode(target); if(overflow) { @@ -1925,17 +1845,17 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) for(int i = 1; i <= iMaxCPs; i++) { - CheckpointsCache cpcacheold[PCPCACHE_SIZE]; + cp_cache_t cpcacheold; FormatEx(sKey, 32, "%d_%d", iSerial, i); - if(!gSM_Checkpoints.GetArray(sKey, cpcacheold[0], view_as(PCPCACHE_SIZE))) + if(!gSM_Checkpoints.GetArray(sKey, cpcacheold, sizeof(cp_cache_t))) { continue; // ??? } if(i == 1) { - delete cpcacheold[aCPFrames]; + delete cpcacheold.aFrames; gSM_Checkpoints.Remove(sKey); continue; @@ -1943,7 +1863,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) gSM_Checkpoints.Remove(sKey); FormatEx(sKey, 32, "%d_%d", iSerial, (i - 1)); // set cp index to one less - gSM_Checkpoints.SetArray(sKey, cpcacheold[0], view_as(PCPCACHE_SIZE)); + gSM_Checkpoints.SetArray(sKey, cpcacheold, sizeof(cp_cache_t)); } SetCheckpoint(client, iMaxCPs, cpcache); @@ -1959,22 +1879,22 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) void TeleportToCheckpoint(int client, int index, bool suppressMessage) { - if(index < 0 || index > gI_MaxCP || (!gB_Checkpoints && !CanSegment(client))) + if(index < 0 || index > gCV_MaxCP.IntValue || (!gCV_Checkpoints.BoolValue && !CanSegment(client))) { return; } - CheckpointsCache cpcache[PCPCACHE_SIZE]; + cp_cache_t cpcache; if(!GetCheckpoint(client, index, cpcache)) { - Shavit_PrintToChat(client, "%T", "MiscCheckpointsEmpty", client, index, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MiscCheckpointsEmpty", client, index, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return; } float pos[3]; - CopyArray(cpcache[fCPPosition], pos, 3); + CopyArray(cpcache.fPosition, pos, 3); if(IsNullVector(pos)) { @@ -1983,7 +1903,7 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) if(!IsPlayerAlive(client)) { - Shavit_PrintToChat(client, "%T", "CommandAlive", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandAlive", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return; } @@ -1993,18 +1913,22 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) Shavit_StopTimer(client); } - any snapshot[TIMERSNAPSHOT_SIZE]; - CopyArray(cpcache[aCPSnapshot], snapshot, TIMERSNAPSHOT_SIZE); + timer_snapshot_t snapshot; + CopyArray(cpcache.aSnapshot, snapshot, sizeof(timer_snapshot_t)); Shavit_LoadSnapshot(client, snapshot); float ang[3]; - CopyArray(cpcache[fCPAngles], ang, 3); + CopyArray(cpcache.fAngles, ang, 3); float vel[3]; - if((gI_CheckpointsSettings[client] & CP_VELOCITY) > 0 || cpcache[bCPSegmented]) + if((gI_CheckpointsSettings[client] & CP_VELOCITY) > 0 || cpcache.bSegmented) { - CopyArray(cpcache[fCPVelocity], vel, 3); + float basevel[3]; + CopyArray(cpcache.fVelocity, vel, 3); + CopyArray(cpcache.fBaseVelocity, basevel, 3); + + AddVectors(vel, basevel, vel); } else @@ -2013,28 +1937,28 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) } TeleportEntity(client, pos, - ((gI_CheckpointsSettings[client] & CP_ANGLES) > 0 || cpcache[bCPSegmented])? ang:NULL_VECTOR, + ((gI_CheckpointsSettings[client] & CP_ANGLES) > 0 || cpcache.bSegmented)? ang:NULL_VECTOR, vel); - if(cpcache[bCPPractice] || !cpcache[bCPSegmented] || GetClientSerial(client) != cpcache[iCPSerial]) + if(cpcache.bPractice || !cpcache.bSegmented || GetClientSerial(client) != cpcache.iSerial) { Shavit_SetPracticeMode(client, true, true); } - MoveType mt = cpcache[mtCPMoveType]; + MoveType mt = cpcache.iMoveType; if(mt == MOVETYPE_LADDER || mt == MOVETYPE_WALK) { SetEntityMoveType(client, mt); } - SetEntityGravity(client, cpcache[fCPGravity]); - SetEntityFlags(client, cpcache[iCPFlags]); + SetEntityGravity(client, cpcache.fGravity); + SetEntityFlags(client, cpcache.iFlags); - SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", cpcache[fCPSpeed]); - SetEntPropEnt(client, Prop_Data, "m_hGroundEntity", cpcache[iCPGroundEntity]); + SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", cpcache.fSpeed); + SetEntPropEnt(client, Prop_Data, "m_hGroundEntity", cpcache.iGroundEntity); - int iTargetname = gA_Targetnames.FindValue(cpcache[iCPTargetname]); + int iTargetname = gA_Targetnames.FindValue(cpcache.iTargetname); if(iTargetname != -1) { @@ -2044,7 +1968,7 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) SetEntPropString(client, Prop_Data, "m_iName", sTargetname); } - int iClassname = gA_Classnames.FindValue(cpcache[iCPClassname]); + int iClassname = gA_Classnames.FindValue(cpcache.iClassname); if(iClassname != -1) { @@ -2056,38 +1980,38 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) if(gEV_Type != Engine_TF2) { - SetEntPropFloat(client, Prop_Send, "m_flStamina", cpcache[fCPStamina]); - SetEntProp(client, Prop_Send, "m_bDucked", cpcache[bCPDucked]); - SetEntProp(client, Prop_Send, "m_bDucking", cpcache[bCPDucking]); + SetEntPropFloat(client, Prop_Send, "m_flStamina", cpcache.fStamina); + SetEntProp(client, Prop_Send, "m_bDucked", cpcache.bDucked); + SetEntProp(client, Prop_Send, "m_bDucking", cpcache.bDucking); } if(gEV_Type == Engine_CSS) { - SetEntPropFloat(client, Prop_Send, "m_flDucktime", cpcache[fCPDucktime]); + SetEntPropFloat(client, Prop_Send, "m_flDucktime", cpcache.fDucktime); } else if(gEV_Type == Engine_CSGO) { - SetEntPropFloat(client, Prop_Send, "m_flDuckAmount", cpcache[fCPDucktime]); - SetEntPropFloat(client, Prop_Send, "m_flDuckSpeed", cpcache[fCPDuckSpeed]); + SetEntPropFloat(client, Prop_Send, "m_flDuckAmount", cpcache.fDucktime); + SetEntPropFloat(client, Prop_Send, "m_flDuckSpeed", cpcache.fDuckSpeed); } - if(cpcache[bCPSegmented] && gB_Replay) + if(cpcache.bSegmented && gB_Replay) { - if(cpcache[aCPFrames] == null) + if(cpcache.aFrames == null) { LogError("SetReplayData for %L failed, recorded frames are null.", client); } else { - Shavit_SetReplayData(client, cpcache[aCPFrames]); + Shavit_SetReplayData(client, cpcache.aFrames); } } if(!suppressMessage) { - Shavit_PrintToChat(client, "%T", "MiscCheckpointsTeleported", client, index, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MiscCheckpointsTeleported", client, index, gS_ChatStrings.sVariable, gS_ChatStrings.sText); } } @@ -2098,23 +2022,23 @@ public Action Command_Noclip(int client, int args) return Plugin_Handled; } - if(gI_NoclipMe == 0) + if(gCV_NoclipMe.IntValue == 0) { - Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } - else if(gI_NoclipMe == 2 && !CheckCommandAccess(client, "admin_noclipme", ADMFLAG_CHEATS)) + else if(gCV_NoclipMe.IntValue == 2 && !CheckCommandAccess(client, "admin_noclipme", ADMFLAG_CHEATS)) { - Shavit_PrintToChat(client, "%T", "LackingAccess", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "LackingAccess", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } if(!IsPlayerAlive(client)) { - Shavit_PrintToChat(client, "%T", "CommandAlive", client, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CommandAlive", client, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return Plugin_Handled; } @@ -2144,7 +2068,7 @@ public Action CommandListener_Noclip(int client, const char[] command, int args) return Plugin_Handled; } - if((gI_NoclipMe == 1 || (gI_NoclipMe == 2 && CheckCommandAccess(client, "noclipme", ADMFLAG_CHEATS))) && command[0] == '+') + if((gCV_NoclipMe.IntValue == 1 || (gCV_NoclipMe.IntValue == 2 && CheckCommandAccess(client, "noclipme", ADMFLAG_CHEATS))) && command[0] == '+') { if(Shavit_GetTimerStatus(client) != Timer_Stopped) { @@ -2197,7 +2121,7 @@ public Action Command_Specs(int client, int args) if(!IsPlayerAlive(iNewTarget)) { - Shavit_PrintToChat(client, "%T", "SpectateDead", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "SpectateDead", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } @@ -2216,8 +2140,8 @@ public Action Command_Specs(int client, int args) continue; } - if((gI_SpectatorList == 1 && !bIsAdmin && CheckCommandAccess(i, "admin_speclisthide", ADMFLAG_KICK)) || - (gI_SpectatorList == 2 && !CanUserTarget(client, i))) + if((gCV_SpectatorList.IntValue == 1 && !bIsAdmin && CheckCommandAccess(i, "admin_speclisthide", ADMFLAG_KICK)) || + (gCV_SpectatorList.IntValue == 2 && !CanUserTarget(client, i))) { continue; } @@ -2228,24 +2152,24 @@ public Action Command_Specs(int client, int args) if(iCount == 1) { - FormatEx(sSpecs, 192, "%s%N", gS_ChatStrings[sMessageVariable2], i); + FormatEx(sSpecs, 192, "%s%N", gS_ChatStrings.sVariable2, i); } else { - Format(sSpecs, 192, "%s%s, %s%N", sSpecs, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], i); + Format(sSpecs, 192, "%s%s, %s%N", sSpecs, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, i); } } } if(iCount > 0) { - Shavit_PrintToChat(client, "%T", "SpectatorCount", client, gS_ChatStrings[sMessageVariable2], iObserverTarget, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], iCount, gS_ChatStrings[sMessageText], sSpecs); + Shavit_PrintToChat(client, "%T", "SpectatorCount", client, gS_ChatStrings.sVariable2, iObserverTarget, gS_ChatStrings.sText, gS_ChatStrings.sVariable, iCount, gS_ChatStrings.sText, sSpecs); } else { - Shavit_PrintToChat(client, "%T", "SpectatorCountZero", client, gS_ChatStrings[sMessageVariable2], iObserverTarget, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "SpectatorCountZero", client, gS_ChatStrings.sVariable2, iObserverTarget, gS_ChatStrings.sText); } return Plugin_Handled; @@ -2253,12 +2177,12 @@ public Action Command_Specs(int client, int args) public Action Shavit_OnStart(int client) { - if(!gA_StyleSettings[gI_Style[client]][bPrespeed] && GetEntityMoveType(client) == MOVETYPE_NOCLIP) + if(!gA_StyleSettings[gI_Style[client]].bPrespeed && GetEntityMoveType(client) == MOVETYPE_NOCLIP) { return Plugin_Stop; } - if(gB_ResetTargetname || Shavit_IsPracticeMode(client)) // practice mode can be abused to break map triggers + if(gCV_ResetTargetname.BoolValue || Shavit_IsPracticeMode(client)) // practice mode can be abused to break map triggers { DispatchKeyValue(client, "targetname", ""); SetEntPropString(client, Prop_Data, "m_iClassname", "player"); @@ -2284,7 +2208,7 @@ void GetTrackName(int client, int track, char[] output, int size) public void Shavit_OnWorldRecord(int client, int style, float time, int jumps, int strafes, float sync, int track) { char sUpperCase[64]; - strcopy(sUpperCase, 64, gS_StyleStrings[style][sStyleName]); + strcopy(sUpperCase, 64, gS_StyleStrings[style].sStyleName); for(int i = 0; i < strlen(sUpperCase); i++) { @@ -2308,12 +2232,12 @@ public void Shavit_OnWorldRecord(int client, int style, float time, int jumps, i { if(track == Track_Main) { - Shavit_PrintToChat(i, "%T", "WRNotice", i, gS_ChatStrings[sMessageWarning], sUpperCase); + Shavit_PrintToChat(i, "%T", "WRNotice", i, gS_ChatStrings.sWarning, sUpperCase); } else { - Shavit_PrintToChat(i, "%s[%s]%s %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "WRNotice", i, gS_ChatStrings[sMessageWarning], sUpperCase); + Shavit_PrintToChat(i, "%s[%s]%s %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "WRNotice", i, gS_ChatStrings.sWarning, sUpperCase); } } } @@ -2321,7 +2245,7 @@ public void Shavit_OnWorldRecord(int client, int style, float time, int jumps, i public void Shavit_OnRestart(int client, int track) { - if(!gB_RespawnOnRestart) + if(!gCV_RespawnOnRestart.BoolValue) { return; } @@ -2356,7 +2280,7 @@ public void Shavit_OnRestart(int client, int track) CS_RespawnPlayer(client); } - if(gB_RespawnOnRestart) + if(gCV_RespawnOnRestart.BoolValue) { RestartTimer(client, track); } @@ -2379,7 +2303,7 @@ public Action Respawn(Handle Timer, any data) CS_RespawnPlayer(client); } - if(gB_RespawnOnRestart) + if(gCV_RespawnOnRestart.BoolValue) { RestartTimer(client, Track_Main); } @@ -2404,19 +2328,19 @@ public void Player_Spawn(Event event, const char[] name, bool dontBroadcast) { int serial = GetClientSerial(client); - if(gB_HideRadar) + if(gCV_HideRadar.BoolValue) { RequestFrame(RemoveRadar, serial); } - if(gB_StartOnSpawn) + if(gCV_StartOnSpawn.BoolValue) { RestartTimer(client, Track_Main); } if(gB_SaveStates[client]) { - if(gB_RestoreStates) + if(gCV_RestoreStates.BoolValue) { RequestFrame(RestoreState, serial); } @@ -2427,7 +2351,7 @@ public void Player_Spawn(Event event, const char[] name, bool dontBroadcast) } } - if(gB_Scoreboard) + if(gCV_Scoreboard.BoolValue) { UpdateScoreboard(client); } @@ -2435,15 +2359,15 @@ public void Player_Spawn(Event event, const char[] name, bool dontBroadcast) UpdateClanTag(client); } - if(gB_NoBlock) + if(gCV_NoBlock.BoolValue) { SetEntProp(client, Prop_Data, "m_CollisionGroup", 2); } - if(gI_PlayerOpacity != -1) + if(gCV_PlayerOpacity.IntValue != -1) { SetEntityRenderMode(client, RENDER_TRANSCOLOR); - SetEntityRenderColor(client, 255, 255, 255, gI_PlayerOpacity); + SetEntityRenderColor(client, 255, 255, 255, gCV_PlayerOpacity.IntValue); } } @@ -2477,8 +2401,8 @@ void RestoreState(any data) return; } - if(gA_SaveStates[client][bsStyle] != Shavit_GetBhopStyle(client) || - gA_SaveStates[client][iTimerTrack] != Shavit_GetClientTrack(client)) + if(gA_SaveStates[client].bsStyle != Shavit_GetBhopStyle(client) || + gA_SaveStates[client].iTimerTrack != Shavit_GetClientTrack(client)) { gB_SaveStates[client] = false; @@ -2490,7 +2414,7 @@ void RestoreState(any data) public Action Player_Notifications(Event event, const char[] name, bool dontBroadcast) { - if(gB_HideTeamChanges) + if(gCV_HideTeamChanges.BoolValue) { event.BroadcastDisabled = true; } @@ -2504,13 +2428,13 @@ public Action Player_Notifications(Event event, const char[] name, bool dontBroa SaveState(client); } - if(gF_AutoRespawn > 0.0 && StrEqual(name, "player_death")) + if(gCV_AutoRespawn.FloatValue > 0.0 && StrEqual(name, "player_death")) { - CreateTimer(gF_AutoRespawn, Respawn, GetClientSerial(client), TIMER_FLAG_NO_MAPCHANGE); + CreateTimer(gCV_AutoRespawn.FloatValue, Respawn, GetClientSerial(client), TIMER_FLAG_NO_MAPCHANGE); } } - switch(gI_RemoveRagdolls) + switch(gCV_RemoveRagdolls.IntValue) { case 0: { @@ -2541,7 +2465,7 @@ public Action Player_Notifications(Event event, const char[] name, bool dontBroa public void Weapon_Fire(Event event, const char[] name, bool dB) { - if(gI_WeaponCommands < 2) + if(gCV_WeaponCommands.IntValue < 2) { return; } @@ -2639,7 +2563,7 @@ public Action Shotgun_Shot(const char[] te_name, const int[] Players, int numCli public Action EffectDispatch(const char[] te_name, const Players[], int numClients, float delay) { - if(!gB_NoBlood) + if(!gCV_NoBlood.BoolValue) { return Plugin_Continue; } @@ -2671,7 +2595,7 @@ public Action EffectDispatch(const char[] te_name, const Players[], int numClien public Action WorldDecal(const char[] te_name, const Players[], int numClients, float delay) { - if(!gB_NoBlood) + if(!gCV_NoBlood.BoolValue) { return Plugin_Continue; } @@ -2730,7 +2654,7 @@ int GetDecalName(int index, char[] sDecalName, int maxlen) public void Shavit_OnFinish(int client) { - if(!gB_Scoreboard) + if(!gCV_Scoreboard.BoolValue) { return; } @@ -2757,7 +2681,7 @@ public void Shavit_OnResume(int client, int track) public Action Command_Drop(int client, const char[] command, int argc) { - if(!gB_DropAll || !IsValidClient(client) || gEV_Type == Engine_TF2) + if(!gCV_DropAll.BoolValue || !IsValidClient(client) || gEV_Type == Engine_TF2) { return Plugin_Continue; } @@ -2778,6 +2702,7 @@ void LoadState(int client) DispatchKeyValue(client, "targetname", gS_SaveStateTargetname[client]); Shavit_LoadSnapshot(client, gA_SaveStates[client]); + Shavit_SetPracticeMode(client, gB_SaveStatesSegmented[client], false); if(gB_Replay && gA_SaveFrames[client] != null) { @@ -2801,6 +2726,7 @@ void SaveState(int client) GetEntPropString(client, Prop_Data, "m_iName", gS_SaveStateTargetname[client], 32); Shavit_SaveSnapshot(client, gA_SaveStates[client]); + gB_SaveStatesSegmented[client] = Shavit_IsPracticeMode(client); if(gB_Replay) { @@ -2811,20 +2737,20 @@ void SaveState(int client) gB_SaveStates[client] = true; } -bool GetCheckpoint(int client, int index, CheckpointsCache cpcache[PCPCACHE_SIZE]) +bool GetCheckpoint(int client, int index, cp_cache_t cpcache) { char sKey[32]; FormatEx(sKey, 32, "%d_%d", GetClientSerial(client), index); - return gSM_Checkpoints.GetArray(sKey, cpcache[0], view_as(PCPCACHE_SIZE)); + return gSM_Checkpoints.GetArray(sKey, cpcache, sizeof(cp_cache_t)); } -bool SetCheckpoint(int client, int index, CheckpointsCache cpcache[PCPCACHE_SIZE]) +bool SetCheckpoint(int client, int index, cp_cache_t cpcache) { char sKey[32]; FormatEx(sKey, 32, "%d_%d", GetClientSerial(client), index); - return gSM_Checkpoints.SetArray(sKey, cpcache[0], view_as(PCPCACHE_SIZE)); + return gSM_Checkpoints.SetArray(sKey, cpcache, sizeof(cp_cache_t)); } void CopyArray(const any[] from, any[] to, int size) @@ -2837,10 +2763,10 @@ void CopyArray(const any[] from, any[] to, int size) bool CanSegment(int client) { - return StrContains(gS_StyleStrings[gI_Style[client]][sSpecialString], "segments") != -1; + return StrContains(gS_StyleStrings[gI_Style[client]].sSpecialString, "segments") != -1; } int GetMaxCPs(int client) { - return CanSegment(client)? gI_MaxCP_Segmented:gI_MaxCP; + return CanSegment(client)? gCV_MaxCP_Segmented.IntValue:gCV_MaxCP.IntValue; } diff --git a/addons/sourcemod/scripting/shavit-rankings.sp b/addons/sourcemod/scripting/shavit-rankings.sp index 5bcb82a4..20fa4a1c 100644 --- a/addons/sourcemod/scripting/shavit-rankings.sp +++ b/addons/sourcemod/scripting/shavit-rankings.sp @@ -64,7 +64,7 @@ ArrayList gA_ValidMaps = null; StringMap gA_MapTiers = null; ConVar gCV_PointsPerTier = null; -float gF_PointsPerTier = 50.0; +ConVar gCV_WeightingMultiplier = null; int gI_Rank[MAXPLAYERS+1]; float gF_Points[MAXPLAYERS+1]; @@ -75,13 +75,12 @@ Menu gH_Top100Menu = null; Handle gH_Forwards_OnTierAssigned = null; // Timer settings. -char gS_ChatStrings[CHATSETTINGS_SIZE][128]; +chatstrings_t gS_ChatStrings; +int gI_Styles = 0; +stylesettings_t gA_StyleSettings[STYLE_LIMIT]; char gS_StyleNames[STYLE_LIMIT][64]; char gS_TrackNames[TRACKS_SIZE][32]; -any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE]; -int gI_Styles = 0; - public Plugin myinfo = { name = "[shavit] Rankings", @@ -143,7 +142,7 @@ public void OnPluginStart() RegAdminCmd("sm_recalcall", Command_RecalcAll, ADMFLAG_ROOT, "Recalculate the points for every map on the server. Run this after you change the ranking multiplier for a style or after you install the plugin."); gCV_PointsPerTier = CreateConVar("shavit_rankings_pointspertier", "50.0", "Base points to use for per-tier scaling.\nRead the design idea to see how it works: https://github.com/shavitush/bhoptimer/issues/465", 0, true, 1.0); - gCV_PointsPerTier.AddChangeHook(OnConVarChanged); + gCV_WeightingMultiplier = CreateConVar("shavit_rankings_weighting", "0.975", "Weighing multiplier. 1.0 to disable weighting.\nFormula: p[1] * this^0 + p[2] * this^1 + p[3] * this^2 + ... + p[n] * this^(n-1)\nRestart server to apply.", 0, true, 0.01, true, 1.0); AutoExecConfig(); @@ -165,10 +164,12 @@ public void OnPluginStart() public void Shavit_OnChatConfigLoaded() { - for(int i = 0; i < CHATSETTINGS_SIZE; i++) - { - Shavit_GetChatStrings(i, gS_ChatStrings[i], 128); - } + Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); } public void Shavit_OnStyleConfigLoaded(int styles) @@ -319,11 +320,11 @@ public void SQL_CreateTable_Callback(Database db, DBResultSet results, const cha "LEAVE iter; " ... "END IF; " ... "SET total = total + (p * mult); " ... - "SET mult = mult * 0.975; " ... + "SET mult = mult * %f; " ... "END LOOP; " ... "CLOSE cur; " ... "RETURN total; " ... - "END;;", gS_MySQLPrefix); + "END;;", gS_MySQLPrefix, gCV_WeightingMultiplier.FloatValue); RunLongFastQuery(bSuccess, "CREATE GetRecordPoints", "CREATE FUNCTION GetRecordPoints(rstyle INT, rtrack INT, rtime FLOAT, rmap CHAR(128), pointspertier FLOAT, stylemultiplier FLOAT) " ... @@ -376,11 +377,6 @@ void RunLongFastQuery(bool &success, const char[] func, const char[] query, any } } -public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) -{ - gF_PointsPerTier = gCV_PointsPerTier.FloatValue; -} - public void OnClientConnected(int client) { gI_Rank[client] = 0; @@ -548,7 +544,7 @@ public Action Command_Tier(int client, int args) } } - Shavit_PrintToChat(client, "%T", "CurrentTier", client, gS_ChatStrings[sMessageVariable], sMap, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], tier, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CurrentTier", client, gS_ChatStrings.sVariable, sMap, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, tier, gS_ChatStrings.sText); return Plugin_Handled; } @@ -572,15 +568,15 @@ public Action Command_Rank(int client, int args) if(gF_Points[target] == 0.0) { - Shavit_PrintToChat(client, "%T", "Unranked", client, gS_ChatStrings[sMessageVariable2], target, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "Unranked", client, gS_ChatStrings.sVariable2, target, gS_ChatStrings.sText); return Plugin_Handled; } - Shavit_PrintToChat(client, "%T", "Rank", client, gS_ChatStrings[sMessageVariable2], target, gS_ChatStrings[sMessageText], - gS_ChatStrings[sMessageVariable], (gI_Rank[target] > gI_RankedPlayers)? gI_RankedPlayers:gI_Rank[target], gS_ChatStrings[sMessageText], + Shavit_PrintToChat(client, "%T", "Rank", client, gS_ChatStrings.sVariable2, target, gS_ChatStrings.sText, + gS_ChatStrings.sVariable, (gI_Rank[target] > gI_RankedPlayers)? gI_RankedPlayers:gI_Rank[target], gS_ChatStrings.sText, gI_RankedPlayers, - gS_ChatStrings[sMessageVariable], gF_Points[target], gS_ChatStrings[sMessageText]); + gS_ChatStrings.sVariable, gF_Points[target], gS_ChatStrings.sText); return Plugin_Handled; } @@ -631,7 +627,7 @@ public Action Command_SetTier(int client, int args) Call_PushCell(tier); Call_Finish(); - Shavit_PrintToChat(client, "%T", "SetTier", client, gS_ChatStrings[sMessageVariable2], tier, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "SetTier", client, gS_ChatStrings.sVariable2, tier, gS_ChatStrings.sText); char sQuery[256]; FormatEx(sQuery, 256, "REPLACE INTO %smaptiers (map, tier) VALUES ('%s', %d);", gS_MySQLPrefix, gS_Map, tier); @@ -673,14 +669,14 @@ public Action Command_RecalcAll(int client, int args) { char sQuery[192]; - if(gA_StyleSettings[i][bUnranked] || view_as(gA_StyleSettings[i][fRankingMultiplier]) == 0.0) + if(gA_StyleSettings[i].bUnranked || gA_StyleSettings[i].fRankingMultiplier == 0.0) { FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = 0 WHERE style = %d;", gS_MySQLPrefix, i); } else { - FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = GetRecordPoints(%d, track, time, map, %.1f, %.3f) WHERE style = %d;", gS_MySQLPrefix, i, gF_PointsPerTier, view_as(gA_StyleSettings[i][fRankingMultiplier]), i); + FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = GetRecordPoints(%d, track, time, map, %.1f, %.3f) WHERE style = %d;", gS_MySQLPrefix, i, gCV_PointsPerTier.FloatValue, gA_StyleSettings[i].fRankingMultiplier, i); } trans.AddQuery(sQuery); @@ -731,7 +727,7 @@ void RecalculateAll(const char[] map) { for(int j = 0; j < gI_Styles; j++) { - if(gA_StyleSettings[j][bUnranked]) + if(gA_StyleSettings[j].bUnranked) { continue; } @@ -753,7 +749,8 @@ void RecalculateMap(const char[] map, const int track, const int style) #endif char sQuery[192]; - FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = GetRecordPoints(%d, %d, time, '%s', %.1f, %.3f) WHERE style = %d AND track = %d AND map = '%s';", gS_MySQLPrefix, style, track, map, gF_PointsPerTier, gA_StyleSettings[style][fRankingMultiplier], style, track, map); + FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = GetRecordPoints(%d, %d, time, '%s', %.1f, %.3f) WHERE style = %d AND track = %d AND map = '%s';", + gS_MySQLPrefix, style, track, map, gCV_PointsPerTier.FloatValue, gA_StyleSettings[style].fRankingMultiplier, style, track, map); gH_SQL.Query(SQL_Recalculate_Callback, sQuery, 0, DBPrio_High); diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index 23668a68..e1a0a31f 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -40,26 +40,33 @@ #pragma newdecls required #pragma semicolon 1 -#pragma dynamic 131072 +#pragma dynamic 262144 -enum +enum struct centralbot_cache_t { - iCentralClient, - iCentralStyle, - iCentralReplayStatus, - iCentralTrack, - CENTRALBOTCACHE_SIZE + int iClient; + int iStyle; + ReplayStatus iReplayStatus; + int iTrack; }; -enum +enum struct replaystrings_t { - sReplayClanTag, - sReplayNameStyle, - sReplayCentralName, - sReplayCentralStyle, - sReplayCentralStyleTag, - sReplayUnloaded, - REPLAYSTRINGS_SIZE + char sClanTag[MAX_NAME_LENGTH]; + char sNameStyle[MAX_NAME_LENGTH]; + char sCentralName[MAX_NAME_LENGTH]; + char sCentralStyle[MAX_NAME_LENGTH]; + char sCentralStyleTag[MAX_NAME_LENGTH]; + char sUnloaded[MAX_NAME_LENGTH]; +}; + +enum struct framecache_t +{ + int iFrameCount; + float fTime; + bool bNewFormat; + int iReplayVersion; + char sReplayName[MAX_NAME_LENGTH]; }; enum @@ -79,8 +86,7 @@ int gI_ReplayBotClient[STYLE_LIMIT]; ArrayList gA_Frames[STYLE_LIMIT][TRACKS_SIZE]; float gF_StartTick[STYLE_LIMIT]; ReplayStatus gRS_ReplayStatus[STYLE_LIMIT]; -any gA_FrameCache[STYLE_LIMIT][TRACKS_SIZE][4]; // int frame_count, float time, bool new_format, int replay_version -char gS_ReplayNames[STYLE_LIMIT][TRACKS_SIZE][MAX_NAME_LENGTH]; +framecache_t gA_FrameCache[STYLE_LIMIT][TRACKS_SIZE]; bool gB_ForciblyStopped = false; bool gB_Button[MAXPLAYERS+1]; @@ -99,7 +105,7 @@ float gF_Tickrate = 0.0; char gS_Map[160]; int gI_ExpectedBots = 0; ConVar bot_quota = null; -any gA_CentralCache[CENTRALBOTCACHE_SIZE]; +centralbot_cache_t gA_CentralCache; // how do i call this bool gB_HideNameChange = false; @@ -117,26 +123,16 @@ ConVar gCV_BotShooting = null; ConVar gCV_BotPlusUse = null; ConVar gCV_BotWeapon = null; -// cached cvars -bool gB_Enabled = true; -float gF_ReplayDelay = 5.0; -float gF_TimeLimit = 7200.0; -int gI_DefaultTeam = 3; -bool gB_CentralBot = true; -int gI_BotShooting = 3; -bool gB_BotPlusUse = true; -char gS_BotWeapon[32] = ""; - // timer settings int gI_Styles = 0; -char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128]; -any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE]; +stylestrings_t gS_StyleStrings[STYLE_LIMIT]; +stylesettings_t gA_StyleSettings[STYLE_LIMIT]; // chat settings -char gS_ChatStrings[CHATSETTINGS_SIZE][128]; +chatstrings_t gS_ChatStrings; // replay settings -char gS_ReplayStrings[REPLAYSTRINGS_SIZE][MAX_NAME_LENGTH]; +replaystrings_t gS_ReplayStrings; // admin menu TopMenu gH_AdminMenu = null; @@ -228,14 +224,7 @@ public void OnPluginStart() gCV_BotPlusUse = CreateConVar("shavit_replay_botplususe", "1", "Allow bots to use +use?", 0, true, 0.0, true, 1.0); gCV_BotWeapon = CreateConVar("shavit_replay_botweapon", "", "Choose which weapon the bot will hold.\nLeave empty to use the default.\nSet to \"none\" to have none.\nExample: weapon_usp"); - gCV_Enabled.AddChangeHook(OnConVarChanged); - gCV_ReplayDelay.AddChangeHook(OnConVarChanged); - gCV_TimeLimit.AddChangeHook(OnConVarChanged); - gCV_DefaultTeam.AddChangeHook(OnConVarChanged); gCV_CentralBot.AddChangeHook(OnConVarChanged); - gCV_BotShooting.AddChangeHook(OnConVarChanged); - gCV_BotPlusUse.AddChangeHook(OnConVarChanged); - gCV_BotWeapon.AddChangeHook(OnConVarChanged); AutoExecConfig(); @@ -265,19 +254,7 @@ public void OnPluginStart() public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) { - gB_Enabled = gCV_Enabled.BoolValue; - gF_ReplayDelay = gCV_ReplayDelay.FloatValue; - gF_TimeLimit = gCV_TimeLimit.FloatValue; - gI_DefaultTeam = gCV_DefaultTeam.IntValue; - gB_CentralBot = gCV_CentralBot.BoolValue; - gI_BotShooting = gCV_BotShooting.IntValue; - gB_BotPlusUse = gCV_BotPlusUse.BoolValue; - gCV_BotWeapon.GetString(gS_BotWeapon, 32); - - if(convar == gCV_CentralBot) - { - OnMapStart(); - } + OnMapStart(); } public void OnAdminMenuCreated(Handle topmenu) @@ -346,9 +323,9 @@ public int Native_GetReplayBotCurrentFrame(Handle handler, int numParams) public int Native_GetReplayBotIndex(Handle handler, int numParams) { - if(gB_CentralBot) + if(gCV_CentralBot.BoolValue) { - return gA_CentralCache[iCentralClient]; + return gA_CentralCache.iClient; } return gI_ReplayBotClient[GetNativeCell(1)]; @@ -359,12 +336,12 @@ public int Native_IsReplayDataLoaded(Handle handler, int numParams) int style = GetNativeCell(1); int track = GetNativeCell(2); - if(gB_CentralBot) + if(gCV_CentralBot.BoolValue) { - return (gA_CentralCache[iCentralClient] != -1 && gA_CentralCache[iCentralClient] != Replay_Idle && view_as(gA_FrameCache[style][track][0]) > 0); + return view_as(gA_CentralCache.iClient != -1 && gA_CentralCache.iReplayStatus != Replay_Idle && gA_FrameCache[style][track].iFrameCount > 0); } - return view_as(ReplayEnabled(style) && gA_FrameCache[style][Track_Main][0] > 0); + return view_as(ReplayEnabled(style) && gA_FrameCache[style][Track_Main].iFrameCount > 0); } public int Native_ReloadReplay(Handle handler, int numParams) @@ -383,10 +360,10 @@ public int Native_ReloadReplay(Handle handler, int numParams) delete gA_Frames[style][track]; gA_Frames[style][track] = new ArrayList(CELLS_PER_FRAME); - gA_FrameCache[style][track][0] = 0; - gA_FrameCache[style][track][1] = 0.0; - gA_FrameCache[style][track][2] = false; - strcopy(gS_ReplayNames[style][track], MAX_NAME_LENGTH, "invalid"); + gA_FrameCache[style][track].iFrameCount = 0; + gA_FrameCache[style][track].fTime = 0.0; + gA_FrameCache[style][track].bNewFormat = false; + strcopy(gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH, "invalid"); bool loaded = false; @@ -400,9 +377,9 @@ public int Native_ReloadReplay(Handle handler, int numParams) loaded = DefaultLoadReplay(style, track); } - if(gB_CentralBot) + if(gCV_CentralBot.BoolValue) { - if(gA_CentralCache[iCentralStyle] == style && gA_CentralCache[iCentralTrack] == track) + if(gA_CentralCache.iStyle == style && gA_CentralCache.iTrack == track) { StopCentralReplay(0); } @@ -420,7 +397,7 @@ public int Native_ReloadReplay(Handle handler, int numParams) { gI_ReplayTick[style] = 0; gRS_ReplayStatus[style] = Replay_Start; - CreateTimer((gF_ReplayDelay / 2.0), Timer_StartReplay, style, TIMER_FLAG_NO_MAPCHANGE); + CreateTimer((gCV_ReplayDelay.FloatValue / 2.0), Timer_StartReplay, style, TIMER_FLAG_NO_MAPCHANGE); } } @@ -439,7 +416,7 @@ public int Native_ReloadReplays(Handle handler, int numParams) continue; } - for(int j = 0; j < ((gB_CentralBot)? TRACKS_SIZE:1); j++) + for(int j = 0; j < ((gCV_CentralBot.BoolValue)? TRACKS_SIZE:1); j++) { if(Shavit_ReloadReplay(i, j, restart)) { @@ -481,7 +458,7 @@ public int Native_GetReplayData(Handle handler, int numParams) public int Native_GetReplayFrameCount(Handle handler, int numParams) { - return view_as(gA_FrameCache[GetNativeCell(1)][GetNativeCell(2)][0]); + return gA_FrameCache[GetNativeCell(1)][GetNativeCell(2)].iFrameCount; } public int Native_GetReplayLength(Handle handler, int numParams) @@ -491,7 +468,7 @@ public int Native_GetReplayLength(Handle handler, int numParams) public int Native_GetReplayName(Handle handler, int numParams) { - return SetNativeString(3, gS_ReplayNames[GetNativeCell(1)][GetNativeCell(2)], GetNativeCell(4)); + return SetNativeString(3, gA_FrameCache[GetNativeCell(1)][GetNativeCell(2)].sReplayName, GetNativeCell(4)); } public int Native_GetReplayTime(Handle handler, int numParams) @@ -504,9 +481,9 @@ public int Native_GetReplayTime(Handle handler, int numParams) return view_as(0.0); } - if(gB_CentralBot) + if(gCV_CentralBot.BoolValue) { - if(gA_CentralCache[iCentralReplayStatus] == Replay_End) + if(gA_CentralCache.iReplayStatus == Replay_End) { return view_as(GetReplayLength(style, track)); } @@ -531,7 +508,7 @@ public int Native_HijackAngles(Handle handler, int numParams) public int Native_GetReplayBotStyle(Handle handler, int numParams) { - return (gB_CentralBot && gA_CentralCache[iCentralReplayStatus] == Replay_Idle)? -1:GetReplayStyle(GetNativeCell(1)); + return (gCV_CentralBot.BoolValue && gA_CentralCache.iReplayStatus == Replay_Idle)? -1:GetReplayStyle(GetNativeCell(1)); } public int Native_GetReplayBotTrack(Handle handler, int numParams) @@ -541,7 +518,7 @@ public int Native_GetReplayBotTrack(Handle handler, int numParams) public int Native_GetReplayBotType(Handle handler, int numParams) { - return view_as((gB_CentralBot)? Replay_Central:Replay_Legacy); + return view_as((gCV_CentralBot.BoolValue)? Replay_Central:Replay_Legacy); } public int Native_Replay_DeleteMap(Handle handler, int numParams) @@ -556,7 +533,7 @@ public int Native_Replay_DeleteMap(Handle handler, int numParams) continue; } - for(int j = 0; j < ((gB_CentralBot)? TRACKS_SIZE:1); j++) + for(int j = 0; j < ((gCV_CentralBot.BoolValue)? TRACKS_SIZE:1); j++) { char sTrack[4]; FormatEx(sTrack, 4, "_%d", j); @@ -632,7 +609,7 @@ void SQL_SetPrefix() public Action Cron(Handle Timer) { - if(!gB_Enabled) + if(!gCV_Enabled.BoolValue) { bot_quota.IntValue = 0; @@ -647,25 +624,25 @@ public Action Cron(Handle Timer) for(int i = 0; i < gI_Styles; i++) { - for(int j = 0; j < ((gB_CentralBot)? TRACKS_SIZE:1); j++) + for(int j = 0; j < ((gCV_CentralBot.BoolValue)? TRACKS_SIZE:1); j++) { - if(!gB_CentralBot && gI_ReplayBotClient[i] != 0) + if(!gCV_CentralBot.BoolValue && gI_ReplayBotClient[i] != 0) { UpdateReplayInfo(gI_ReplayBotClient[i], i, GetReplayLength(i, j), j); } } } - if(gB_CentralBot && gA_CentralCache[iCentralClient] != -1) + if(gCV_CentralBot.BoolValue && gA_CentralCache.iClient != -1) { - if(gA_CentralCache[iCentralStyle] != -1) + if(gA_CentralCache.iStyle != -1) { - UpdateReplayInfo(gA_CentralCache[iCentralClient], gA_CentralCache[iCentralStyle], -1.0, gA_CentralCache[iCentralTrack]); + UpdateReplayInfo(gA_CentralCache.iClient, gA_CentralCache.iStyle, -1.0, gA_CentralCache.iTrack); } else { - UpdateReplayInfo(gA_CentralCache[iCentralClient], 0, 0.0, 0); + UpdateReplayInfo(gA_CentralCache.iClient, 0, 0.0, 0); } } @@ -686,12 +663,12 @@ bool LoadStyling() return false; } - kv.GetString("clantag", gS_ReplayStrings[sReplayClanTag], MAX_NAME_LENGTH, ""); - kv.GetString("namestyle", gS_ReplayStrings[sReplayNameStyle], MAX_NAME_LENGTH, ""); - kv.GetString("centralname", gS_ReplayStrings[sReplayCentralName], MAX_NAME_LENGTH, ""); - kv.GetString("centralstyle", gS_ReplayStrings[sReplayCentralStyle], MAX_NAME_LENGTH, ""); - kv.GetString("centralstyletag", gS_ReplayStrings[sReplayCentralStyleTag], MAX_NAME_LENGTH, ""); - kv.GetString("unloaded", gS_ReplayStrings[sReplayUnloaded], MAX_NAME_LENGTH, ""); + kv.GetString("clantag", gS_ReplayStrings.sClanTag, MAX_NAME_LENGTH, ""); + kv.GetString("namestyle", gS_ReplayStrings.sNameStyle, MAX_NAME_LENGTH, ""); + kv.GetString("centralname", gS_ReplayStrings.sCentralName, MAX_NAME_LENGTH, ""); + kv.GetString("centralstyle", gS_ReplayStrings.sCentralStyle, MAX_NAME_LENGTH, ""); + kv.GetString("centralstyletag", gS_ReplayStrings.sCentralStyleTag, MAX_NAME_LENGTH, ""); + kv.GetString("unloaded", gS_ReplayStrings.sUnloaded, MAX_NAME_LENGTH, ""); char sFolder[PLATFORM_MAX_PATH]; kv.GetString("replayfolder", sFolder, PLATFORM_MAX_PATH, "{SM}/data/replaybot"); @@ -722,17 +699,17 @@ public void OnMapStart() Shavit_OnChatConfigLoaded(); } - gA_CentralCache[iCentralClient] = -1; - gA_CentralCache[iCentralStyle] = -1; - gA_CentralCache[iCentralReplayStatus] = Replay_Idle; - gA_CentralCache[iCentralTrack] = Track_Main; + gA_CentralCache.iClient = -1; + gA_CentralCache.iStyle = -1; + gA_CentralCache.iReplayStatus = Replay_Idle; + gA_CentralCache.iTrack = Track_Main; gB_ForciblyStopped = false; GetCurrentMap(gS_Map, 160); GetMapDisplayName(gS_Map, gS_Map, 160); - if(!gB_Enabled) + if(!gCV_Enabled.BoolValue) { return; } @@ -851,19 +828,19 @@ public void OnMapStart() bool loaded = false; - for(int j = 0; j < ((gB_CentralBot)? TRACKS_SIZE:1); j++) + for(int j = 0; j < ((gCV_CentralBot.BoolValue)? TRACKS_SIZE:1); j++) { delete gA_Frames[i][j]; gA_Frames[i][j] = new ArrayList(CELLS_PER_FRAME); - gA_FrameCache[i][j][0] = 0; - gA_FrameCache[i][j][1] = 0.0; - gA_FrameCache[i][j][2] = false; - strcopy(gS_ReplayNames[i][j], MAX_NAME_LENGTH, "invalid"); + gA_FrameCache[i][j].iFrameCount = 0; + gA_FrameCache[i][j].fTime = 0.0; + gA_FrameCache[i][j].bNewFormat = false; + strcopy(gA_FrameCache[i][j].sReplayName, MAX_NAME_LENGTH, "invalid"); loaded = DefaultLoadReplay(i, j); } - if(!gB_CentralBot) + if(!gCV_CentralBot.BoolValue) { ServerCommand((gEV_Type != Engine_TF2)? "bot_add":"tf_bot_add"); gI_ExpectedBots++; @@ -872,12 +849,12 @@ public void OnMapStart() { gI_ReplayTick[i] = 0; gRS_ReplayStatus[i] = Replay_Start; - CreateTimer((gF_ReplayDelay / 2.0), Timer_StartReplay, i, TIMER_FLAG_NO_MAPCHANGE); + CreateTimer((gCV_ReplayDelay.FloatValue / 2.0), Timer_StartReplay, i, TIMER_FLAG_NO_MAPCHANGE); } } } - if(gB_CentralBot) + if(gCV_CentralBot.BoolValue) { gI_ExpectedBots = 1; ServerCommand((gEV_Type != Engine_TF2)? "bot_add":"tf_bot_add"); @@ -896,9 +873,9 @@ public void Shavit_OnStyleConfigLoaded(int styles) for(int i = 0; i < styles; i++) { Shavit_GetStyleSettings(i, gA_StyleSettings[i]); - Shavit_GetStyleStrings(i, sClanTag, gS_StyleStrings[i][sClanTag], 128); - Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i][sStyleName], 128); - Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i][sShortName], 128); + Shavit_GetStyleStrings(i, sClanTag, gS_StyleStrings[i].sClanTag, sizeof(stylestrings_t::sClanTag)); + Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName)); + Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i].sShortName, sizeof(stylestrings_t::sShortName)); } gI_Styles = styles; @@ -906,10 +883,12 @@ public void Shavit_OnStyleConfigLoaded(int styles) public void Shavit_OnChatConfigLoaded() { - for(int i = 0; i < CHATSETTINGS_SIZE; i++) - { - Shavit_GetChatStrings(i, gS_ChatStrings[i], 128); - } + Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); } bool DefaultLoadReplay(int style, int track) @@ -942,11 +921,11 @@ bool LoadReplay(int style, int track, const char[] path) if(StrEqual(sExplodedHeader[1], REPLAY_FORMAT_FINAL)) // hopefully, the last of them { - gA_FrameCache[style][track][3] = StringToInt(sExplodedHeader[0]); + gA_FrameCache[style][track].iReplayVersion = StringToInt(sExplodedHeader[0]); int iTemp = 0; fFile.ReadInt32(iTemp); - gA_FrameCache[style][track][0] = iTemp; + gA_FrameCache[style][track].iFrameCount = iTemp; if(gA_Frames[style][track] == null) { @@ -956,7 +935,7 @@ bool LoadReplay(int style, int track, const char[] path) gA_Frames[style][track].Resize(iTemp); fFile.ReadInt32(iTemp); - gA_FrameCache[style][track][1] = iTemp; + gA_FrameCache[style][track].fTime = view_as(iTemp); char sAuthID[32]; fFile.ReadString(sAuthID, 32); @@ -976,14 +955,14 @@ bool LoadReplay(int style, int track, const char[] path) int cells = CELLS_PER_FRAME; // backwards compatibility - if(gA_FrameCache[style][track][3] == 0x01) + if(gA_FrameCache[style][track].iReplayVersion == 0x01) { cells = 6; } any[] aReplayData = new any[cells]; - for(int i = 0; i < gA_FrameCache[style][track][0]; i++) + for(int i = 0; i < gA_FrameCache[style][track].iFrameCount; i++) { if(fFile.Read(aReplayData, cells, 4) >= 0) { @@ -994,7 +973,7 @@ bool LoadReplay(int style, int track, const char[] path) gA_Frames[style][track].Set(i, view_as(aReplayData[4]), 4); gA_Frames[style][track].Set(i, view_as(aReplayData[5]), 5); - if(gA_FrameCache[style][track][3] >= 0x02) + if(gA_FrameCache[style][track].iReplayVersion >= 0x02) { gA_Frames[style][track].Set(i, view_as(aReplayData[6]), 6); gA_Frames[style][track].Set(i, view_as(aReplayData[7]), 7); @@ -1002,15 +981,15 @@ bool LoadReplay(int style, int track, const char[] path) } } - gA_FrameCache[style][track][2] = true; // not wr-based + gA_FrameCache[style][track].bNewFormat = true; // not wr-based } else if(StrEqual(sExplodedHeader[1], REPLAY_FORMAT_V2)) { - int iReplaySize = gA_FrameCache[style][track][0] = StringToInt(sExplodedHeader[0]); + int iReplaySize = gA_FrameCache[style][track].iFrameCount = StringToInt(sExplodedHeader[0]); gA_Frames[style][track].Resize(iReplaySize); - gA_FrameCache[style][track][1] = 0.0; // N/A at this version + gA_FrameCache[style][track].fTime = 0.0; // N/A at this version any[] aReplayData = new any[6]; @@ -1027,8 +1006,8 @@ bool LoadReplay(int style, int track, const char[] path) } } - gA_FrameCache[style][track][2] = false; - strcopy(gS_ReplayNames[style][track], MAX_NAME_LENGTH, "invalid"); + gA_FrameCache[style][track].bNewFormat = false; + strcopy(gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH, "invalid"); } else // old, outdated and slow - only used for ancient replays @@ -1050,10 +1029,10 @@ bool LoadReplay(int style, int track, const char[] path) gA_Frames[style][track].Set(i, (iStrings == 6)? StringToInt(sExplodedLine[5]):0, 5); } - gA_FrameCache[style][track][0] = gA_Frames[style][track].Length; - gA_FrameCache[style][track][1] = 0.0; // N/A at this version - gA_FrameCache[style][track][2] = false; // wr-based - strcopy(gS_ReplayNames[style][track], MAX_NAME_LENGTH, "invalid"); + gA_FrameCache[style][track].iFrameCount = gA_Frames[style][track].Length; + gA_FrameCache[style][track].fTime = 0.0; // N/A at this version + gA_FrameCache[style][track].bNewFormat = false; // wr-based + strcopy(gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH, "invalid"); } delete fFile; @@ -1111,10 +1090,10 @@ bool SaveReplay(int style, int track, float time, char[] authid, char[] name) delete fFile; - gA_FrameCache[style][track][0] = iSize; - gA_FrameCache[style][track][1] = time; - gA_FrameCache[style][track][2] = true; - strcopy(gS_ReplayNames[style][track], MAX_NAME_LENGTH, name); + gA_FrameCache[style][track].iFrameCount = iSize; + gA_FrameCache[style][track].fTime = time; + gA_FrameCache[style][track].bNewFormat = true; + strcopy(gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH, name); return true; } @@ -1132,16 +1111,16 @@ bool DeleteReplay(int style, int track) return false; } - if(gB_CentralBot && gA_CentralCache[iCentralStyle] == style && gA_CentralCache[iCentralTrack] == track) + if(gCV_CentralBot.BoolValue && gA_CentralCache.iStyle == style && gA_CentralCache.iTrack == track) { StopCentralReplay(0); } gA_Frames[style][track].Clear(); - gA_FrameCache[style][track][0] = 0; - gA_FrameCache[style][track][1] = 0.0; - gA_FrameCache[style][track][2] = false; - strcopy(gS_ReplayNames[style][track], MAX_NAME_LENGTH, "invalid"); + gA_FrameCache[style][track].iFrameCount = 0; + gA_FrameCache[style][track].fTime = 0.0; + gA_FrameCache[style][track].bNewFormat = false; + strcopy(gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH, "invalid"); gI_ReplayTick[style] = -1; if(gI_ReplayBotClient[style] != 0) @@ -1168,7 +1147,7 @@ public void SQL_GetUserName_Callback(Database db, DBResultSet results, const cha if(results.FetchRow()) { - results.FetchString(0, gS_ReplayNames[style][track], MAX_NAME_LENGTH); + results.FetchString(0, gA_FrameCache[style][track].sReplayName, MAX_NAME_LENGTH); } } @@ -1187,7 +1166,7 @@ public void OnClientPutInServer(int client) else { - if(!gB_CentralBot) + if(!gCV_CentralBot.BoolValue) { for(int i = 0; i < gI_Styles; i++) { @@ -1202,10 +1181,10 @@ public void OnClientPutInServer(int client) } } - else if(gA_CentralCache[iCentralClient] == -1) + else if(gA_CentralCache.iClient == -1) { UpdateReplayInfo(client, 0, 0.0, Track_Main); - gA_CentralCache[iCentralClient] = client; + gA_CentralCache.iClient = client; } } } @@ -1225,7 +1204,7 @@ public void OnEntityCreated(int entity, const char[] classname) public Action HookTriggers(int entity, int other) { - if(gB_Enabled && 1 <= other <= MaxClients && IsFakeClient(other)) + if(gCV_Enabled.BoolValue && 1 <= other <= MaxClients && IsFakeClient(other)) { return Plugin_Handled; } @@ -1248,16 +1227,16 @@ void FormatStyle(const char[] source, int style, bool central, float time, int t ReplaceString(temp, size, "{map}", gS_Map); - if(central && gA_CentralCache[iCentralReplayStatus] == Replay_Idle) + if(central && gA_CentralCache.iReplayStatus == Replay_Idle) { - ReplaceString(temp, size, "{style}", gS_ReplayStrings[sReplayCentralStyle]); - ReplaceString(temp, size, "{styletag}", gS_ReplayStrings[sReplayCentralStyleTag]); + ReplaceString(temp, size, "{style}", gS_ReplayStrings.sCentralStyle); + ReplaceString(temp, size, "{styletag}", gS_ReplayStrings.sCentralStyleTag); } else { - ReplaceString(temp, size, "{style}", gS_StyleStrings[style][sStyleName]); - ReplaceString(temp, size, "{styletag}", gS_StyleStrings[style][sClanTag]); + ReplaceString(temp, size, "{style}", gS_StyleStrings[style].sStyleName); + ReplaceString(temp, size, "{styletag}", gS_StyleStrings[style].sClanTag); } ReplaceString(temp, size, "{time}", sTime); @@ -1272,7 +1251,7 @@ void FormatStyle(const char[] source, int style, bool central, float time, int t void UpdateReplayInfo(int client, int style, float time, int track) { - if(!gB_Enabled || !IsValidClient(client) || !IsFakeClient(client)) + if(!gCV_Enabled.BoolValue || !IsValidClient(client) || !IsFakeClient(client)) { return; } @@ -1280,33 +1259,41 @@ void UpdateReplayInfo(int client, int style, float time, int track) SetEntProp(client, Prop_Data, "m_CollisionGroup", 2); SetEntityMoveType(client, MOVETYPE_NOCLIP); - bool central = (gA_CentralCache[iCentralClient] == client); - bool idle = (central && gA_CentralCache[iCentralReplayStatus] == Replay_Idle); + bool central = (gA_CentralCache.iClient == client); + bool idle = (central && gA_CentralCache.iReplayStatus == Replay_Idle); if(gEV_Type != Engine_TF2) { char sTag[MAX_NAME_LENGTH]; - FormatStyle(gS_ReplayStrings[sReplayClanTag], style, central, time, track, sTag, MAX_NAME_LENGTH); + FormatStyle(gS_ReplayStrings.sClanTag, style, central, time, track, sTag, MAX_NAME_LENGTH); CS_SetClientClanTag(client, sTag); } char sName[MAX_NAME_LENGTH]; - int iFrameCount = view_as(gA_FrameCache[style][track][0]); + int iFrameCount = gA_FrameCache[style][track].iFrameCount; if(central || iFrameCount > 0) { - FormatStyle(gS_ReplayStrings[(idle)? sReplayCentralName:sReplayNameStyle], style, central, time, track, sName, MAX_NAME_LENGTH); + if(idle) + { + FormatStyle(gS_ReplayStrings.sCentralName, style, central, time, track, sName, MAX_NAME_LENGTH); + } + + else + { + FormatStyle(gS_ReplayStrings.sNameStyle, style, central, time, track, sName, MAX_NAME_LENGTH); + } } else { - FormatStyle(gS_ReplayStrings[sReplayUnloaded], style, central, time, track, sName, MAX_NAME_LENGTH); + FormatStyle(gS_ReplayStrings.sUnloaded, style, central, time, track, sName, MAX_NAME_LENGTH); } gB_HideNameChange = true; SetClientName(client, sName); - int iScore = (iFrameCount > 0 || client == gA_CentralCache[iCentralClient])? 2000:-2000; + int iScore = (iFrameCount > 0 || client == gA_CentralCache.iClient)? 2000:-2000; if(gEV_Type == Engine_CSGO) { @@ -1322,7 +1309,7 @@ void UpdateReplayInfo(int client, int style, float time, int track) gB_DontCallTimer = true; - if(!gB_CentralBot && iFrameCount == 0) + if(!gCV_CentralBot.BoolValue && iFrameCount == 0) { if(IsPlayerAlive(client)) { @@ -1351,15 +1338,18 @@ void UpdateReplayInfo(int client, int style, float time, int track) if((iFlags & FL_ATCONTROLS) == 0) { - SetEntityFlags(client, (iFlags|FL_ATCONTROLS)); + SetEntityFlags(client, (iFlags | FL_ATCONTROLS)); } } - if(gEV_Type != Engine_TF2 && strlen(gS_BotWeapon) > 0) + char sWeapon[32]; + gCV_BotWeapon.GetString(sWeapon, 32); + + if(gEV_Type != Engine_TF2 && strlen(sWeapon) > 0) { int iWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon"); - if(StrEqual(gS_BotWeapon, "none")) + if(StrEqual(sWeapon, "none")) { if(iWeapon != -1 && IsValidEntity(iWeapon)) { @@ -1376,7 +1366,7 @@ void UpdateReplayInfo(int client, int style, float time, int track) { GetEntityClassname(iWeapon, sClassname, 32); - if(!StrEqual(gS_BotWeapon, sClassname)) + if(!StrEqual(sWeapon, sClassname)) { CS_DropWeapon(client, iWeapon, false); AcceptEntityInput(iWeapon, "Kill"); @@ -1385,22 +1375,22 @@ void UpdateReplayInfo(int client, int style, float time, int track) else { - GivePlayerItem(client, gS_BotWeapon); + GivePlayerItem(client, sWeapon); } } } } - if(GetClientTeam(client) != gI_DefaultTeam) + if(GetClientTeam(client) != gCV_DefaultTeam.IntValue) { if(gEV_Type == Engine_TF2) { - ChangeClientTeam(client, gI_DefaultTeam); + ChangeClientTeam(client, gCV_DefaultTeam.IntValue); } else { - CS_SwitchTeam(client, gI_DefaultTeam); + CS_SwitchTeam(client, gCV_DefaultTeam.IntValue); } } } @@ -1422,9 +1412,9 @@ public void OnClientDisconnect(int client) return; } - if(gA_CentralCache[iCentralClient] == client) + if(gA_CentralCache.iClient == client) { - gA_CentralCache[iCentralClient] = -1; + gA_CentralCache.iClient = -1; return; } @@ -1459,17 +1449,16 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st return; } - if(!gB_Enabled || (gF_TimeLimit > 0.0 && time > gF_TimeLimit)) + if(!gCV_Enabled.BoolValue || (gCV_TimeLimit.FloatValue > 0.0 && time > gCV_TimeLimit.FloatValue)) { ClearFrames(client); return; } - bool newformat = view_as(gA_FrameCache[style][track][2]); float length = GetReplayLength(style, track); - if(newformat) + if(gA_FrameCache[style][track].bNewFormat) { if(length > 0.0 && time > length) { @@ -1479,8 +1468,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st else { - float wrtime = 0.0; - Shavit_GetWRTime(style, wrtime, track); + float wrtime = Shavit_GetWorldRecord(style, track); if(wrtime != 0.0 && time > wrtime) { @@ -1507,12 +1495,12 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st if(ReplayEnabled(style)) { - if(gB_CentralBot && gA_CentralCache[iCentralStyle] == style && gA_CentralCache[iCentralTrack] == track) + if(gCV_CentralBot.BoolValue && gA_CentralCache.iStyle == style && gA_CentralCache.iTrack == track) { StopCentralReplay(0); } - else if(!gB_CentralBot && gI_ReplayBotClient[style] != 0) + else if(!gCV_CentralBot.BoolValue && gI_ReplayBotClient[style] != 0) { UpdateReplayInfo(gI_ReplayBotClient[style], style, time, track); @@ -1557,7 +1545,7 @@ void ApplyFlags(int &flags1, int flags2, int flag) // OnPlayerRunCmd instead of Shavit_OnUserCmdPre because bots are also used here. public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3]) { - if(!gB_Enabled) + if(!gCV_Enabled.BoolValue) { return Plugin_Continue; } @@ -1566,7 +1554,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 { if((buttons & IN_USE) > 0) { - if(!gB_Button[client] && GetSpectatorTarget(client) == gA_CentralCache[iCentralClient]) + if(!gB_Button[client] && GetSpectatorTarget(client) == gA_CentralCache.iClient) { OpenReplayMenu(client); } @@ -1595,14 +1583,12 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 vel[0] = 0.0; vel[1] = 0.0; - int iFrameCount = view_as(gA_FrameCache[style][track][0]); - - if(gA_Frames[style][track] == null || iFrameCount <= 0) // if no replay is loaded + if(gA_Frames[style][track] == null || gA_FrameCache[style][track].iFrameCount <= 0) // if no replay is loaded { return Plugin_Changed; } - if(gI_ReplayTick[style] != -1 && iFrameCount >= 1) + if(gI_ReplayTick[style] != -1 && gA_FrameCache[style][track].iFrameCount >= 1) { float vecPosition[3]; float vecAngles[3]; @@ -1611,7 +1597,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 { bool bStart = (gRS_ReplayStatus[style] == Replay_Start); - int iFrame = (bStart)? 0:(iFrameCount - 1); + int iFrame = (bStart)? 0:(gA_FrameCache[style][track].iFrameCount - 1); vecPosition[0] = gA_Frames[style][track].Get(iFrame, 0); vecPosition[1] = gA_Frames[style][track].Get(iFrame, 1); @@ -1636,12 +1622,12 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 return Plugin_Changed; } - if(++gI_ReplayTick[style] >= iFrameCount) + if(++gI_ReplayTick[style] >= gA_FrameCache[style][track].iFrameCount) { gI_ReplayTick[style] = 0; - gRS_ReplayStatus[style] = gA_CentralCache[iCentralReplayStatus] = Replay_End; + gRS_ReplayStatus[style] = gA_CentralCache.iReplayStatus = Replay_End; - CreateTimer((gF_ReplayDelay / 2.0), Timer_EndReplay, style, TIMER_FLAG_NO_MAPCHANGE); + CreateTimer((gCV_ReplayDelay.FloatValue / 2.0), Timer_EndReplay, style, TIMER_FLAG_NO_MAPCHANGE); return Plugin_Changed; } @@ -1660,24 +1646,24 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 buttons = gA_Frames[style][track].Get(gI_ReplayTick[style], 5); - if((gI_BotShooting & iBotShooting_Attack1) == 0) + if((gCV_BotShooting.IntValue & iBotShooting_Attack1) == 0) { buttons &= ~IN_ATTACK; } - if((gI_BotShooting & iBotShooting_Attack2) == 0) + if((gCV_BotShooting.IntValue & iBotShooting_Attack2) == 0) { buttons &= ~IN_ATTACK2; } - if(!gB_BotPlusUse) + if(!gCV_BotPlusUse.BoolValue) { buttons &= ~IN_USE; } MoveType mt = MOVETYPE_NOCLIP; - if(gA_FrameCache[style][track][3] >= 0x02) + if(gA_FrameCache[style][track].iReplayVersion >= 0x02) { int iReplayFlags = gA_Frames[style][track].Get(gI_ReplayTick[style], 6); int iEntityFlags = GetEntityFlags(client); @@ -1740,7 +1726,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 else if(ReplayEnabled(Shavit_GetBhopStyle(client)) && Shavit_GetTimerStatus(client) == Timer_Running) { - if((gI_PlayerFrames[client] / gF_Tickrate) > gF_TimeLimit) + if((gI_PlayerFrames[client] / gF_Tickrate) > gCV_TimeLimit.FloatValue) { // in case of bad timing if(gB_HijackFrame[client]) @@ -1798,7 +1784,7 @@ bool IsWallBetween(float pos1[3], float pos2[3], int bot) public Action Timer_EndReplay(Handle Timer, any data) { - if(gB_CentralBot && gB_ForciblyStopped) + if(gCV_CentralBot.BoolValue && gB_ForciblyStopped) { gB_ForciblyStopped = false; @@ -1811,16 +1797,16 @@ public Action Timer_EndReplay(Handle Timer, any data) Call_PushCell(gI_ReplayBotClient[data]); Call_Finish(); - if(gI_ReplayBotClient[data] != gA_CentralCache[iCentralClient]) + if(gI_ReplayBotClient[data] != gA_CentralCache.iClient) { gRS_ReplayStatus[data] = Replay_Start; - CreateTimer((gF_ReplayDelay / 2.0), Timer_StartReplay, data, TIMER_FLAG_NO_MAPCHANGE); + CreateTimer((gCV_ReplayDelay.FloatValue / 2.0), Timer_StartReplay, data, TIMER_FLAG_NO_MAPCHANGE); } else { - gRS_ReplayStatus[data] = gA_CentralCache[iCentralReplayStatus] = Replay_Idle; + gRS_ReplayStatus[data] = gA_CentralCache.iReplayStatus = Replay_Idle; gI_ReplayBotClient[data] = 0; } @@ -1829,7 +1815,7 @@ public Action Timer_EndReplay(Handle Timer, any data) public Action Timer_StartReplay(Handle Timer, any data) { - if(gRS_ReplayStatus[data] == Replay_Running || (gB_CentralBot && gB_ForciblyStopped)) + if(gRS_ReplayStatus[data] == Replay_Running || (gCV_CentralBot.BoolValue && gB_ForciblyStopped)) { return Plugin_Stop; } @@ -1838,19 +1824,19 @@ public Action Timer_StartReplay(Handle Timer, any data) Call_PushCell(gI_ReplayBotClient[data]); Call_Finish(); - gRS_ReplayStatus[data] = gA_CentralCache[iCentralReplayStatus] = Replay_Running; + gRS_ReplayStatus[data] = gA_CentralCache.iReplayStatus = Replay_Running; return Plugin_Stop; } bool ReplayEnabled(any style) { - return (!gA_StyleSettings[style][bUnranked] && !gA_StyleSettings[style][bNoReplay]); + return (!gA_StyleSettings[style].bUnranked && !gA_StyleSettings[style].bNoReplay); } public void Player_Event(Event event, const char[] name, bool dontBroadcast) { - if(!gB_Enabled) + if(!gCV_Enabled.BoolValue) { return; } @@ -1886,7 +1872,7 @@ public Action DelayedUpdate(Handle Timer, any data) public void BotEvents(Event event, const char[] name, bool dontBroadcast) { - if(!gB_Enabled) + if(!gCV_Enabled.BoolValue) { return; } @@ -1911,7 +1897,7 @@ public void BotEvents(Event event, const char[] name, bool dontBroadcast) public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int playersNum, bool reliable, bool init) { - if(!gB_HideNameChange || !gB_Enabled) + if(!gB_HideNameChange || !gCV_Enabled.BoolValue) { return Plugin_Continue; } @@ -1960,10 +1946,9 @@ void ClearFrames(int client) public void Shavit_OnWRDeleted(int style, int id, int track) { - float time = 0.0; - Shavit_GetWRTime(style, time, track); + float time = Shavit_GetWorldRecord(style, track); - if(view_as(gA_FrameCache[style][track][0]) > 0 && GetReplayLength(style, track) - gF_Tickrate <= time) // -0.1 to fix rounding issues + if(gA_FrameCache[style][track].iFrameCount > 0 && GetReplayLength(style, track) - gF_Tickrate <= time) // -0.1 to fix rounding issues { DeleteReplay(style, track); } @@ -1988,7 +1973,7 @@ public Action Command_DeleteReplay(int client, int args) for(int j = 0; j < TRACKS_SIZE; j++) { - if(view_as(gA_FrameCache[i][j][0]) == 0) + if(gA_FrameCache[i][j].iFrameCount == 0) { continue; } @@ -2008,12 +1993,12 @@ public Action Command_DeleteReplay(int client, int args) char sTime[32]; FormatSeconds(time, sTime, 32, false); - FormatEx(sDisplay, 64, "%s (%s) - %s", gS_StyleStrings[i][sStyleName], sTrack, sTime); + FormatEx(sDisplay, 64, "%s (%s) - %s", gS_StyleStrings[i].sStyleName, sTrack, sTime); } else { - FormatEx(sDisplay, 64, "%s (%s)", gS_StyleStrings[i][sStyleName], sTrack); + FormatEx(sDisplay, 64, "%s (%s)", gS_StyleStrings[i].sStyleName, sTrack); } menu.AddItem(sInfo, sDisplay); @@ -2053,7 +2038,7 @@ public int DeleteReplay_Callback(Menu menu, MenuAction action, int param1, int p gI_Track[param1] = StringToInt(sExploded[1]); Menu submenu = new Menu(DeleteConfirmation_Callback); - submenu.SetTitle("%T", "ReplayDeletionConfirmation", param1, gS_StyleStrings[style][sStyleName]); + submenu.SetTitle("%T", "ReplayDeletionConfirmation", param1, gS_StyleStrings[style].sStyleName); char sMenuItem[64]; @@ -2097,14 +2082,14 @@ public int DeleteConfirmation_Callback(Menu menu, MenuAction action, int param1, char sTrack[32]; GetTrackName(param1, gI_Track[param1], sTrack, 32); - LogAction(param1, param1, "Deleted replay for %s on map %s. (Track: %s)", gS_StyleStrings[style][sStyleName], gS_Map, sTrack); + LogAction(param1, param1, "Deleted replay for %s on map %s. (Track: %s)", gS_StyleStrings[style].sStyleName, gS_Map, sTrack); - Shavit_PrintToChat(param1, "%T (%s%s%s)", "ReplayDeleted", param1, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(param1, "%T (%s%s%s)", "ReplayDeleted", param1, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText); } else { - Shavit_PrintToChat(param1, "%T", "ReplayDeleteFailure", param1, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(param1, "%T", "ReplayDeleteFailure", param1, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText); } } @@ -2118,14 +2103,14 @@ public int DeleteConfirmation_Callback(Menu menu, MenuAction action, int param1, public Action Command_Replay(int client, int args) { - if(!IsValidClient(client) || !gB_CentralBot || gA_CentralCache[iCentralClient] == -1) + if(!IsValidClient(client) || !gCV_CentralBot.BoolValue || gA_CentralCache.iClient == -1) { return Plugin_Handled; } - if(GetClientTeam(client) != 1 || GetSpectatorTarget(client) != gA_CentralCache[iCentralClient]) + if(GetClientTeam(client) != 1 || GetSpectatorTarget(client) != gA_CentralCache.iClient) { - Shavit_PrintToChat(client, "%T", "CentralReplaySpectator", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "CentralReplaySpectator", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText, gS_ChatStrings.sVariable, gS_ChatStrings.sText); return Plugin_Handled; } @@ -2157,7 +2142,7 @@ Action OpenReplayMenu(int client) for(int j = 0; j < gI_Styles; j++) { - if(view_as(gA_FrameCache[j][i][0]) > 0) + if(gA_FrameCache[j][i].iFrameCount > 0) { records = true; @@ -2214,7 +2199,7 @@ void OpenReplaySubMenu(int client, int track) char sDisplay[64]; FormatEx(sDisplay, 64, "%T", "CentralReplayStop", client); - menu.AddItem("stop", sDisplay, (gA_CentralCache[iCentralReplayStatus] != Replay_Idle)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); + menu.AddItem("stop", sDisplay, (gA_CentralCache.iReplayStatus != Replay_Idle)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); } for(int i = 0; i < gI_Styles; i++) @@ -2236,15 +2221,15 @@ void OpenReplaySubMenu(int client, int track) char sTime[32]; FormatSeconds(time, sTime, 32, false); - FormatEx(sDisplay, 64, "%s - %s", gS_StyleStrings[i][sStyleName], sTime); + FormatEx(sDisplay, 64, "%s - %s", gS_StyleStrings[i].sStyleName, sTime); } else { - strcopy(sDisplay, 64, gS_StyleStrings[i][sStyleName]); + strcopy(sDisplay, 64, gS_StyleStrings[i].sStyleName); } - menu.AddItem(sInfo, sDisplay, (view_as(gA_FrameCache[i][track][0]) > 0)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); + menu.AddItem(sInfo, sDisplay, (gA_FrameCache[i][track].iFrameCount > 0)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); } if(menu.ItemCount == 0) @@ -2278,12 +2263,12 @@ public int MenuHandler_ReplaySubmenu(Menu menu, MenuAction action, int param1, i int style = StringToInt(info); - if(style == -1 || !ReplayEnabled(style) || view_as(gA_FrameCache[style][gI_Track[param1]][0]) == 0 || gA_CentralCache[iCentralClient] <= 0) + if(style == -1 || !ReplayEnabled(style) || gA_FrameCache[style][gI_Track[param1]].iFrameCount == 0 || gA_CentralCache.iClient <= 0) { return 0; } - if(gA_CentralCache[iCentralReplayStatus] != Replay_Idle) + if(gA_CentralCache.iReplayStatus != Replay_Idle) { Shavit_PrintToChat(param1, "%T", "CentralReplayPlaying", param1); @@ -2293,18 +2278,18 @@ public int MenuHandler_ReplaySubmenu(Menu menu, MenuAction action, int param1, i else { gI_ReplayTick[style] = 0; - gA_CentralCache[iCentralStyle] = style; - gA_CentralCache[iCentralTrack] = gI_Track[param1]; - gI_ReplayBotClient[style] = gA_CentralCache[iCentralClient]; - gRS_ReplayStatus[style] = gA_CentralCache[iCentralReplayStatus] = Replay_Start; - TeleportToStart(gA_CentralCache[iCentralClient], style, gI_Track[param1]); + gA_CentralCache.iStyle = style; + gA_CentralCache.iTrack = gI_Track[param1]; + gI_ReplayBotClient[style] = gA_CentralCache.iClient; + gRS_ReplayStatus[style] = gA_CentralCache.iReplayStatus = Replay_Start; + TeleportToStart(gA_CentralCache.iClient, style, gI_Track[param1]); gB_ForciblyStopped = false; - float time = GetReplayLength(gA_CentralCache[iCentralStyle], gI_Track[param1]); + float time = GetReplayLength(gA_CentralCache.iStyle, gI_Track[param1]); - UpdateReplayInfo(gA_CentralCache[iCentralClient], style, time, gI_Track[param1]); + UpdateReplayInfo(gA_CentralCache.iClient, style, time, gI_Track[param1]); - CreateTimer((gF_ReplayDelay / 2.0), Timer_StartReplay, style, TIMER_FLAG_NO_MAPCHANGE); + CreateTimer((gCV_ReplayDelay.FloatValue / 2.0), Timer_StartReplay, style, TIMER_FLAG_NO_MAPCHANGE); } } @@ -2323,7 +2308,7 @@ public int MenuHandler_ReplaySubmenu(Menu menu, MenuAction action, int param1, i void TeleportToStart(int client, int style, int track) { - if(view_as(gA_FrameCache[style][track][0]) == 0) + if(gA_FrameCache[style][track].iFrameCount == 0) { return; } @@ -2347,17 +2332,21 @@ void StopCentralReplay(int client) Shavit_PrintToChat(client, "%T", "CentralReplayStopped", client); } - int style = gA_CentralCache[iCentralStyle]; + int style = gA_CentralCache.iStyle; - gRS_ReplayStatus[style] = gA_CentralCache[iCentralReplayStatus] = Replay_Idle; + gRS_ReplayStatus[style] = gA_CentralCache.iReplayStatus = Replay_Idle; gI_ReplayTick[style] = 0; gI_ReplayBotClient[style] = 0; gF_StartTick[style] = -65535.0; - TeleportToStart(gA_CentralCache[iCentralClient], style, GetReplayTrack(gA_CentralCache[iCentralClient])); - gA_CentralCache[iCentralStyle] = 0; + gA_CentralCache.iStyle = 0; gB_ForciblyStopped = true; - UpdateReplayInfo(client, 0, 0.0, gA_CentralCache[iCentralTrack]); + if(gA_CentralCache.iClient != -1) + { + TeleportToStart(gA_CentralCache.iClient, style, GetReplayTrack(gA_CentralCache.iClient)); + } + + UpdateReplayInfo(client, 0, 0.0, gA_CentralCache.iTrack); } int GetReplayStyle(int client) @@ -2367,14 +2356,14 @@ int GetReplayStyle(int client) return -1; } - if(gB_CentralBot) + if(gCV_CentralBot.BoolValue) { - if(gA_CentralCache[iCentralStyle] == -1) + if(gA_CentralCache.iStyle == -1) { return 0; } - return gA_CentralCache[iCentralStyle]; + return gA_CentralCache.iStyle; } for(int i = 0; i < gI_Styles; i++) @@ -2395,7 +2384,7 @@ int GetReplayTrack(int client) return -1; } - return (gB_CentralBot)? gA_CentralCache[iCentralTrack]:Track_Main; + return (gCV_CentralBot.BoolValue)? gA_CentralCache.iTrack:Track_Main; } int GetSpectatorTarget(int client) @@ -2436,22 +2425,21 @@ void GetTrackName(int client, int track, char[] output, int size) float GetReplayLength(int style, int track) { - if(view_as(gA_FrameCache[style][track][2])) + if(gA_FrameCache[style][track].bNewFormat) { - return view_as(gA_FrameCache[style][track][1]); + return gA_FrameCache[style][track].fTime; } - float fWRTime = 0.0; - Shavit_GetWRTime(style, fWRTime, track); + float fWRTime = Shavit_GetWorldRecord(style, track); return fWRTime; } void GetReplayName(int style, int track, char[] buffer, int length) { - if(view_as(gA_FrameCache[style][track][2])) + if(gA_FrameCache[style][track].bNewFormat) { - strcopy(buffer, length, gS_ReplayNames[style][track]); + strcopy(buffer, length, gA_FrameCache[style][track].sReplayName); return; } @@ -2485,7 +2473,7 @@ bool File_Copy(const char[] source, const char[] destination) return false; } - int[] buffer = new int[32]; + int buffer[32]; int cache = 0; while(!IsEndOfFile(file_source)) diff --git a/addons/sourcemod/scripting/shavit-sounds.sp b/addons/sourcemod/scripting/shavit-sounds.sp index 34e1ee24..7f450abe 100644 --- a/addons/sourcemod/scripting/shavit-sounds.sp +++ b/addons/sourcemod/scripting/shavit-sounds.sp @@ -38,9 +38,6 @@ StringMap gSM_RankSounds = null; // cvars ConVar gCV_MinimumWorst = null; -// cached cvars -int gI_MinimumWorst = 10; - public Plugin myinfo = { name = "[shavit] Sounds", @@ -81,16 +78,9 @@ public void OnPluginStart() // cvars gCV_MinimumWorst = CreateConVar("shavit_sounds_minimumworst", "10", "Minimum amount of records to be saved for a \"worst\" sound to play.", 0, true, 1.0); - gCV_MinimumWorst.AddChangeHook(OnConVarChanged); - AutoExecConfig(); } -public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) -{ - gI_MinimumWorst = gCV_MinimumWorst.IntValue; -} - public void OnLibraryAdded(const char[] name) { if(StrEqual(name, "shavit-hud")) @@ -195,8 +185,7 @@ public void OnMapStart() public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, int strafes, float sync, int rank, int overwrite, int track) { - float fOldTime = 0.0; - Shavit_GetPlayerPB(client, style, fOldTime, track); + float fOldTime = Shavit_GetClientPB(client, style, track); char sSound[PLATFORM_MAX_PATH]; bool bEveryone = false; @@ -234,7 +223,7 @@ public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, i public void Shavit_OnWorstRecord(int client, int style, float time, int jumps, int strafes, float sync, int track) { - if(gA_WorstSounds.Length != 0 && Shavit_GetRecordAmount(style, track) >= gI_MinimumWorst) + if(gA_WorstSounds.Length != 0 && Shavit_GetRecordAmount(style, track) >= gCV_MinimumWorst.IntValue) { char sSound[PLATFORM_MAX_PATH]; gA_WorstSounds.GetString(GetRandomInt(0, gA_WorstSounds.Length - 1), sSound, PLATFORM_MAX_PATH); diff --git a/addons/sourcemod/scripting/shavit-stats.sp b/addons/sourcemod/scripting/shavit-stats.sp index de1b8fa1..4787869c 100644 --- a/addons/sourcemod/scripting/shavit-stats.sp +++ b/addons/sourcemod/scripting/shavit-stats.sp @@ -59,17 +59,13 @@ bool gB_Late = false; ConVar gCV_MVPRankOnes = null; ConVar gCV_MVPRankOnes_Main = null; -// cached cvars -int gI_MVPRankOnes = 2; -bool gB_MVPRankOnes_Main = true; - // timer settings int gI_Styles = 0; -char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128]; -any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE]; +stylestrings_t gS_StyleStrings[STYLE_LIMIT]; +stylesettings_t gA_StyleSettings[STYLE_LIMIT]; // chat settings -char gS_ChatStrings[CHATSETTINGS_SIZE][128]; +chatstrings_t gS_ChatStrings; public Plugin myinfo = { @@ -127,9 +123,6 @@ public void OnPluginStart() gCV_MVPRankOnes = CreateConVar("shavit_stats_mvprankones", "2", "Set the players' amount of MVPs to the amount of #1 times they have.\n0 - Disabled\n1 - Enabled, for all styles.\n2 - Enabled, for default style only.\n(CS:S/CS:GO only)", 0, true, 0.0, true, 2.0); gCV_MVPRankOnes_Main = CreateConVar("shavit_stats_mvprankones_maintrack", "1", "If set to 0, all tracks will be counted for the MVP stars.\nOtherwise, only the main track will be checked.\n\nRequires \"shavit_stats_mvprankones\" set to 1 or above.\n(CS:S/CS:GO only)", 0, true, 0.0, true, 1.0); - gCV_MVPRankOnes.AddChangeHook(OnConVarChanged); - gCV_MVPRankOnes_Main.AddChangeHook(OnConVarChanged); - AutoExecConfig(); gB_Rankings = LibraryExists("shavit-rankings"); @@ -167,8 +160,8 @@ public void Shavit_OnStyleConfigLoaded(int styles) for(int i = 0; i < styles; i++) { Shavit_GetStyleSettings(i, gA_StyleSettings[i]); - Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i][sStyleName], 128); - Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i][sShortName], 128); + Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName)); + Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i].sShortName, sizeof(stylestrings_t::sShortName)); } gI_Styles = styles; @@ -176,16 +169,12 @@ public void Shavit_OnStyleConfigLoaded(int styles) public void Shavit_OnChatConfigLoaded() { - for(int i = 0; i < CHATSETTINGS_SIZE; i++) - { - Shavit_GetChatStrings(i, gS_ChatStrings[i], 128); - } -} - -public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) -{ - gI_MVPRankOnes = gCV_MVPRankOnes.IntValue; - gB_MVPRankOnes_Main = gCV_MVPRankOnes_Main.BoolValue; + Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); } public void OnClientPutInServer(int client) @@ -271,7 +260,7 @@ void SQL_SetPrefix() public void Player_Event(Event event, const char[] name, bool dontBroadcast) { - if(gI_MVPRankOnes == 0) + if(gCV_MVPRankOnes.IntValue == 0) { return; } @@ -297,14 +286,14 @@ void UpdateWRs(int client) { char sQuery[256]; - if(gI_MVPRankOnes == 2) + if(gCV_MVPRankOnes.IntValue == 2) { - FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes WHERE style = 0 %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gB_MVPRankOnes_Main)? "AND track = 0 ":"", sAuthID); + FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes WHERE style = 0 %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gCV_MVPRankOnes_Main.BoolValue)? "AND track = 0 ":"", sAuthID); } else { - FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gB_MVPRankOnes_Main)? "WHERE track = 0 ":"", sAuthID); + FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gCV_MVPRankOnes_Main.BoolValue)? "WHERE track = 0 ":"", sAuthID); } gH_SQL.Query(SQL_GetWRs_Callback, sQuery, GetClientSerial(client)); @@ -329,7 +318,7 @@ public void SQL_GetWRs_Callback(Database db, DBResultSet results, const char[] e int iWRs = results.FetchInt(0); - if(gI_MVPRankOnes > 0 && gEV_Type != Engine_TF2) + if(gCV_MVPRankOnes.IntValue > 0 && gEV_Type != Engine_TF2) { CS_SetMVPCount(client, iWRs); } @@ -469,11 +458,13 @@ public void OpenStatsMenuCallback(Database db, DBResultSet results, const char[] FormatEx(sClearString, 128, "%T: %d/%d (%.01f%%)", "MapCompletions", client, iClears, iTotalMaps, ((float(iClears) / iTotalMaps) * 100.0)); Menu menu = new Menu(MenuHandler_ProfileHandler); - menu.SetTitle("%s's %T. %s\n%T: %s\n%s\n%s\n[%s] %T: %d%s\n", gS_TargetName[client], "Profile", client, gS_TargetAuth[client], "Country", client, sCountry, sLastLogin, sClearString, gS_StyleStrings[0][sStyleName], "WorldRecords", client, iWRs, sRankingString); + menu.SetTitle("%s's %T. %s\n%T: %s\n%s\n%s\n[%s] %T: %d%s\n", + gS_TargetName[client], "Profile", client, gS_TargetAuth[client], "Country", client, sCountry, sLastLogin, sClearString, + gS_StyleStrings[0].sStyleName, "WorldRecords", client, iWRs, sRankingString); for(int i = 0; i < gI_Styles; i++) { - if(gA_StyleSettings[i][bUnranked]) + if(gA_StyleSettings[i].bUnranked) { continue; } @@ -481,7 +472,7 @@ public void OpenStatsMenuCallback(Database db, DBResultSet results, const char[] char sInfo[4]; IntToString(i, sInfo, 4); - menu.AddItem(sInfo, gS_StyleStrings[i][sStyleName]); + menu.AddItem(sInfo, gS_StyleStrings[i].sStyleName); } // should NEVER happen @@ -498,7 +489,7 @@ public void OpenStatsMenuCallback(Database db, DBResultSet results, const char[] else { - Shavit_PrintToChat(client, "%T", "StatsMenuFailure", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "StatsMenuFailure", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } } @@ -512,7 +503,7 @@ public int MenuHandler_ProfileHandler(Menu menu, MenuAction action, int param1, gBS_Style[param1] = StringToInt(sInfo); Menu submenu = new Menu(MenuHandler_TypeHandler); - submenu.SetTitle("%T", "MapsMenu", param1, gS_StyleStrings[gBS_Style[param1]][sShortName]); + submenu.SetTitle("%T", "MapsMenu", param1, gS_StyleStrings[gBS_Style[param1]].sShortName); for(int j = 0; j < TRACKS_SIZE; j++) { @@ -636,12 +627,12 @@ public void ShowMapsCallback(Database db, DBResultSet results, const char[] erro if(gI_MapType[client] == MAPSDONE) { - menu.SetTitle("%T (%s)", "MapsDoneFor", client, gS_StyleStrings[gBS_Style[client]][sShortName], gS_TargetName[client], rows, sTrack); + menu.SetTitle("%T (%s)", "MapsDoneFor", client, gS_StyleStrings[gBS_Style[client]].sShortName, gS_TargetName[client], rows, sTrack); } else { - menu.SetTitle("%T (%s)", "MapsLeftFor", client, gS_StyleStrings[gBS_Style[client]][sShortName], gS_TargetName[client], rows, sTrack); + menu.SetTitle("%T (%s)", "MapsLeftFor", client, gS_StyleStrings[gBS_Style[client]].sShortName, gS_TargetName[client], rows, sTrack); } while(results.FetchRow()) @@ -773,7 +764,7 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] // 3 - style int style = results.FetchInt(3); - FormatEx(sDisplay, 128, "%T: %s", "Style", client, gS_StyleStrings[style][sStyleName]); + FormatEx(sDisplay, 128, "%T: %s", "Style", client, gS_StyleStrings[style].sStyleName); menu.AddItem("-1", sDisplay); // 4 - steamid3 diff --git a/addons/sourcemod/scripting/shavit-timelimit.sp b/addons/sourcemod/scripting/shavit-timelimit.sp index 7d04212e..81cb18da 100644 --- a/addons/sourcemod/scripting/shavit-timelimit.sp +++ b/addons/sourcemod/scripting/shavit-timelimit.sp @@ -53,15 +53,6 @@ ConVar gCV_MinimumTimes = null; ConVar gCV_PlayerAmount = null; ConVar gCV_Style = null; -// cached cvars -bool gB_Config = true; -float gF_DefaultLimit = 60.0; -bool gB_DynamicTimelimits = true; -bool gB_ForceMapEnd = true; -int gI_MinimumTimes = 5; -int gI_PlayerAmount = 25; -bool gB_Style = true; - // misc cache Handle gH_Timer = null; EngineVersion gEV_Type = Engine_Unknown; @@ -117,13 +108,7 @@ public void OnPluginStart() gCV_PlayerAmount = CreateConVar("shavit_timelimit_playertime", "25", "Limited amount of times to grab from the database to calculate an average.\nREQUIRES \"shavit_timelimit_dynamic\" TO BE ENABLED!\nSet to 0 to have it \"unlimited\".", 0); gCV_Style = CreateConVar("shavit_timelimit_style", "1", "If set to 1, calculate an average only from times that the first (default: forwards) style was used to set.\nREQUIRES \"shavit_timelimit_dynamic\" TO BE ENABLED!", 0, true, 0.0, true, 1.0); - gCV_Config.AddChangeHook(OnConVarChanged); - gCV_DefaultLimit.AddChangeHook(OnConVarChanged); - gCV_DynamicTimelimits.AddChangeHook(OnConVarChanged); gCV_ForceMapEnd.AddChangeHook(OnConVarChanged); - gCV_MinimumTimes.AddChangeHook(OnConVarChanged); - gCV_PlayerAmount.AddChangeHook(OnConVarChanged); - gCV_Style.AddChangeHook(OnConVarChanged); AutoExecConfig(); @@ -132,31 +117,20 @@ public void OnPluginStart() public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) { - gB_Config = gCV_Config.BoolValue; - gF_DefaultLimit = gCV_DefaultLimit.FloatValue; - gB_DynamicTimelimits = gCV_DynamicTimelimits.BoolValue; - gB_ForceMapEnd = gCV_ForceMapEnd.BoolValue; - gI_MinimumTimes = gCV_MinimumTimes.IntValue; - gI_PlayerAmount = gCV_PlayerAmount.IntValue; - gB_Style = gCV_Style.BoolValue; - - if(convar == gCV_ForceMapEnd) + if(view_as(StringToInt(newValue)) && gEV_Type != Engine_TF2) { - if(gB_ForceMapEnd && gEV_Type != Engine_TF2) - { - gH_Timer = CreateTimer(1.0, Timer_PrintToChat, 0, TIMER_REPEAT); - } + gH_Timer = CreateTimer(1.0, Timer_PrintToChat, 0, TIMER_REPEAT); + } - else - { - delete gH_Timer; - } + else + { + delete gH_Timer; } } public void OnConfigsExecuted() { - if(gB_Config) + if(gCV_Config.BoolValue) { if(mp_do_warmup_period != null) { @@ -182,17 +156,17 @@ public void OnMapStart() return; } - if(gB_DynamicTimelimits) + if(gCV_DynamicTimelimits.BoolValue) { StartCalculating(); } else { - SetLimit(RoundToNearest(gF_DefaultLimit)); + SetLimit(RoundToNearest(gCV_DefaultLimit.FloatValue)); } - if(gB_ForceMapEnd && gH_Timer == null && gEV_Type != Engine_TF2) + if(gCV_ForceMapEnd.BoolValue && gH_Timer == null && gEV_Type != Engine_TF2) { gH_Timer = CreateTimer(1.0, Timer_PrintToChat, 0, TIMER_REPEAT); } @@ -262,7 +236,7 @@ void StartCalculating() GetMapDisplayName(sMap, sMap, 160); char sQuery[512]; - FormatEx(sQuery, 512, "SELECT COUNT(*), SUM(t.time) FROM (SELECT r.time, r.style FROM %splayertimes r WHERE r.map = '%s' AND r.track = 0 %sORDER BY r.time LIMIT %d) t;", gS_MySQLPrefix, sMap, (gB_Style)? "AND style = 0 ":"", gI_PlayerAmount); + FormatEx(sQuery, 512, "SELECT COUNT(*), SUM(t.time) FROM (SELECT r.time, r.style FROM %splayertimes r WHERE r.map = '%s' AND r.track = 0 %sORDER BY r.time LIMIT %d) t;", gS_MySQLPrefix, sMap, (gCV_Style.BoolValue)? "AND style = 0 ":"", gCV_PlayerAmount.IntValue); #if defined DEBUG PrintToServer("%s", sQuery); @@ -284,7 +258,7 @@ public void SQL_GetMapTimes(Database db, DBResultSet results, const char[] error results.FetchRow(); int iRows = results.FetchInt(0); - if(iRows >= gI_MinimumTimes) + if(iRows >= gCV_MinimumTimes.IntValue) { float fTimeSum = results.FetchFloat(1); float fAverage = (fTimeSum / 60 / iRows); @@ -331,7 +305,7 @@ public void SQL_GetMapTimes(Database db, DBResultSet results, const char[] error else { - SetLimit(RoundToNearest(gF_DefaultLimit)); + SetLimit(RoundToNearest(gCV_DefaultLimit.FloatValue)); } } diff --git a/addons/sourcemod/scripting/shavit-wr.sp b/addons/sourcemod/scripting/shavit-wr.sp index f7391dfb..a33598a6 100644 --- a/addons/sourcemod/scripting/shavit-wr.sp +++ b/addons/sourcemod/scripting/shavit-wr.sp @@ -29,6 +29,14 @@ // #define DEBUG +enum struct wrcache_t +{ + int iLastStyle; + int iLastTrack; + bool bPendingMenu; + char sClientMap[128]; +}; + bool gB_Late = false; bool gB_Rankings = false; bool gB_Stats = false; @@ -45,10 +53,7 @@ bool gB_Connected = false; bool gB_MySQL = false; // cache -int gBS_LastWR[MAXPLAYERS+1]; -char gS_ClientMap[MAXPLAYERS+1][128]; -int gI_LastTrack[MAXPLAYERS+1]; -bool gB_PendingMenu[MAXPLAYERS+1]; +wrcache_t gA_WRCache[MAXPLAYERS+1]; char gS_Map[160]; // blame workshop paths being so fucking long ArrayList gA_ValidMaps = null; @@ -73,17 +78,13 @@ char gS_MySQLPrefix[32]; ConVar gCV_RecordsLimit = null; ConVar gCV_RecentLimit = null; -// cached cvars -int gI_RecordsLimit = 50; -int gI_RecentLimit = 50; - // timer settings int gI_Styles = 0; -char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128]; -any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE]; +stylestrings_t gS_StyleStrings[STYLE_LIMIT]; +stylesettings_t gA_StyleSettings[STYLE_LIMIT]; // chat settings -char gS_ChatStrings[CHATSETTINGS_SIZE][128]; +chatstrings_t gS_ChatStrings; public Plugin myinfo = { @@ -97,10 +98,12 @@ public Plugin myinfo = public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { // natives + CreateNative("Shavit_GetClientPB", Native_GetClientPB); CreateNative("Shavit_GetPlayerPB", Native_GetPlayerPB); CreateNative("Shavit_GetRankForTime", Native_GetRankForTime); CreateNative("Shavit_GetRecordAmount", Native_GetRecordAmount); CreateNative("Shavit_GetTimeForRank", Native_GetTimeForRank); + CreateNative("Shavit_GetWorldRecord", Native_GetWorldRecord); CreateNative("Shavit_GetWRName", Native_GetWRName); CreateNative("Shavit_GetWRRecordID", Native_GetWRRecordID); CreateNative("Shavit_GetWRTime", Native_GetWRTime); @@ -161,9 +164,6 @@ public void OnPluginStart() gCV_RecordsLimit = CreateConVar("shavit_wr_recordlimit", "50", "Limit of records shown in the WR menu.\nAdvised to not set above 1,000 because scrolling through so many pages is useless.\n(And can also cause the command to take long time to run)", 0, true, 1.0); gCV_RecentLimit = CreateConVar("shavit_wr_recentlimit", "50", "Limit of records shown in the RR menu.", 0, true, 1.0); - gCV_RecordsLimit.AddChangeHook(OnConVarChanged); - gCV_RecentLimit.AddChangeHook(OnConVarChanged); - AutoExecConfig(); // admin menu @@ -182,12 +182,6 @@ public void OnPluginStart() SQL_SetPrefix(); } -public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) -{ - gI_RecordsLimit = gCV_RecordsLimit.IntValue; - gI_RecentLimit = gCV_RecentLimit.IntValue; -} - public void OnAdminMenuCreated(Handle topmenu) { if(gH_AdminMenu == null || (topmenu == gH_AdminMenu && gH_TimerCommands != INVALID_TOPMENUOBJECT)) @@ -384,8 +378,8 @@ public void Shavit_OnStyleConfigLoaded(int styles) for(int i = 0; i < styles; i++) { Shavit_GetStyleSettings(i, gA_StyleSettings[i]); - Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i][sStyleName], 128); - Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i][sShortName], 128); + Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName)); + Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i].sShortName, sizeof(stylestrings_t::sShortName)); } // arrays @@ -416,15 +410,17 @@ public void Shavit_OnStyleConfigLoaded(int styles) public void Shavit_OnChatConfigLoaded() { - for(int i = 0; i < CHATSETTINGS_SIZE; i++) - { - Shavit_GetChatStrings(i, gS_ChatStrings[i], 128); - } + Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); } public void OnClientPutInServer(int client) { - gB_PendingMenu[client] = false; + gA_WRCache[client].bPendingMenu = false; for(int i = 0; i < gI_Styles; i++) { @@ -534,7 +530,7 @@ public void SQL_UpdateWRCache_Callback(Database db, DBResultSet results, const c { int style = results.FetchInt(0); - if(style >= gI_Styles || style < 0 || gA_StyleSettings[style][bUnranked]) + if(style >= gI_Styles || style < 0 || gA_StyleSettings[style].bUnranked) { continue; } @@ -550,6 +546,11 @@ public void SQL_UpdateWRCache_Callback(Database db, DBResultSet results, const c UpdateLeaderboards(); } +public int Native_GetWorldRecord(Handle handler, int numParams) +{ + return view_as(gF_WRTime[GetNativeCell(1)][GetNativeCell(2)]); +} + public int Native_GetWRTime(Handle handler, int numParams) { SetNativeCellRef(2, gF_WRTime[GetNativeCell(1)][GetNativeCell(3)]); @@ -565,6 +566,11 @@ public int Native_GetWRName(Handle handler, int numParams) SetNativeString(2, gS_WRName[GetNativeCell(1)][GetNativeCell(4)], GetNativeCell(3)); } +public int Native_GetClientPB(Handle handler, int numParams) +{ + return view_as(gF_PlayerRecord[GetNativeCell(1)][GetNativeCell(2)][GetNativeCell(3)]); +} + public int Native_GetPlayerPB(Handle handler, int numParams) { SetNativeCellRef(3, gF_PlayerRecord[GetNativeCell(1)][GetNativeCell(2)][GetNativeCell(4)]); @@ -721,7 +727,7 @@ public int MenuHandler_Delete_First(Menu menu, MenuAction action, int param1, in { char info[16]; menu.GetItem(param2, info, 16); - gI_LastTrack[param1] = StringToInt(info); + gA_WRCache[param1].iLastTrack = StringToInt(info); DeleteSubmenu(param1); } @@ -745,9 +751,9 @@ void DeleteSubmenu(int client) IntToString(i, sInfo, 8); char sDisplay[64]; - FormatEx(sDisplay, 64, "%s (%T: %d)", gS_StyleStrings[i][sStyleName], "WRRecord", client, gI_RecordAmount[i][gI_LastTrack[client]]); + FormatEx(sDisplay, 64, "%s (%T: %d)", gS_StyleStrings[i].sStyleName, "WRRecord", client, gI_RecordAmount[i][gA_WRCache[client].iLastTrack]); - menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][gI_LastTrack[client]] > 0)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); + menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][gA_WRCache[client].iLastTrack] > 0)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); } menu.ExitButton = true; @@ -794,7 +800,7 @@ public int MenuHandler_DeleteAll_First(Menu menu, MenuAction action, int param1, { char info[16]; menu.GetItem(param2, info, 16); - gI_LastTrack[param1] = StringToInt(info); + gA_WRCache[param1].iLastTrack = StringToInt(info); DeleteAllSubmenu(param1); } @@ -810,7 +816,7 @@ public int MenuHandler_DeleteAll_First(Menu menu, MenuAction action, int param1, void DeleteAllSubmenu(int client) { char sTrack[32]; - GetTrackName(client, gI_LastTrack[client], sTrack, 32); + GetTrackName(client, gA_WRCache[client].iLastTrack, sTrack, 32); Menu menu = new Menu(MenuHandler_DeleteAll); menu.SetTitle("%T\n ", "DeleteAllRecordsMenuTitle", client, gS_Map, sTrack); @@ -851,12 +857,12 @@ public int MenuHandler_DeleteAll(Menu menu, MenuAction action, int param1, int p } char sTrack[32]; - GetTrackName(LANG_SERVER, gI_LastTrack[param1], sTrack, 32); + GetTrackName(LANG_SERVER, gA_WRCache[param1].iLastTrack, sTrack, 32); Shavit_LogMessage("%L - deleted all %s track records from map `%s`.", param1, sTrack, gS_Map); char sQuery[256]; - FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s' AND track = %d;", gS_MySQLPrefix, gS_Map, gI_LastTrack[param1]); + FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s' AND track = %d;", gS_MySQLPrefix, gS_Map, gA_WRCache[param1].iLastTrack); gH_SQL.Query(DeleteAll_Callback, sQuery, GetClientSerial(param1), DBPrio_High); } @@ -881,7 +887,7 @@ public Action Command_DeleteStyleRecords(int client, int args) for(int i = 0; i < gI_Styles; i++) { - if(gA_StyleSettings[i][bUnranked]) + if(gA_StyleSettings[i].bUnranked) { continue; } @@ -890,7 +896,7 @@ public Action Command_DeleteStyleRecords(int client, int args) IntToString(i, sInfo, 8); char sDisplay[64]; - FormatEx(sDisplay, 64, "%s (%d %T)", gS_StyleStrings[i][sStyleName], gI_RecordAmount[i], "WRRecord", client); + FormatEx(sDisplay, 64, "%s (%d %T)", gS_StyleStrings[i].sStyleName, gI_RecordAmount[i], "WRRecord", client); int iTotalAmount = 0; @@ -938,7 +944,7 @@ public int MenuHandler_DeleteStyleRecords(Menu menu, MenuAction action, int para char sMenuItem[128]; Menu submenu = new Menu(MenuHandler_DeleteStyleRecords_Confirm); - submenu.SetTitle("%T\n ", "DeleteConfirmStyle", param1, gS_StyleStrings[style][sStyleName]); + submenu.SetTitle("%T\n ", "DeleteConfirmStyle", param1, gS_StyleStrings[style].sStyleName); for(int i = 1; i <= GetRandomInt(1, 4); i++) { @@ -946,7 +952,7 @@ public int MenuHandler_DeleteStyleRecords(Menu menu, MenuAction action, int para submenu.AddItem("-1", sMenuItem); } - FormatEx(sMenuItem, 128, "%T", "MenuResponseYesStyle", param1, gS_StyleStrings[style][sStyleName]); + FormatEx(sMenuItem, 128, "%T", "MenuResponseYesStyle", param1, gS_StyleStrings[style].sStyleName); IntToString(style, info, 16); submenu.AddItem(info, sMenuItem); @@ -985,7 +991,7 @@ public int MenuHandler_DeleteStyleRecords_Confirm(Menu menu, MenuAction action, return 0; } - Shavit_LogMessage("%L - deleted all %s style records from map `%s`.", param1, gS_StyleStrings[style][sStyleName], gS_Map); + Shavit_LogMessage("%L - deleted all %s style records from map `%s`.", param1, gS_StyleStrings[style].sStyleName, gS_Map); char sQuery[256]; FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s' AND style = %d;", gS_MySQLPrefix, gS_Map, style); @@ -1033,7 +1039,7 @@ public void DeleteStyleRecords_Callback(Database db, DBResultSet results, const return; } - Shavit_PrintToChat(client, "%T", "DeletedRecordsStyle", client, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "DeletedRecordsStyle", client, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText); } public int MenuHandler_Delete(Menu menu, MenuAction action, int param1, int param2) @@ -1060,7 +1066,7 @@ void OpenDelete(int client, int style) { char sQuery[512]; - FormatEx(sQuery, 512, "SELECT p.id, u.name, p.time, p.jumps FROM %splayertimes p JOIN %susers u ON p.auth = u.auth WHERE map = '%s' AND style = %d AND track = %d ORDER BY time ASC, date ASC LIMIT 1000;", gS_MySQLPrefix, gS_MySQLPrefix, gS_Map, style, gI_LastTrack[client]); + FormatEx(sQuery, 512, "SELECT p.id, u.name, p.time, p.jumps FROM %splayertimes p JOIN %susers u ON p.auth = u.auth WHERE map = '%s' AND style = %d AND track = %d ORDER BY time ASC, date ASC LIMIT 1000;", gS_MySQLPrefix, gS_MySQLPrefix, gS_Map, style, gA_WRCache[client].iLastTrack); DataPack datapack = new DataPack(); datapack.WriteCell(GetClientSerial(client)); datapack.WriteCell(style); @@ -1088,7 +1094,7 @@ public void SQL_OpenDelete_Callback(Database db, DBResultSet results, const char } Menu menu = new Menu(OpenDelete_Handler); - menu.SetTitle("%t", "ListClientRecords", gS_Map, gS_StyleStrings[style][sStyleName]); + menu.SetTitle("%t", "ListClientRecords", gS_Map, gS_StyleStrings[style].sStyleName); int iCount = 0; @@ -1199,7 +1205,7 @@ public int DeleteConfirm_Handler(Menu menu, MenuAction action, int param1, int p for(int i = 0; i < gI_Styles; i++) { - if(gA_StyleSettings[i][bUnranked]) + if(gA_StyleSettings[i].bUnranked) { continue; } @@ -1287,7 +1293,7 @@ public void DeleteAll_Callback(Database db, DBResultSet results, const char[] er for(int i = 0; i < gI_Styles; i++) { - if(gA_StyleSettings[i][bUnranked]) + if(gA_StyleSettings[i].bUnranked) { continue; } @@ -1295,11 +1301,11 @@ public void DeleteAll_Callback(Database db, DBResultSet results, const char[] er Call_StartForward(gH_OnWRDeleted); Call_PushCell(i); Call_PushCell(-1); - Call_PushCell(gI_LastTrack[client]); + Call_PushCell(gA_WRCache[client].iLastTrack); Call_Finish(); } - Shavit_PrintToChat(client, "%T", "DeletedRecordsMap", client, gS_ChatStrings[sMessageVariable], gS_Map, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "DeletedRecordsMap", client, gS_ChatStrings.sVariable, gS_Map, gS_ChatStrings.sText); } public Action Command_WorldRecord(int client, int args) @@ -1311,13 +1317,13 @@ public Action Command_WorldRecord(int client, int args) if(args == 0) { - strcopy(gS_ClientMap[client], 128, gS_Map); + strcopy(gA_WRCache[client].sClientMap, 128, gS_Map); } else { - GetCmdArgString(gS_ClientMap[client], 128); - GuessBestMapName(gS_ClientMap[client], gS_ClientMap[client], 128); + GetCmdArgString(gA_WRCache[client].sClientMap, 128); + GuessBestMapName(gA_WRCache[client].sClientMap, gA_WRCache[client].sClientMap, 128); } return ShowWRStyleMenu(client, Track_Main); @@ -1332,13 +1338,13 @@ public Action Command_WorldRecord_Bonus(int client, int args) if(args == 0) { - strcopy(gS_ClientMap[client], 128, gS_Map); + strcopy(gA_WRCache[client].sClientMap, 128, gS_Map); } else { - GetCmdArgString(gS_ClientMap[client], 128); - GuessBestMapName(gS_ClientMap[client], gS_ClientMap[client], 128); + GetCmdArgString(gA_WRCache[client].sClientMap, 128); + GuessBestMapName(gA_WRCache[client].sClientMap, gA_WRCache[client].sClientMap, 128); } return ShowWRStyleMenu(client, Track_Bonus); @@ -1346,14 +1352,14 @@ public Action Command_WorldRecord_Bonus(int client, int args) Action ShowWRStyleMenu(int client, int track) { - gI_LastTrack[client] = track; + gA_WRCache[client].iLastTrack = track; Menu menu = new Menu(MenuHandler_StyleChooser); menu.SetTitle("%T", "WRMenuTitle", client); for(int i = 0; i < gI_Styles; i++) { - if(gA_StyleSettings[i][bUnranked]) + if(gA_StyleSettings[i].bUnranked) { continue; } @@ -1363,20 +1369,20 @@ Action ShowWRStyleMenu(int client, int track) char sDisplay[64]; - if(StrEqual(gS_ClientMap[client], gS_Map) && gF_WRTime[i][track] > 0.0) + if(StrEqual(gA_WRCache[client].sClientMap, gS_Map) && gF_WRTime[i][track] > 0.0) { char sTime[32]; FormatSeconds(gF_WRTime[i][track], sTime, 32, false); - FormatEx(sDisplay, 64, "%s - WR: %s", gS_StyleStrings[i][sStyleName], sTime); + FormatEx(sDisplay, 64, "%s - WR: %s", gS_StyleStrings[i].sStyleName, sTime); } else { - strcopy(sDisplay, 64, gS_StyleStrings[i][sStyleName]); + strcopy(sDisplay, 64, gS_StyleStrings[i].sStyleName); } - menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][track] > 0 || !StrEqual(gS_ClientMap[client], gS_Map))? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); + menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][track] > 0 || !StrEqual(gA_WRCache[client].sClientMap, gS_Map))? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); } // should NEVER happen @@ -1409,14 +1415,14 @@ public int MenuHandler_StyleChooser(Menu menu, MenuAction action, int param1, in if(iStyle == -1) { - Shavit_PrintToChat(param1, "%T", "NoStyles", param1, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(param1, "%T", "NoStyles", param1, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return 0; } - gBS_LastWR[param1] = iStyle; + gA_WRCache[param1].iLastStyle = iStyle; - StartWRMenu(param1, gS_ClientMap[param1], iStyle, gI_LastTrack[param1]); + StartWRMenu(param1, gA_WRCache[param1].sClientMap, iStyle, gA_WRCache[param1].iLastTrack); } else if(action == MenuAction_End) @@ -1478,7 +1484,7 @@ public void SQL_WR_Callback(Database db, DBResultSet results, const char[] error while(results.FetchRow()) { - if(++iCount <= gI_RecordsLimit) + if(++iCount <= gCV_RecordsLimit.IntValue) { // 0 - record id, for statistic purposes. int id = results.FetchInt(0); @@ -1525,12 +1531,13 @@ public void SQL_WR_Callback(Database db, DBResultSet results, const char[] error else { + int iStyle = gA_WRCache[client].iLastStyle; int iRecords = results.RowCount; // [32] just in case there are 150k records on a map and you're ranked 100k or something char sRanks[32]; - if(gF_PlayerRecord[client][gBS_LastWR[client]][track] == 0.0 || iMyRank == 0) + if(gF_PlayerRecord[client][iStyle][track] == 0.0 || iMyRank == 0) { FormatEx(sRanks, 32, "(%d %T)", iRecords, "WRRecord", client); } @@ -1566,13 +1573,13 @@ public int WRMenu_Handler(Menu menu, MenuAction action, int param1, int param2) else { - ShowWRStyleMenu(param1, gI_LastTrack[param1]); + ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack); } } else if(action == MenuAction_Cancel && param2 == MenuCancel_ExitBack) { - ShowWRStyleMenu(param1, gI_LastTrack[param1]); + ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack); } else if(action == MenuAction_End) @@ -1585,7 +1592,7 @@ public int WRMenu_Handler(Menu menu, MenuAction action, int param1, int param2) public Action Command_RecentRecords(int client, int args) { - if(gB_PendingMenu[client] || !IsValidClient(client)) + if(gA_WRCache[client].bPendingMenu || !IsValidClient(client)) { return Plugin_Handled; } @@ -1600,7 +1607,7 @@ public Action Command_RecentRecords(int client, int args) gH_SQL.Query(SQL_RR_Callback, sQuery, GetClientSerial(client), DBPrio_Low); - gB_PendingMenu[client] = true; + gA_WRCache[client].bPendingMenu = true; return Plugin_Handled; } @@ -1609,7 +1616,7 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error { int client = GetClientFromSerial(data); - gB_PendingMenu[client] = false; + gA_WRCache[client].bPendingMenu = false; if(results == null) { @@ -1624,7 +1631,7 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error } Menu menu = new Menu(RRMenu_Handler); - menu.SetTitle("%T:", "RecentRecords", client, gI_RecentLimit); + menu.SetTitle("%T:", "RecentRecords", client, gCV_RecentLimit.IntValue); while(results.FetchRow()) { @@ -1654,12 +1661,12 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error if(gB_Rankings && fPoints > 0.0) { - FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%.03f %T)", gS_StyleStrings[style][sShortName], sTrack[0], sMap, sName, sTime, fPoints, "WRPoints", client); + FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%.03f %T)", gS_StyleStrings[style].sShortName, sTrack[0], sMap, sName, sTime, fPoints, "WRPoints", client); } else { - FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%d %T)", gS_StyleStrings[style][sShortName], sTrack[0], sMap, sName, sTime, jumps, "WRJumps", client); + FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%d %T)", gS_StyleStrings[style].sShortName, sTrack[0], sMap, sName, sTime, jumps, "WRJumps", client); } char sInfo[192]; @@ -1679,37 +1686,37 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error menu.Display(client, 60); } -public int RRMenu_Handler(Menu m, MenuAction action, int param1, int param2) +public int RRMenu_Handler(Menu menu, MenuAction action, int param1, int param2) { if(action == MenuAction_Select) { char sInfo[128]; - m.GetItem(param2, sInfo, 128); + menu.GetItem(param2, sInfo, 128); if(StringToInt(sInfo) != -1) { char sExploded[2][128]; ExplodeString(sInfo, ";", sExploded, 2, 128, true); - strcopy(gS_ClientMap[param1], 128, sExploded[1]); + strcopy(gA_WRCache[param1].sClientMap, 128, sExploded[1]); OpenSubMenu(param1, StringToInt(sExploded[0])); } else { - ShowWRStyleMenu(param1, gI_LastTrack[param1]); + ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack); } } else if(action == MenuAction_Cancel && param2 == MenuCancel_ExitBack) { - ShowWRStyleMenu(param1, gI_LastTrack[param1]); + ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack); } else if(action == MenuAction_End) { - delete m; + delete menu; } return 0; @@ -1773,7 +1780,7 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] int jumps = results.FetchInt(2); float perfs = results.FetchFloat(9); - if(gA_StyleSettings[style][bAutobhop] && perfs > 0.0) + if(gA_StyleSettings[style].bAutobhop && perfs > 0.0) { FormatEx(sDisplay, 128, "%T: %d", "WRJumps", client, jumps); } @@ -1786,7 +1793,7 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] menu.AddItem("-1", sDisplay); // 3 - style - FormatEx(sDisplay, 128, "%T: %s", "WRStyle", client, gS_StyleStrings[style][sStyleName]); + FormatEx(sDisplay, 128, "%T: %s", "WRStyle", client, gS_StyleStrings[style].sStyleName); menu.AddItem("-1", sDisplay); // 6 - map @@ -1867,12 +1874,12 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] menu.Display(client, 20); } -public int SubMenu_Handler(Menu m, MenuAction action, int param1, int param2) +public int SubMenu_Handler(Menu menu, MenuAction action, int param1, int param2) { if(action == MenuAction_Select) { char sInfo[32]; - m.GetItem(param2, sInfo, 32); + menu.GetItem(param2, sInfo, 32); if(gB_Stats && StringToInt(sInfo) != -1) { @@ -1897,18 +1904,18 @@ public int SubMenu_Handler(Menu m, MenuAction action, int param1, int param2) else { - StartWRMenu(param1, gS_ClientMap[param1], gBS_LastWR[param1], gI_LastTrack[param1]); + StartWRMenu(param1, gA_WRCache[param1].sClientMap, gA_WRCache[param1].iLastStyle, gA_WRCache[param1].iLastTrack); } } else if(action == MenuAction_Cancel && param2 == MenuCancel_ExitBack) { - StartWRMenu(param1, gS_ClientMap[param1], gBS_LastWR[param1], gI_LastTrack[param1]); + StartWRMenu(param1, gA_WRCache[param1].sClientMap, gA_WRCache[param1].iLastStyle, gA_WRCache[param1].iLastTrack); } else if(action == MenuAction_End) { - delete m; + delete menu; } return 0; @@ -2155,7 +2162,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st // 2 - update int overwrite = 0; - if(gA_StyleSettings[style][bUnranked] || Shavit_IsPracticeMode(client)) + if(gA_StyleSettings[style].bUnranked || Shavit_IsPracticeMode(client)) { overwrite = 0; // ugly way of not writing to database } @@ -2221,7 +2228,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st FormatSeconds(fDifference, sDifference, 16, true); char sSync[32]; // 32 because colors - FormatEx(sSync, 32, (sync != -1.0)? " @ %s%.02f%%":"", gS_ChatStrings[sMessageVariable], sync); + FormatEx(sSync, 32, (sync != -1.0)? " @ %s%.02f%%":"", gS_ChatStrings.sVariable, sync); if(overwrite > 0) { @@ -2232,7 +2239,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st if(overwrite == 1) // insert { - Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "FirstCompletion", LANG_SERVER, gS_ChatStrings[sMessageVariable2], client, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], iRank, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText]); + Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "FirstCompletion", LANG_SERVER, gS_ChatStrings.sVariable2, client, gS_ChatStrings.sText, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, gS_ChatStrings.sVariable, iRank, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText); if(gH_SQL == null) { @@ -2244,7 +2251,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st else // update { - Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "NotFirstCompletion", LANG_SERVER, gS_ChatStrings[sMessageVariable2], client, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], iRank, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageWarning], sDifference); + Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "NotFirstCompletion", LANG_SERVER, gS_ChatStrings.sVariable2, client, gS_ChatStrings.sText, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, gS_ChatStrings.sVariable, iRank, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText, gS_ChatStrings.sWarning, sDifference); FormatEx(sQuery, 512, "UPDATE %splayertimes SET time = %.03f, jumps = %d, date = %d, strafes = %d, sync = %.02f, points = 0.0, perfs = %.2f WHERE map = '%s' AND auth = '%s' AND style = %d AND track = %d;", gS_MySQLPrefix, time, jumps, GetTime(), strafes, sync, perfs, gS_Map, sAuthID, style, track); } @@ -2268,14 +2275,14 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st gF_PlayerRecord[client][style][track] = time; } - else if(overwrite == 0 && !gA_StyleSettings[style][bUnranked]) + else if(overwrite == 0 && !gA_StyleSettings[style].bUnranked) { - Shavit_PrintToChat(client, "%s[%s]%s %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "WorseTime", client, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText], sDifference); + Shavit_PrintToChat(client, "%s[%s]%s %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "WorseTime", client, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText, sDifference); } else { - Shavit_PrintToChat(client, "%s[%s]%s] %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "UnrankedTime", client, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%s[%s]%s] %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "UnrankedTime", client, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText); } } @@ -2329,7 +2336,7 @@ public void SQL_UpdateLeaderboards_Callback(Database db, DBResultSet results, co int style = results.FetchInt(0); int track = results.FetchInt(2); - if(style >= gI_Styles || gA_StyleSettings[style][bUnranked] || track >= TRACKS_SIZE) + if(style >= gI_Styles || gA_StyleSettings[style].bUnranked || track >= TRACKS_SIZE) { continue; } @@ -2339,7 +2346,7 @@ public void SQL_UpdateLeaderboards_Callback(Database db, DBResultSet results, co for(int i = 0; i < gI_Styles; i++) { - if(i >= gI_Styles || gA_StyleSettings[i][bUnranked]) + if(i >= gI_Styles || gA_StyleSettings[i].bUnranked) { continue; } diff --git a/addons/sourcemod/scripting/shavit-zones.sp b/addons/sourcemod/scripting/shavit-zones.sp index 97434169..541adb12 100644 --- a/addons/sourcemod/scripting/shavit-zones.sp +++ b/addons/sourcemod/scripting/shavit-zones.sp @@ -57,16 +57,24 @@ char gS_ZoneNames[][] = "Slide Zone" // allows players to slide, in order to fix parts like the 5th stage of bhop_arcane }; -enum +enum struct zone_cache_t { - bVisible, - iRed, - iGreen, - iBlue, - iAlpha, - fWidth, - bFlatZone, - ZONESETTINGS_SIZE + bool bZoneInitialized; + int iZoneType; + int iZoneTrack; // 0 - main, 1 - bonus + int iEntityID; + int iDatabaseID; +} + +enum struct zone_settings_t +{ + bool bVisible; + int iRed; + int iGreen; + int iBlue; + int iAlpha; + float fWidth; + bool bFlatZone; } int gI_ZoneType[MAXPLAYERS+1]; @@ -96,8 +104,8 @@ int gI_ZoneTrack[MAXPLAYERS+1]; int gI_ZoneDatabaseID[MAXPLAYERS+1]; // zone cache -any gA_ZoneSettings[ZONETYPES_SIZE][TRACKS_SIZE][ZONESETTINGS_SIZE]; -any gA_ZoneCache[MAX_ZONES][ZONECACHE_SIZE]; // Vectors will not be inside this array. +zone_settings_t gA_ZoneSettings[ZONETYPES_SIZE][TRACKS_SIZE]; +zone_cache_t gA_ZoneCache[MAX_ZONES]; // Vectors will not be inside this array. int gI_MapZones = 0; float gV_MapZones[MAX_ZONES][2][3]; float gV_MapZones_Visual[MAX_ZONES][8][3]; @@ -127,15 +135,6 @@ ConVar gCV_Height = null; ConVar gCV_Offset = null; ConVar gCV_EnforceTracks = null; -// cached cvars -float gF_Interval = 1.0; -bool gB_TeleportToStart = true; -bool gB_TeleportToEnd = true; -bool gB_UseCustomSprite = true; -float gF_Height = 128.0; -float gF_Offset = 0.5; -bool gB_EnforceTracks = true; - // handles Handle gH_DrawEverything = null; @@ -143,7 +142,7 @@ Handle gH_DrawEverything = null; char gS_MySQLPrefix[32]; // chat settings -char gS_ChatStrings[CHATSETTINGS_SIZE][128]; +chatstrings_t gS_ChatStrings; // forwards Handle gH_Forwards_EnterZone = null; @@ -239,12 +238,8 @@ public void OnPluginStart() gCV_EnforceTracks = CreateConVar("shavit_zones_enforcetracks", "1", "Enforce zone tracks upon entry?\n0 - allow every zone except for start/end to affect users on every zone.\n1- require the user's track to match the zone's track.", 0, true, 0.0, true, 1.0); gCV_Interval.AddChangeHook(OnConVarChanged); - gCV_TeleportToStart.AddChangeHook(OnConVarChanged); - gCV_TeleportToEnd.AddChangeHook(OnConVarChanged); gCV_UseCustomSprite.AddChangeHook(OnConVarChanged); - gCV_Height.AddChangeHook(OnConVarChanged); gCV_Offset.AddChangeHook(OnConVarChanged); - gCV_EnforceTracks.AddChangeHook(OnConVarChanged); AutoExecConfig(); @@ -261,13 +256,13 @@ public void OnPluginStart() { for(int j = 0; j < TRACKS_SIZE; j++) { - gA_ZoneSettings[i][j][bVisible] = true; - gA_ZoneSettings[i][j][iRed] = 255; - gA_ZoneSettings[i][j][iGreen] = 255; - gA_ZoneSettings[i][j][iBlue] = 255; - gA_ZoneSettings[i][j][iAlpha] = 255; - gA_ZoneSettings[i][j][fWidth] = 2.0; - gA_ZoneSettings[i][j][bFlatZone] = false; + gA_ZoneSettings[i][j].bVisible = true; + gA_ZoneSettings[i][j].iRed = 255; + gA_ZoneSettings[i][j].iGreen = 255; + gA_ZoneSettings[i][j].iBlue = 255; + gA_ZoneSettings[i][j].iAlpha = 255; + gA_ZoneSettings[i][j].fWidth = 2.0; + gA_ZoneSettings[i][j].bFlatZone = false; } } @@ -284,25 +279,17 @@ public void OnPluginStart() public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) { - gF_Interval = gCV_Interval.FloatValue; - gB_TeleportToStart = gCV_TeleportToStart.BoolValue; - gB_UseCustomSprite = gCV_UseCustomSprite.BoolValue; - gB_TeleportToEnd = gCV_TeleportToEnd.BoolValue; - gF_Height = gCV_Height.FloatValue; - gF_Offset = gCV_Offset.FloatValue; - gB_EnforceTracks = gCV_EnforceTracks.BoolValue; - if(convar == gCV_Interval) { delete gH_DrawEverything; - gH_DrawEverything = CreateTimer(gF_Interval, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); + gH_DrawEverything = CreateTimer(gCV_Interval.FloatValue, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); } else if(convar == gCV_Offset && gI_MapZones > 0) { for(int i = 0; i < gI_MapZones; i++) { - if(!gA_ZoneCache[i][bZoneInitialized]) + if(!gA_ZoneCache[i].bZoneInitialized) { continue; } @@ -314,7 +301,7 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n gV_MapZones_Visual[i][7][1] = gV_MapZones[i][1][1]; gV_MapZones_Visual[i][7][2] = gV_MapZones[i][1][2]; - CreateZonePoints(gV_MapZones_Visual[i], gF_Offset); + CreateZonePoints(gV_MapZones_Visual[i], gCV_Offset.FloatValue); } } @@ -545,13 +532,13 @@ bool LoadZonesConfig() int index = (i % ZONETYPES_SIZE); - gA_ZoneSettings[index][track][bVisible] = view_as(kv.GetNum("visible", 1)); - gA_ZoneSettings[index][track][iRed] = kv.GetNum("red", 255); - gA_ZoneSettings[index][track][iGreen] = kv.GetNum("green", 255); - gA_ZoneSettings[index][track][iBlue] = kv.GetNum("blue", 255); - gA_ZoneSettings[index][track][iAlpha] = kv.GetNum("alpha", 255); - gA_ZoneSettings[index][track][fWidth] = kv.GetFloat("width", 2.0); - gA_ZoneSettings[index][track][bFlatZone] = view_as(kv.GetNum("flat", false)); + gA_ZoneSettings[index][track].bVisible = view_as(kv.GetNum("visible", 1)); + gA_ZoneSettings[index][track].iRed = kv.GetNum("red", 255); + gA_ZoneSettings[index][track].iGreen = kv.GetNum("green", 255); + gA_ZoneSettings[index][track].iBlue = kv.GetNum("blue", 255); + gA_ZoneSettings[index][track].iAlpha = kv.GetNum("alpha", 255); + gA_ZoneSettings[index][track].fWidth = kv.GetFloat("width", 2.0); + gA_ZoneSettings[index][track].bFlatZone = view_as(kv.GetNum("flat", false)); i++; } @@ -570,7 +557,7 @@ void LoadZoneSettings() SetFailState("Cannot open \"configs/shavit-zones.cfg\". Make sure this file exists and that the server has read permissions to it."); } - if(gB_UseCustomSprite) + if(gCV_UseCustomSprite.BoolValue) { gI_BeamSprite = PrecacheModel(gS_BeamSprite, true); gI_HaloSprite = 0; @@ -590,7 +577,6 @@ void LoadZoneSettings() gI_HaloSprite = PrecacheModel("sprites/glow01.vmt", true); } } - } public void OnMapStart() @@ -624,7 +610,7 @@ public void OnMapStart() // start drawing mapzones here if(gH_DrawEverything == null) { - gH_DrawEverything = CreateTimer(gF_Interval, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); + gH_DrawEverything = CreateTimer(gCV_Interval.FloatValue, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); } if(gB_Late) @@ -758,10 +744,12 @@ public void Frame_HookTrigger(any data) public void Shavit_OnChatConfigLoaded() { - for(int i = 0; i < CHATSETTINGS_SIZE; i++) - { - Shavit_GetChatStrings(i, gS_ChatStrings[i], 128); - } + Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix)); + Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText)); + Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning)); + Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable)); + Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2)); + Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle)); } void ClearZone(int index) @@ -774,11 +762,11 @@ void ClearZone(int index) gV_ZoneCenter[index][i] = 0.0; } - gA_ZoneCache[index][bZoneInitialized] = false; - gA_ZoneCache[index][iZoneType] = -1; - gA_ZoneCache[index][iZoneTrack] = -1; - gA_ZoneCache[index][iEntityID] = -1; - gA_ZoneCache[index][iDatabaseID] = -1; + gA_ZoneCache[index].bZoneInitialized = false; + gA_ZoneCache[index].iZoneType = -1; + gA_ZoneCache[index].iZoneTrack = -1; + gA_ZoneCache[index].iEntityID = -1; + gA_ZoneCache[index].iDatabaseID = -1; } void UnhookEntity(int entity) @@ -790,7 +778,7 @@ void UnhookEntity(int entity) void KillZoneEntity(int index) { - int entity = gA_ZoneCache[index][iEntityID]; + int entity = gA_ZoneCache[index].iEntityID; if(entity > MaxClients && IsValidEntity(entity)) { @@ -798,7 +786,7 @@ void KillZoneEntity(int index) { for(int j = 0; j < TRACKS_SIZE; j++) { - gB_InsideZone[i][gA_ZoneCache[index][iZoneType]][j] = false; + gB_InsideZone[i][gA_ZoneCache[index].iZoneType][j] = false; } gB_InsideZoneID[i][index] = false; @@ -829,7 +817,7 @@ void UnloadZones(int zone) { for(int i = 0; i < MAX_ZONES; i++) { - if((zone == 0 || gA_ZoneCache[i][iZoneType] == zone) && gA_ZoneCache[i][bZoneInitialized]) + if((zone == 0 || gA_ZoneCache[i].iZoneType == zone) && gA_ZoneCache[i].bZoneInitialized) { KillZoneEntity(i); ClearZone(i); @@ -901,7 +889,7 @@ public void SQL_RefreshZones_Callback(Database db, DBResultSet results, const ch gV_MapZones[gI_MapZones][1][1] = gV_MapZones_Visual[gI_MapZones][7][1] = results.FetchFloat(5); gV_MapZones[gI_MapZones][1][2] = gV_MapZones_Visual[gI_MapZones][7][2] = results.FetchFloat(6); - CreateZonePoints(gV_MapZones_Visual[gI_MapZones], gF_Offset); + CreateZonePoints(gV_MapZones_Visual[gI_MapZones], gCV_Offset.FloatValue); gV_ZoneCenter[gI_MapZones][0] = (gV_MapZones[gI_MapZones][0][0] + gV_MapZones[gI_MapZones][1][0]) / 2.0; gV_ZoneCenter[gI_MapZones][1] = (gV_MapZones[gI_MapZones][0][1] + gV_MapZones[gI_MapZones][1][1]) / 2.0; @@ -914,11 +902,11 @@ public void SQL_RefreshZones_Callback(Database db, DBResultSet results, const ch gV_Destinations[gI_MapZones][2] = results.FetchFloat(9); } - gA_ZoneCache[gI_MapZones][bZoneInitialized] = true; - gA_ZoneCache[gI_MapZones][iZoneType] = type; - gA_ZoneCache[gI_MapZones][iZoneTrack] = results.FetchInt(10); - gA_ZoneCache[gI_MapZones][iDatabaseID] = results.FetchInt(11); - gA_ZoneCache[gI_MapZones][iEntityID] = -1; + gA_ZoneCache[gI_MapZones].bZoneInitialized = true; + gA_ZoneCache[gI_MapZones].iZoneType = type; + gA_ZoneCache[gI_MapZones].iZoneTrack = results.FetchInt(10); + gA_ZoneCache[gI_MapZones].iDatabaseID = results.FetchInt(11); + gA_ZoneCache[gI_MapZones].iEntityID = -1; gI_MapZones++; } @@ -979,7 +967,7 @@ public Action Command_Modifier(int client, int args) gF_Modifier[client] = fArg1; - Shavit_PrintToChat(client, "%T %s%.01f%s.", "ModifierSet", client, gS_ChatStrings[sMessageVariable], fArg1, gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T %s%.01f%s.", "ModifierSet", client, gS_ChatStrings.sVariable, fArg1, gS_ChatStrings.sText); return Plugin_Handled; } @@ -1096,7 +1084,7 @@ public Action Command_Zones(int client, int args) if(!IsPlayerAlive(client)) { - Shavit_PrintToChat(client, "%T", "ZonesCommand", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "ZonesCommand", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); return Plugin_Handled; } @@ -1136,7 +1124,7 @@ Action OpenEditMenu(int client) for(int i = 0; i < sizeof(gS_ZoneNames); i++) { - if(!gA_ZoneCache[i][bZoneInitialized]) + if(!gA_ZoneCache[i].bZoneInitialized) { continue; } @@ -1145,9 +1133,9 @@ Action OpenEditMenu(int client) IntToString(i, sInfo, 8); char sTrack[32]; - GetTrackName(client, gA_ZoneCache[i][iZoneTrack], sTrack, 32); + GetTrackName(client, gA_ZoneCache[i].iZoneTrack, sTrack, 32); - FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i][iZoneType]], sTrack); + FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i].iZoneType], sTrack); if(gB_InsideZoneID[client][i]) { @@ -1196,13 +1184,13 @@ public int ZoneEdit_MenuHandler(Menu menu, MenuAction action, int param1, int pa gI_MapStep[param1] = 3; gV_Point1[param1] = gV_MapZones[id][0]; gV_Point2[param1] = gV_MapZones[id][1]; - gI_ZoneType[param1] = gA_ZoneCache[id][iZoneType]; - gI_ZoneTrack[param1] = gA_ZoneCache[id][iZoneTrack]; + gI_ZoneType[param1] = gA_ZoneCache[id].iZoneType; + gI_ZoneTrack[param1] = gA_ZoneCache[id].iZoneTrack; gV_Teleport[param1] = gV_Destinations[id]; - gI_ZoneDatabaseID[param1] = gA_ZoneCache[id][iDatabaseID]; + gI_ZoneDatabaseID[param1] = gA_ZoneCache[id].iDatabaseID; // to stop the original zone from drawing - gA_ZoneCache[id][bZoneInitialized] = false; + gA_ZoneCache[id].bZoneInitialized = false; // draw the zone edit CreateTimer(0.1, Timer_Draw, GetClientSerial(param1), TIMER_REPEAT); @@ -1241,12 +1229,12 @@ Action OpenDeleteMenu(int client) for(int i = 0; i < gI_MapZones; i++) { - if(gA_ZoneCache[i][bZoneInitialized]) + if(gA_ZoneCache[i].bZoneInitialized) { char sTrack[32]; - GetTrackName(client, gA_ZoneCache[i][iZoneTrack], sTrack, 32); + GetTrackName(client, gA_ZoneCache[i].iZoneTrack, sTrack, 32); - FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i][iZoneType]], sTrack); + FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i].iZoneType], sTrack); char sInfo[8]; IntToString(i, sInfo, 8); @@ -1296,14 +1284,14 @@ public int DeleteZone_MenuHandler(Menu menu, MenuAction action, int param1, int default: { - Shavit_LogMessage("%L - deleted %s (id %d) from map `%s`.", param1, gS_ZoneNames[gA_ZoneCache[id][iZoneType]], gA_ZoneCache[id][iDatabaseID], gS_Map); + Shavit_LogMessage("%L - deleted %s (id %d) from map `%s`.", param1, gS_ZoneNames[gA_ZoneCache[id].iZoneType], gA_ZoneCache[id].iDatabaseID, gS_Map); char sQuery[256]; - FormatEx(sQuery, 256, "DELETE FROM %smapzones WHERE %s = %d;", gS_MySQLPrefix, (gB_MySQL)? "id":"rowid", gA_ZoneCache[id][iDatabaseID]); + FormatEx(sQuery, 256, "DELETE FROM %smapzones WHERE %s = %d;", gS_MySQLPrefix, (gB_MySQL)? "id":"rowid", gA_ZoneCache[id].iDatabaseID); DataPack hDatapack = new DataPack(); hDatapack.WriteCell(GetClientSerial(param1)); - hDatapack.WriteCell(gA_ZoneCache[id][iZoneType]); + hDatapack.WriteCell(gA_ZoneCache[id].iZoneType); gH_SQL.Query(SQL_DeleteZone_Callback, sQuery, hDatapack); } @@ -1341,7 +1329,7 @@ public void SQL_DeleteZone_Callback(Database db, DBResultSet results, const char return; } - Shavit_PrintToChat(client, "%T", "ZoneDeleteSuccessful", client, gS_ChatStrings[sMessageVariable], gS_ZoneNames[type], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "ZoneDeleteSuccessful", client, gS_ChatStrings.sVariable, gS_ZoneNames[type], gS_ChatStrings.sText); } public Action Command_DeleteAllZones(int client, int args) @@ -1656,7 +1644,7 @@ public bool TraceFilter_World(int entity, int contentsMask) return (entity == 0); } -public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, any stylesettings[STYLESETTINGS_SIZE]) +public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, stylesettings_t stylesettings) { if(gI_MapStep[client] > 0 && gI_MapStep[client] != 3) { @@ -1698,7 +1686,7 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float else if(gI_MapStep[client] == 2) { - origin[2] += gF_Height; + origin[2] += gCV_Height.FloatValue; gV_Point2[client] = origin; gI_MapStep[client]++; @@ -1716,7 +1704,7 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float } } - if(InsideZone(client, Zone_Slide, (gB_EnforceTracks)? track:-1) && GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1) + if(InsideZone(client, Zone_Slide, (gCV_EnforceTracks.BoolValue)? track:-1) && GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1) { // trace down, see if there's 8 distance or less to ground float fPosition[3]; @@ -1949,7 +1937,7 @@ public int ZoneAdjuster_Handler(Menu menu, MenuAction action, int param1, int pa bool bIncrease = view_as(StringToInt(sExploded[2]) == 1); ((iPoint == 1)? gV_Point1:gV_Point2)[param1][iAxis] += ((bIncrease)? gF_Modifier[param1]:-gF_Modifier[param1]); - Shavit_PrintToChat(param1, "%T", (bIncrease)? "ZoneSizeIncrease":"ZoneSizeDecrease", param1, gS_ChatStrings[sMessageVariable2], sAxis[iAxis], gS_ChatStrings[sMessageText], iPoint, gS_ChatStrings[sMessageVariable], gF_Modifier[param1], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(param1, "%T", (bIncrease)? "ZoneSizeIncrease":"ZoneSizeDecrease", param1, gS_ChatStrings.sVariable2, sAxis[iAxis], gS_ChatStrings.sText, iPoint, gS_ChatStrings.sVariable, gF_Modifier[param1], gS_ChatStrings.sText); CreateAdjustMenu(param1, GetMenuSelectionPosition()); } @@ -1994,9 +1982,9 @@ void InsertZone(int client) { for(int i = 0; i < gI_MapZones; i++) { - if(gA_ZoneCache[i][bZoneInitialized] && gA_ZoneCache[i][iZoneType] == type && gA_ZoneCache[i][iZoneTrack] == gI_ZoneTrack[client]) + if(gA_ZoneCache[i].bZoneInitialized && gA_ZoneCache[i].iZoneType == type && gA_ZoneCache[i].iZoneTrack == gI_ZoneTrack[client]) { - gI_ZoneDatabaseID[client] = gA_ZoneCache[i][iDatabaseID]; + gI_ZoneDatabaseID[client] = gA_ZoneCache[i].iDatabaseID; } } } @@ -2051,18 +2039,18 @@ public Action Timer_DrawEverything(Handle Timer) for(int i = iCycle; i < gI_MapZones; i++) { - if(gA_ZoneCache[i][bZoneInitialized]) + if(gA_ZoneCache[i].bZoneInitialized) { - int type = gA_ZoneCache[i][iZoneType]; - int track = gA_ZoneCache[i][iZoneTrack]; + int type = gA_ZoneCache[i].iZoneType; + int track = gA_ZoneCache[i].iZoneTrack; - if(gA_ZoneSettings[type][track][bVisible]) + if(gA_ZoneSettings[type][track].bVisible) { DrawZone(gV_MapZones_Visual[i], GetZoneColors(type, track), - RoundToCeil(float(gI_MapZones) / iMaxZonesPerFrame) * gF_Interval, - gA_ZoneSettings[type][track][fWidth], - gA_ZoneSettings[type][track][bFlatZone], + RoundToCeil(float(gI_MapZones) / iMaxZonesPerFrame) * gCV_Interval.FloatValue, + gA_ZoneSettings[type][track].fWidth, + gA_ZoneSettings[type][track].bFlatZone, gV_ZoneCenter[i]); } } @@ -2081,10 +2069,10 @@ public Action Timer_DrawEverything(Handle Timer) int[] GetZoneColors(int type, int track, int customalpha = 0) { int colors[4]; - colors[0] = gA_ZoneSettings[type][track][iRed]; - colors[1] = gA_ZoneSettings[type][track][iGreen]; - colors[2] = gA_ZoneSettings[type][track][iBlue]; - colors[3] = (customalpha > 0)? customalpha:gA_ZoneSettings[type][track][iAlpha]; + colors[0] = gA_ZoneSettings[type][track].iRed; + colors[1] = gA_ZoneSettings[type][track].iGreen; + colors[2] = gA_ZoneSettings[type][track].iBlue; + colors[3] = (customalpha > 0)? customalpha:gA_ZoneSettings[type][track].iAlpha; return colors; } @@ -2122,7 +2110,7 @@ public Action Timer_Draw(Handle Timer, any data) if(gI_MapStep[client] == 1 || gV_Point2[client][0] == 0.0) { - origin[2] = (vPlayerOrigin[2] + gF_Height); + origin[2] = (vPlayerOrigin[2] + gCV_Height.FloatValue); } else @@ -2135,7 +2123,7 @@ public Action Timer_Draw(Handle Timer, any data) float points[8][3]; points[0] = gV_Point1[client]; points[7] = origin; - CreateZonePoints(points, gF_Offset); + CreateZonePoints(points, gCV_Offset.FloatValue); // This is here to make the zone setup grid snapping be 1:1 to how it looks when done with the setup. origin = points[7]; @@ -2143,7 +2131,7 @@ public Action Timer_Draw(Handle Timer, any data) int type = gI_ZoneType[client]; int track = gI_ZoneTrack[client]; - DrawZone(points, GetZoneColors(type, track, 125), 0.1, gA_ZoneSettings[type][track][fWidth], false, origin); + DrawZone(points, GetZoneColors(type, track, 125), 0.1, gA_ZoneSettings[type][track].fWidth, false, origin); if(gI_ZoneType[client] == Zone_Teleport && !EmptyVector(gV_Teleport[client])) { @@ -2154,7 +2142,7 @@ public Action Timer_Draw(Handle Timer, any data) if(gI_MapStep[client] != 3 && !EmptyVector(origin)) { - origin[2] -= gF_Height; + origin[2] -= gCV_Height.FloatValue; TE_SetupBeamPoints(vPlayerOrigin, origin, gI_BeamSprite, gI_HaloSprite, 0, 0, 0.1, 1.0, 1.0, 0, 0.0, {255, 255, 255, 75}, 0); TE_SendToAll(0.0); @@ -2424,7 +2412,7 @@ public void SQL_AlterTable2_Callback(Database db, DBResultSet results, const cha public void Shavit_OnRestart(int client, int track) { - if(gB_TeleportToStart) + if(gCV_TeleportToStart.BoolValue) { // custom spawns if(!EmptyVector(gF_CustomSpawn[track])) @@ -2470,7 +2458,7 @@ public void Shavit_OnRestart(int client, int track) public void Shavit_OnEnd(int client, int track) { - if(gB_TeleportToEnd) + if(gCV_TeleportToEnd.BoolValue) { int index = GetZoneIndex(Zone_End, track); @@ -2503,7 +2491,7 @@ int GetZoneIndex(int type, int track, int start = 0) for(int i = start; i < gI_MapZones; i++) { - if(gA_ZoneCache[i][bZoneInitialized] && gA_ZoneCache[i][iZoneType] == type && (gA_ZoneCache[i][iZoneTrack] == track || track == -1)) + if(gA_ZoneCache[i].bZoneInitialized && gA_ZoneCache[i].iZoneType == type && (gA_ZoneCache[i].iZoneTrack == track || track == -1)) { return i; } @@ -2558,20 +2546,20 @@ public void CreateZoneEntities() { for(int k = 0; k < TRACKS_SIZE; k++) { - gB_InsideZone[j][gA_ZoneCache[i][iZoneType]][k] = false; + gB_InsideZone[j][gA_ZoneCache[i].iZoneType][k] = false; } gB_InsideZoneID[j][i] = false; } - if(gA_ZoneCache[i][iEntityID] != -1) + if(gA_ZoneCache[i].iEntityID != -1) { KillZoneEntity(i); - gA_ZoneCache[i][iEntityID] = -1; + gA_ZoneCache[i].iEntityID = -1; } - if(!gA_ZoneCache[i][bZoneInitialized]) + if(!gA_ZoneCache[i].bZoneInitialized) { continue; } @@ -2626,10 +2614,10 @@ public void CreateZoneEntities() SDKHook(entity, SDKHook_TouchPost, TouchPost); gI_EntityZone[entity] = i; - gA_ZoneCache[i][iEntityID] = entity; + gA_ZoneCache[i].iEntityID = entity; char sTargetname[32]; - FormatEx(sTargetname, 32, "shavit_zones_%d_%d", gA_ZoneCache[i][iZoneTrack], gA_ZoneCache[i][iZoneType]); + FormatEx(sTargetname, 32, "shavit_zones_%d_%d", gA_ZoneCache[i].iZoneTrack, gA_ZoneCache[i].iZoneType); DispatchKeyValue(entity, "targetname", sTargetname); gB_ZonesCreated = true; @@ -2638,15 +2626,15 @@ public void CreateZoneEntities() public void StartTouchPost(int entity, int other) { - if(other < 1 || other > MaxClients || gI_EntityZone[entity] == -1 || !gA_ZoneCache[gI_EntityZone[entity]][bZoneInitialized] || IsFakeClient(other) || - (gB_EnforceTracks && gA_ZoneCache[gI_EntityZone[entity]][iZoneType] > Zone_End && gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack] != Shavit_GetClientTrack(other))) + if(other < 1 || other > MaxClients || gI_EntityZone[entity] == -1 || !gA_ZoneCache[gI_EntityZone[entity]].bZoneInitialized || IsFakeClient(other) || + (gCV_EnforceTracks.BoolValue && gA_ZoneCache[gI_EntityZone[entity]].iZoneType > Zone_End && gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack != Shavit_GetClientTrack(other))) { return; } TimerStatus status = Shavit_GetTimerStatus(other); - switch(gA_ZoneCache[gI_EntityZone[entity]][iZoneType]) + switch(gA_ZoneCache[gI_EntityZone[entity]].iZoneType) { case Zone_Respawn: { @@ -2662,7 +2650,7 @@ public void StartTouchPost(int entity, int other) { Shavit_StopTimer(other); ForcePlayerSuicide(other); - Shavit_PrintToChat(other, "%T", "ZoneSlayEnter", other, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageVariable2], gS_ChatStrings[sMessageWarning]); + Shavit_PrintToChat(other, "%T", "ZoneSlayEnter", other, gS_ChatStrings.sWarning, gS_ChatStrings.sVariable2, gS_ChatStrings.sWarning); } case Zone_Stop: @@ -2670,26 +2658,26 @@ public void StartTouchPost(int entity, int other) if(status != Timer_Stopped) { Shavit_StopTimer(other); - Shavit_PrintToChat(other, "%T", "ZoneStopEnter", other, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageVariable2], gS_ChatStrings[sMessageWarning]); + Shavit_PrintToChat(other, "%T", "ZoneStopEnter", other, gS_ChatStrings.sWarning, gS_ChatStrings.sVariable2, gS_ChatStrings.sWarning); } } case Zone_End: { - if(status != Timer_Stopped && Shavit_GetClientTrack(other) == gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]) + if(status != Timer_Stopped && Shavit_GetClientTrack(other) == gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack) { - Shavit_FinishMap(other, gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]); + Shavit_FinishMap(other, gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack); } } } - gB_InsideZone[other][gA_ZoneCache[gI_EntityZone[entity]][iZoneType]][gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]] = true; + gB_InsideZone[other][gA_ZoneCache[gI_EntityZone[entity]].iZoneType][gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack] = true; gB_InsideZoneID[other][gI_EntityZone[entity]] = true; Call_StartForward(gH_Forwards_EnterZone); Call_PushCell(other); - Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]][iZoneType]); - Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]); + Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]].iZoneType); + Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack); Call_PushCell(gI_EntityZone[entity]); Call_PushCell(entity); Call_Finish(); @@ -2703,8 +2691,8 @@ public void EndTouchPost(int entity, int other) } int entityzone = gI_EntityZone[entity]; - int type = gA_ZoneCache[entityzone][iZoneType]; - int track = gA_ZoneCache[entityzone][iZoneTrack]; + int type = gA_ZoneCache[entityzone].iZoneType; + int track = gA_ZoneCache[entityzone].iZoneTrack; gB_InsideZone[other][type][track] = false; gB_InsideZoneID[other][entityzone] = false; @@ -2721,13 +2709,13 @@ public void EndTouchPost(int entity, int other) public void TouchPost(int entity, int other) { if(other < 1 || other > MaxClients || gI_EntityZone[entity] == -1 || IsFakeClient(other) || - (gB_EnforceTracks && gA_ZoneCache[gI_EntityZone[entity]][iZoneType] > Zone_End && gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack] != Shavit_GetClientTrack(other))) + (gCV_EnforceTracks.BoolValue && gA_ZoneCache[gI_EntityZone[entity]].iZoneType > Zone_End && gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack != Shavit_GetClientTrack(other))) { return; } // do precise stuff here, this will be called *A LOT* - switch(gA_ZoneCache[gI_EntityZone[entity]][iZoneType]) + switch(gA_ZoneCache[gI_EntityZone[entity]].iZoneType) { case Zone_Start: { @@ -2735,10 +2723,10 @@ public void TouchPost(int entity, int other) // so you don't accidentally step on those while running if(Shavit_GetTimerStatus(other) == Timer_Stopped || Shavit_GetClientTrack(other) != Track_Main) { - Shavit_StartTimer(other, gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]); + Shavit_StartTimer(other, gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack); } - else if(gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack] == Track_Main) + else if(gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack == Track_Main) { Shavit_StartTimer(other, Track_Main); } diff --git a/addons/sourcemod/translations/shavit-hud.phrases.txt b/addons/sourcemod/translations/shavit-hud.phrases.txt index a63686f0..6c1cc5d0 100644 --- a/addons/sourcemod/translations/shavit-hud.phrases.txt +++ b/addons/sourcemod/translations/shavit-hud.phrases.txt @@ -11,6 +11,11 @@ "#format" "{1:d}" "en" "In Start Zone\n\n{1}" } + "HudInStartZoneCSGO" + { + "#format" "{1:d}" + "en" "In Start Zone\n\n\t\t\t{1}" + } "HudEndZone" { "en" "End Zone" @@ -20,6 +25,11 @@ "#format" "{1:d}" "en" "In End Zone\n\n{1}" } + "HudInEndZoneCSGO" + { + "#format" "{1:d}" + "en" "In End Zone\n\n\t\t\t{1}" + } "HudPaused" { "en" "[PAUSED]" @@ -83,7 +93,7 @@ } "HudObserve" { - "en" "Shows the HUD of the player you spectate" + "en" "Spectate HUD" } "HudSpectators" { @@ -91,7 +101,7 @@ } "HudKeyOverlay" { - "en" "Key overlay" + "en" "Key display" } "HudHideWeapon" { @@ -107,11 +117,19 @@ } "HudNoRecordSounds" { - "en" "Disable record sounds" + "en" "No record sounds" } "HudPracticeModeAlert" { - "en" "Disable practice mode alert" + "en" "No practice mode alert" + } + "HudRankText" + { + "en" "Expected rank" + } + "HudTrackText" + { + "en" "Timer track" } // ---------- Record Bots ---------- // "ReplayText" @@ -135,4 +153,15 @@ { "en" "Other Spectators" } + // ---------- Commands ---------- // + "HudEnabledComponent" + { + "#format" "{1:s},{2:s},{3:s},{4:s},{5:s}" + "en" "{1}{2} {3}HUD setting {4}enabled{5}." + } + "HudDisabledComponent" + { + "#format" "{1:s},{2:s},{3:s},{4:s},{5:s}" + "en" "{1}{2} {3}HUD setting {4}disabled{5}." + } }