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..e50319e5 100644 --- a/addons/sourcemod/scripting/include/shavit.inc +++ b/addons/sourcemod/scripting/include/shavit.inc @@ -23,7 +23,7 @@ #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 @@ -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. @@ -1022,7 +1022,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 +1083,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 +1098,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. diff --git a/addons/sourcemod/scripting/shavit-chat.sp b/addons/sourcemod/scripting/shavit-chat.sp index cdc1c8ce..a0400430 100644 --- a/addons/sourcemod/scripting/shavit-chat.sp +++ b/addons/sourcemod/scripting/shavit-chat.sp @@ -39,18 +39,17 @@ #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 @@ -159,7 +158,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 +205,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 +226,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); } } @@ -813,11 +812,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 +873,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 +902,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 +918,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 +928,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,14 +1024,14 @@ 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); @@ -1100,11 +1099,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,7 +1133,7 @@ bool HasRankAccess(int client, int rank) return false; } - if(aCache[bCRFree]) + if(cache.bFree) { return true; } @@ -1144,11 +1143,11 @@ bool HasRankAccess(int client, int rank) 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 +1165,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 +1201,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); } } diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index 8d2a79bb..9227d847 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -33,8 +33,31 @@ // #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; // database handle @@ -58,29 +81,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; @@ -125,18 +135,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 @@ -222,20 +230,13 @@ public void OnPluginStart() // game types gEV_Type = GetEngineVersion(); - 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*."); } @@ -459,7 +460,7 @@ public Action Command_StartTimer(int client, int args) { 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; @@ -487,7 +488,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 +523,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,14 +543,14 @@ 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; } @@ -559,35 +560,35 @@ public Action Command_TogglePause(int client, int args) 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 +597,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 +661,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 +684,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 +706,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 @@ -724,16 +725,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 +785,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 +805,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 +813,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(gB_AllowTimerWithoutZone || (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 +865,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 +888,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 +903,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) { @@ -947,7 +948,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 +967,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 +1023,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 +1031,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,24 +1066,24 @@ 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; @@ -1129,7 +1130,7 @@ 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)) { @@ -1170,19 +1171,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 +1193,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 +1240,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 +1326,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 +1349,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(!gB_NoZAxisSpeed || 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 +1359,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 +1390,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 +1408,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 +1423,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 +1448,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 +1465,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 +1478,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 +1587,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 +1649,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 +1698,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 +1730,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(); @@ -1910,23 +1945,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 +1971,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 +2017,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 +2037,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 +2049,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 +2069,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 +2088,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 +2108,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 +2143,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 +2166,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 +2218,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 +2256,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 +2271,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 && gB_BlockPreJump && !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 +2307,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 +2317,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 +2355,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 +2384,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..bb5239fc 100644 --- a/addons/sourcemod/scripting/shavit-hud.sp +++ b/addons/sourcemod/scripting/shavit-hud.sp @@ -72,8 +72,8 @@ 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]; public Plugin myinfo = { @@ -250,12 +250,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; @@ -765,19 +765,19 @@ void UpdateHUD(int client) 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]); + 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: %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]) + if(gA_StyleSettings[style].bSync) { Format(sHintText, 512, "%s%s\t%T: %d (%.01f%%)", sHintText, (iSpeed < 1000)? "\t":"", "HudStrafeText", client, strafes, Shavit_GetSync(target)); } @@ -794,14 +794,17 @@ void UpdateHUD(int client) if(status != Timer_Stopped) { char sFirstLine[64]; - strcopy(sFirstLine, 64, gS_StyleStrings[style][sStyleName]); + 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":""); + 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) { @@ -836,10 +839,10 @@ void UpdateHUD(int client) return; } - iSpeed = RoundToNearest(float(iSpeed) / view_as(gA_StyleSettings[style][fSpeedMultiplier])); + iSpeed = RoundToNearest(float(iSpeed) / gA_StyleSettings[style].fSpeedMultiplier); track = Shavit_GetReplayBotTrack(target); - float fReplayTime = Shavit_GetReplayTime(style, track) * view_as(gA_StyleSettings[style][fTimescale]); + float fReplayTime = (Shavit_GetReplayTime(style, track) * gA_StyleSettings[style].fTimescale); float fReplayLength = Shavit_GetReplayLength(style, track); if(fReplayTime < 0.0 || fReplayTime > fReplayLength || !Shavit_IsReplayDataLoaded(style, track)) @@ -864,7 +867,7 @@ void UpdateHUD(int client) 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\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); } @@ -874,7 +877,7 @@ void UpdateHUD(int client) 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); + 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); @@ -912,7 +915,7 @@ void UpdateKeyOverlay(int client, Panel panel, bool &draw) style = 0; } - if(gB_BhopStats && !gA_StyleSettings[style][bAutobhop]) + 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 +969,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]); } @@ -1117,11 +1120,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)); } diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 729b62cc..6f8b7eef 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,43 @@ enum CheckpointsCache #define CP_DEFAULT (CP_ANGLES|CP_VELOCITY) +enum struct cp_cache_t +{ + float fPosition[3]; + float fAngles[3]; + float fVelocity[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,14 +95,7 @@ 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; @@ -106,7 +103,7 @@ ArrayList gA_Classnames = null; // save states 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]; @@ -191,11 +188,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 = { @@ -468,18 +465,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,10 +490,10 @@ 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); } } @@ -641,11 +640,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); } @@ -805,7 +804,7 @@ public MRESReturn CCSPlayer__GetPlayerMaxSpeed(int pThis, Handle hReturn) 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; } @@ -966,8 +965,8 @@ 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]); + 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 +983,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,12 +996,12 @@ 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) { 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; @@ -1014,7 +1013,7 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float 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 + gF_PrestrafeLimit); if(gI_PreSpeed < 4) { @@ -1109,22 +1108,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) @@ -1204,7 +1203,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 +1258,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; @@ -1316,7 +1315,7 @@ public Action Command_Teleport(int client, int args) if(!gB_TeleportCommands) { - 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 +1397,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; } @@ -1429,14 +1428,14 @@ public Action Command_Weapon(int client, int args) if(gI_WeaponCommands == 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; } @@ -1519,13 +1518,13 @@ public Action Command_Save(int client, int args) if(!gB_Checkpoints && !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 +1535,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 +1551,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); } } @@ -1571,12 +1570,12 @@ public Action Command_Tele(int client, int args) if(!gB_Checkpoints) { - 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) { @@ -1602,7 +1601,7 @@ public Action OpenCheckpointsMenu(int client, int item) if(!gB_Checkpoints && !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 +1619,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 < gI_MaxCP)? 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 +1667,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 +1684,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 +1704,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 +1780,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 +1789,25 @@ 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); + CopyArray(temp, cpcache.fVelocity, 3); char sTargetname[64]; GetEntPropString(target, Prop_Data, "m_iName", sTargetname, 64); @@ -1830,13 +1829,13 @@ 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.iTargetname = iTargetname; + cpcache.iClassname = iClassname; + cpcache.iMoveType = GetEntityMoveType(target); + cpcache.fGravity = GetEntityGravity(target); + cpcache.fSpeed = GetEntPropFloat(target, Prop_Send, "m_flLaggedMovementValue"); + cpcache.fStamina = (gEV_Type != Engine_TF2)? GetEntPropFloat(target, Prop_Send, "m_flStamina"):0.0; + cpcache.iGroundEntity = GetEntPropEnt(target, Prop_Data, "m_hGroundEntity"); int iFlags = GetEntityFlags(target); @@ -1846,26 +1845,26 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) iFlags |= FL_AIMTARGET; } - cpcache[iCPFlags] = iFlags; + 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 +1874,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 +1897,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 +1924,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 +1942,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); @@ -1964,17 +1963,17 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) 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 +1982,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 +1992,18 @@ 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); + CopyArray(cpcache.fVelocity, vel, 3); } else @@ -2013,28 +2012,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 +2043,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 +2055,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); } } @@ -2100,21 +2099,21 @@ public Action Command_Noclip(int client, int args) if(gI_NoclipMe == 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)) { - 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; } @@ -2197,7 +2196,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; } @@ -2228,24 +2227,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,7 +2252,7 @@ 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; } @@ -2284,7 +2283,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 +2307,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); } } } @@ -2477,8 +2476,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; @@ -2811,20 +2810,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,7 +2836,7 @@ 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) diff --git a/addons/sourcemod/scripting/shavit-rankings.sp b/addons/sourcemod/scripting/shavit-rankings.sp index 5bcb82a4..b08ce658 100644 --- a/addons/sourcemod/scripting/shavit-rankings.sp +++ b/addons/sourcemod/scripting/shavit-rankings.sp @@ -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", @@ -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) @@ -548,7 +549,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 +573,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 +632,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 +674,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, gF_PointsPerTier, gA_StyleSettings[i].fRankingMultiplier, i); } trans.AddQuery(sQuery); @@ -731,7 +732,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 +754,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, gF_PointsPerTier, 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..14d869f7 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -42,25 +42,23 @@ #pragma semicolon 1 #pragma dynamic 131072 -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 { @@ -99,7 +97,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; @@ -129,14 +127,14 @@ 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; @@ -348,7 +346,7 @@ public int Native_GetReplayBotIndex(Handle handler, int numParams) { if(gB_CentralBot) { - return gA_CentralCache[iCentralClient]; + return gA_CentralCache.iClient; } return gI_ReplayBotClient[GetNativeCell(1)]; @@ -361,7 +359,7 @@ public int Native_IsReplayDataLoaded(Handle handler, int numParams) if(gB_CentralBot) { - return (gA_CentralCache[iCentralClient] != -1 && gA_CentralCache[iCentralClient] != Replay_Idle && view_as(gA_FrameCache[style][track][0]) > 0); + return (gA_CentralCache.iClient != -1 && gA_CentralCache.iReplayStatus != Replay_Idle && view_as(gA_FrameCache[style][track][0]) > 0); } return view_as(ReplayEnabled(style) && gA_FrameCache[style][Track_Main][0] > 0); @@ -402,7 +400,7 @@ public int Native_ReloadReplay(Handle handler, int numParams) if(gB_CentralBot) { - if(gA_CentralCache[iCentralStyle] == style && gA_CentralCache[iCentralTrack] == track) + if(gA_CentralCache.iStyle == style && gA_CentralCache.iTrack == track) { StopCentralReplay(0); } @@ -506,7 +504,7 @@ public int Native_GetReplayTime(Handle handler, int numParams) if(gB_CentralBot) { - if(gA_CentralCache[iCentralReplayStatus] == Replay_End) + if(gA_CentralCache.iReplayStatus == Replay_End) { return view_as(GetReplayLength(style, track)); } @@ -531,7 +529,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 (gB_CentralBot && gA_CentralCache.iReplayStatus == Replay_Idle)? -1:GetReplayStyle(GetNativeCell(1)); } public int Native_GetReplayBotTrack(Handle handler, int numParams) @@ -656,16 +654,16 @@ public Action Cron(Handle Timer) } } - if(gB_CentralBot && gA_CentralCache[iCentralClient] != -1) + if(gB_CentralBot && 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 +684,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,10 +720,10 @@ 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; @@ -896,9 +894,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 +904,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) @@ -1132,7 +1132,7 @@ bool DeleteReplay(int style, int track) return false; } - if(gB_CentralBot && gA_CentralCache[iCentralStyle] == style && gA_CentralCache[iCentralTrack] == track) + if(gB_CentralBot && gA_CentralCache.iStyle == style && gA_CentralCache.iTrack == track) { StopCentralReplay(0); } @@ -1202,10 +1202,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; } } } @@ -1248,16 +1248,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); @@ -1280,13 +1280,13 @@ 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); } @@ -1295,18 +1295,26 @@ void UpdateReplayInfo(int client, int style, float time, int track) 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) { @@ -1422,9 +1430,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; } @@ -1507,7 +1515,7 @@ 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(gB_CentralBot && gA_CentralCache.iStyle == style && gA_CentralCache.iTrack == track) { StopCentralReplay(0); } @@ -1566,7 +1574,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); } @@ -1639,7 +1647,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 if(++gI_ReplayTick[style] >= 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); @@ -1811,7 +1819,7 @@ 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; @@ -1820,7 +1828,7 @@ public Action Timer_EndReplay(Handle Timer, any data) else { - gRS_ReplayStatus[data] = gA_CentralCache[iCentralReplayStatus] = Replay_Idle; + gRS_ReplayStatus[data] = gA_CentralCache.iReplayStatus = Replay_Idle; gI_ReplayBotClient[data] = 0; } @@ -1838,14 +1846,14 @@ 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) @@ -2008,12 +2016,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 +2061,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 +2105,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 +2126,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) || !gB_CentralBot || 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; } @@ -2214,7 +2222,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,12 +2244,12 @@ 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); @@ -2278,12 +2286,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) || view_as(gA_FrameCache[style][gI_Track[param1]][0]) == 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,16 +2301,16 @@ 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); } @@ -2347,17 +2355,17 @@ 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; + TeleportToStart(gA_CentralCache.iClient, style, GetReplayTrack(gA_CentralCache.iClient)); + gA_CentralCache.iStyle = 0; gB_ForciblyStopped = true; - UpdateReplayInfo(client, 0, 0.0, gA_CentralCache[iCentralTrack]); + UpdateReplayInfo(client, 0, 0.0, gA_CentralCache.iTrack); } int GetReplayStyle(int client) @@ -2369,12 +2377,12 @@ int GetReplayStyle(int client) if(gB_CentralBot) { - 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 +2403,7 @@ int GetReplayTrack(int client) return -1; } - return (gB_CentralBot)? gA_CentralCache[iCentralTrack]:Track_Main; + return (gB_CentralBot)? gA_CentralCache.iTrack:Track_Main; } int GetSpectatorTarget(int client) diff --git a/addons/sourcemod/scripting/shavit-stats.sp b/addons/sourcemod/scripting/shavit-stats.sp index de1b8fa1..632c2809 100644 --- a/addons/sourcemod/scripting/shavit-stats.sp +++ b/addons/sourcemod/scripting/shavit-stats.sp @@ -65,11 +65,11 @@ 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 = { @@ -167,8 +167,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,10 +176,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)); } public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) @@ -469,11 +471,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 +485,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 +502,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 +516,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 +640,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 +777,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-wr.sp b/addons/sourcemod/scripting/shavit-wr.sp index f7391dfb..c03f222d 100644 --- a/addons/sourcemod/scripting/shavit-wr.sp +++ b/addons/sourcemod/scripting/shavit-wr.sp @@ -79,11 +79,11 @@ 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 = { @@ -384,8 +384,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,10 +416,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)); } public void OnClientPutInServer(int client) @@ -534,7 +536,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; } @@ -745,7 +747,7 @@ 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][gI_LastTrack[client]]); menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][gI_LastTrack[client]] > 0)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED); } @@ -881,7 +883,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 +892,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 +940,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 +948,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 +987,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 +1035,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) @@ -1088,7 +1090,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 +1201,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 +1289,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; } @@ -1299,7 +1301,7 @@ public void DeleteAll_Callback(Database db, DBResultSet results, const char[] er 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) @@ -1353,7 +1355,7 @@ Action ShowWRStyleMenu(int client, int track) for(int i = 0; i < gI_Styles; i++) { - if(gA_StyleSettings[i][bUnranked]) + if(gA_StyleSettings[i].bUnranked) { continue; } @@ -1368,12 +1370,12 @@ Action ShowWRStyleMenu(int client, int track) 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); @@ -1409,7 +1411,7 @@ 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; } @@ -1654,12 +1656,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]; @@ -1773,7 +1775,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 +1788,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 @@ -2155,7 +2157,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 +2223,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 +2234,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 +2246,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 +2270,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 +2331,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 +2341,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..83c94fe5 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]; @@ -143,7 +151,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; @@ -261,13 +269,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; } } @@ -302,7 +310,7 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n { for(int i = 0; i < gI_MapZones; i++) { - if(!gA_ZoneCache[i][bZoneInitialized]) + if(!gA_ZoneCache[i].bZoneInitialized) { continue; } @@ -545,13 +553,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++; } @@ -758,10 +766,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 +784,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 +800,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 +808,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 +839,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); @@ -914,11 +924,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 +989,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 +1106,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 +1146,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 +1155,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 +1206,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 +1251,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 +1306,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 +1351,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 +1666,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) { @@ -1949,7 +1959,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 +2004,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 +2061,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], + gA_ZoneSettings[type][track].fWidth, + gA_ZoneSettings[type][track].bFlatZone, gV_ZoneCenter[i]); } } @@ -2081,10 +2091,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; } @@ -2143,7 +2153,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])) { @@ -2503,7 +2513,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 +2568,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 +2636,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 +2648,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) || + (gB_EnforceTracks && 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 +2672,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 +2680,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 +2713,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 +2731,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))) + (gB_EnforceTracks && 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 +2745,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); }