mirror of
https://github.com/shavitush/bhoptimer.git
synced 2025-12-06 18:08:26 +00:00
commit
1cd4b4c9c3
2
.gitignore
vendored
2
.gitignore
vendored
@ -6,3 +6,5 @@
|
||||
# editors
|
||||
*.atom-build.json
|
||||
.vscode/tasks.json
|
||||
|
||||
\.vscode/settings\.json
|
||||
|
||||
@ -5,7 +5,7 @@ addons:
|
||||
- lib32stdc++6 # needed for spcomp
|
||||
|
||||
env:
|
||||
- SMVERSION=1.9
|
||||
- SMVERSION=1.10
|
||||
|
||||
before_script:
|
||||
# install smbuilder
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -23,13 +23,13 @@
|
||||
#endif
|
||||
#define _shavit_included
|
||||
|
||||
#define SHAVIT_VERSION "2.3.6"
|
||||
#define SHAVIT_VERSION "2.4.0"
|
||||
#define STYLE_LIMIT 256
|
||||
#define MAX_ZONES 64
|
||||
#define MAX_NAME_LENGTH_SQL 32
|
||||
|
||||
// HUD
|
||||
#define HUD_NONE (0)
|
||||
#define HUD_NONE 0
|
||||
#define HUD_MASTER (1 << 0) // master setting
|
||||
#define HUD_CENTER (1 << 1) // show hud as hint text
|
||||
#define HUD_ZONEHUD (1 << 2) // show start/end zone hud
|
||||
@ -44,26 +44,17 @@
|
||||
#define HUD_NOSOUNDS (1 << 11) // disables sounds on personal best, world record etc
|
||||
#define HUD_NOPRACALERT (1 << 12) // hides practice mode chat alert
|
||||
|
||||
// for reference, not used anymore
|
||||
// game types
|
||||
enum ServerGame
|
||||
{
|
||||
Game_CSS = 0,
|
||||
Game_CSGO,
|
||||
Game_Unknown
|
||||
};
|
||||
|
||||
// status
|
||||
enum TimerStatus
|
||||
{
|
||||
Timer_Stopped = 0,
|
||||
Timer_Stopped,
|
||||
Timer_Running,
|
||||
Timer_Paused
|
||||
};
|
||||
|
||||
enum ReplayStatus
|
||||
{
|
||||
Replay_Start = 0,
|
||||
Replay_Start,
|
||||
Replay_Running,
|
||||
Replay_End,
|
||||
Replay_Idle
|
||||
@ -71,10 +62,34 @@ enum ReplayStatus
|
||||
|
||||
enum ReplayBotType
|
||||
{
|
||||
Replay_Central = 0,
|
||||
Replay_Central,
|
||||
Replay_Legacy
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
Zone_Start,
|
||||
Zone_End,
|
||||
Zone_Respawn,
|
||||
Zone_Stop,
|
||||
Zone_Slay,
|
||||
Zone_Freestyle,
|
||||
Zone_NoVelLimit,
|
||||
Zone_Teleport,
|
||||
Zone_CustomSpawn,
|
||||
Zone_Easybhop,
|
||||
Zone_Slide,
|
||||
ZONETYPES_SIZE
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
Track_Main,
|
||||
Track_Bonus,
|
||||
TRACKS_SIZE
|
||||
};
|
||||
|
||||
// for Shavit_GetStyleStrings
|
||||
enum
|
||||
{
|
||||
sStyleName,
|
||||
@ -83,46 +98,10 @@ enum
|
||||
sChangeCommand,
|
||||
sClanTag,
|
||||
sSpecialString,
|
||||
sStylePermission,
|
||||
STYLESTRINGS_SIZE
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
bAutobhop,
|
||||
bEasybhop,
|
||||
bPrespeed,
|
||||
fVelocityLimit,
|
||||
bEnableBunnyhopping,
|
||||
fAiraccelerate,
|
||||
fRunspeed,
|
||||
fGravityMultiplier,
|
||||
fSpeedMultiplier,
|
||||
fTimescale,
|
||||
fVelocity,
|
||||
fBonusVelocity,
|
||||
fMinVelocity,
|
||||
bBlockW,
|
||||
bBlockA,
|
||||
bBlockS,
|
||||
bBlockD,
|
||||
bBlockUse,
|
||||
iForceHSW,
|
||||
iBlockPLeft,
|
||||
iBlockPRight,
|
||||
iBlockPStrafe,
|
||||
bUnranked,
|
||||
bNoReplay,
|
||||
bSync,
|
||||
bStrafeCountW,
|
||||
bStrafeCountA,
|
||||
bStrafeCountS,
|
||||
bStrafeCountD,
|
||||
fRankingMultiplier,
|
||||
iSpecial,
|
||||
STYLESETTINGS_SIZE
|
||||
sStylePermission
|
||||
};
|
||||
|
||||
// for Shavit_GetChatStrings
|
||||
enum
|
||||
{
|
||||
sMessagePrefix,
|
||||
@ -130,26 +109,80 @@ enum
|
||||
sMessageWarning,
|
||||
sMessageVariable,
|
||||
sMessageVariable2,
|
||||
sMessageStyle,
|
||||
CHATSETTINGS_SIZE
|
||||
sMessageStyle
|
||||
};
|
||||
|
||||
enum
|
||||
enum struct stylestrings_t
|
||||
{
|
||||
bTimerEnabled,
|
||||
fCurrentTime,
|
||||
bClientPaused,
|
||||
iJumps,
|
||||
bsStyle,
|
||||
iStrafes,
|
||||
iTotalMeasures,
|
||||
iGoodGains,
|
||||
fServerTime,
|
||||
iSHSWCombination,
|
||||
iTimerTrack,
|
||||
iMeasuredJumps,
|
||||
iPerfectJumps,
|
||||
TIMERSNAPSHOT_SIZE
|
||||
char sStyleName[64];
|
||||
char sShortName[32];
|
||||
char sHTMLColor[32];
|
||||
char sChangeCommand[128];
|
||||
char sClanTag[32];
|
||||
char sSpecialString[128];
|
||||
char sStylePermission[64];
|
||||
};
|
||||
|
||||
enum struct stylesettings_t
|
||||
{
|
||||
bool bAutobhop;
|
||||
bool bEasybhop;
|
||||
bool bPrespeed;
|
||||
float fVelocityLimit;
|
||||
bool bEnableBunnyhopping;
|
||||
float fAiraccelerate;
|
||||
float fRunspeed;
|
||||
float fGravityMultiplier;
|
||||
float fSpeedMultiplier;
|
||||
float fTimescale;
|
||||
float fVelocity;
|
||||
float fBonusVelocity;
|
||||
float fMinVelocity;
|
||||
bool bBlockW;
|
||||
bool bBlockA;
|
||||
bool bBlockS;
|
||||
bool bBlockD;
|
||||
bool bBlockUse;
|
||||
int iForceHSW;
|
||||
int iBlockPLeft;
|
||||
int iBlockPRight;
|
||||
int iBlockPStrafe;
|
||||
bool bUnranked;
|
||||
bool bNoReplay;
|
||||
bool bSync;
|
||||
bool bStrafeCountW;
|
||||
bool bStrafeCountA;
|
||||
bool bStrafeCountS;
|
||||
bool bStrafeCountD;
|
||||
float fRankingMultiplier;
|
||||
int iSpecial;
|
||||
};
|
||||
|
||||
enum struct chatstrings_t
|
||||
{
|
||||
char sPrefix[64];
|
||||
char sText[16];
|
||||
char sWarning[16];
|
||||
char sVariable[16];
|
||||
char sVariable2[16];
|
||||
char sStyle[16];
|
||||
};
|
||||
|
||||
enum struct timer_snapshot_t
|
||||
{
|
||||
bool bTimerEnabled;
|
||||
float fCurrentTime;
|
||||
bool bClientPaused;
|
||||
int iJumps;
|
||||
int bsStyle;
|
||||
int iStrafes;
|
||||
int iTotalMeasures;
|
||||
int iGoodGains;
|
||||
float fServerTime;
|
||||
int iSHSWCombination;
|
||||
int iTimerTrack;
|
||||
int iMeasuredJumps;
|
||||
int iPerfectJumps;
|
||||
};
|
||||
|
||||
#if defined USES_CHAT_COLORS
|
||||
@ -203,39 +236,6 @@ char gS_CSGOColors[][] =
|
||||
};
|
||||
#endif
|
||||
|
||||
enum(+=1)
|
||||
{
|
||||
Zone_Start = 0,
|
||||
Zone_End,
|
||||
Zone_Respawn,
|
||||
Zone_Stop,
|
||||
Zone_Slay,
|
||||
Zone_Freestyle,
|
||||
Zone_NoVelLimit,
|
||||
Zone_Teleport,
|
||||
Zone_CustomSpawn,
|
||||
Zone_Easybhop,
|
||||
Zone_Slide,
|
||||
ZONETYPES_SIZE
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
bZoneInitialized,
|
||||
iZoneType,
|
||||
iZoneTrack, // 0 - main, 1 - bonus
|
||||
iEntityID,
|
||||
iDatabaseID,
|
||||
ZONECACHE_SIZE
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
Track_Main,
|
||||
Track_Bonus,
|
||||
TRACKS_SIZE
|
||||
};
|
||||
|
||||
stock bool IsValidClient(int client, bool bAlive = false)
|
||||
{
|
||||
return (client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && !IsClientSourceTV(client) && (!bAlive || IsPlayerAlive(client)));
|
||||
@ -301,11 +301,11 @@ stock void FormatSeconds(float time, char[] newtime, int newtimesize, bool preci
|
||||
* @param status The player's timer status.
|
||||
* @param track The player's timer track.
|
||||
* @param style The player's bhop style.
|
||||
* @param stylesettings An array that contains the player's bhop style's settings.
|
||||
* @param stylesettings A stylesettings_t struct that contains the player's bhop style's settings.
|
||||
* @param mouse Mouse direction (x, y).
|
||||
* @return Plugin_Continue to let shavit-core keep doing what it does, Plugin_Changed to pass different values.
|
||||
*/
|
||||
forward Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, any stylesettings[STYLESETTINGS_SIZE], int mouse[2]);
|
||||
forward Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, stylesettings_t stylesettings, int mouse[2]);
|
||||
|
||||
/**
|
||||
* Called just before shavit-core adds time to a player's timer.
|
||||
@ -315,10 +315,10 @@ forward Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float
|
||||
* @param client Client index.
|
||||
* @param snapshot A snapshot with the player's current timer. You cannot manipulate it here.
|
||||
* @param time The time to be added to the player's timer.
|
||||
* @param stylesettings An array that contains the player's bhop style's settings.
|
||||
* @param stylesettings A stylesettings_t struct that contains the player's bhop style's settings.
|
||||
* @noreturn
|
||||
*/
|
||||
forward void Shavit_OnTimeIncrement(int client, any snapshot[TIMERSNAPSHOT_SIZE], float &time, any stylesettings[STYLESETTINGS_SIZE]);
|
||||
forward void Shavit_OnTimeIncrement(int client, any snapshot[sizeof(timer_snapshot_t)], float &time, stylesettings_t stylesettings);
|
||||
|
||||
/**
|
||||
* Called just before shavit-core adds time to a player's timer.
|
||||
@ -328,10 +328,10 @@ forward void Shavit_OnTimeIncrement(int client, any snapshot[TIMERSNAPSHOT_SIZE]
|
||||
* @param client Client index.
|
||||
* @param snapshot A snapshot with the player's current timer. Read above in shavit.inc for more information.
|
||||
* @param time The time to be added to the player's timer.
|
||||
* @param stylesettings An array that contains the player's bhop style's settings.
|
||||
* @param stylesettings A stylesettings_t struct that contains the player's bhop style's settings.
|
||||
* @noreturn
|
||||
*/
|
||||
forward void Shavit_OnTimeIncrementPost(int client, float time, any stylesettings[STYLESETTINGS_SIZE]);
|
||||
forward void Shavit_OnTimeIncrementPost(int client, float time, stylesettings_t stylesettings);
|
||||
|
||||
/**
|
||||
* Called when a player's timer starts.
|
||||
@ -377,7 +377,7 @@ forward void Shavit_OnStop(int client, int track);
|
||||
* @param snapshot A snapshot of the player's timer.
|
||||
* @return Plugin_Continue to do nothing, Plugin_Changed to change the variables or anything else to stop the timer from finishing.
|
||||
*/
|
||||
forward Action Shavit_OnFinishPre(int client, any snapshot[TIMERSNAPSHOT_SIZE]);
|
||||
forward Action Shavit_OnFinishPre(int client, any snapshot[sizeof(timer_snapshot_t)]);
|
||||
|
||||
/**
|
||||
* Called when a player finishes a map. (touches the end zone)
|
||||
@ -568,7 +568,7 @@ forward void Shavit_OnReplayEnd(int client);
|
||||
* @return Game type. (See "enum ServerGame")
|
||||
*/
|
||||
#pragma deprecated Use GetEngineVersion() instead.
|
||||
native ServerGame Shavit_GetGameType();
|
||||
native EngineVersion Shavit_GetGameType();
|
||||
|
||||
/**
|
||||
* Returns the database handle the timer is using.
|
||||
@ -750,8 +750,18 @@ native float Shavit_GetSync(int client);
|
||||
* @param track Timer track.
|
||||
* @noreturn
|
||||
*/
|
||||
#pragma deprecated Use Shavit_GetWorldRecord() instead.
|
||||
native void Shavit_GetWRTime(int style, float &time, int track);
|
||||
|
||||
/**
|
||||
* Retrieves the world record for the given style/track.
|
||||
*
|
||||
* @param style Style to get the WR for.
|
||||
* @param track Timer track.
|
||||
* @return World record for the specified settings.
|
||||
*/
|
||||
native float Shavit_GetWorldRecord(int style, int track);
|
||||
|
||||
/**
|
||||
* Saves the WR's record ID for the current map on a variable.
|
||||
* Unused in base plugins, as of pre-1.4b.
|
||||
@ -783,8 +793,19 @@ native void Shavit_GetWRName(int style, char[] wrname, int wrmaxlength, int trac
|
||||
* @param track Timer track.
|
||||
* @noreturn
|
||||
*/
|
||||
#pragma deprecated Use Shavit_GetClientPB() instead.
|
||||
native void Shavit_GetPlayerPB(int client, int style, float &time, int track);
|
||||
|
||||
/**
|
||||
* Retrieves the best time of a player.
|
||||
*
|
||||
* @param client Client index.
|
||||
* @param style Style to get the PB for.
|
||||
* @param track Timer track.
|
||||
* @return Floating number of the player's best time for given style/track.
|
||||
*/
|
||||
native float Shavit_GetClientPB(int client, int style, int track);
|
||||
|
||||
/**
|
||||
* Get the amount of records on the current map/style on a track.
|
||||
*
|
||||
@ -1022,7 +1043,7 @@ native int Shavit_GetWRCount(int client);
|
||||
* @param StyleSettings Reference to the settings array.
|
||||
* @return SP_ERROR_NONE on success, anything else on failure.
|
||||
*/
|
||||
native int Shavit_GetStyleSettings(int style, any StyleSettings[STYLESETTINGS_SIZE]);
|
||||
native int Shavit_GetStyleSettings(int style, any StyleSettings[sizeof(stylesettings_t)]);
|
||||
|
||||
/**
|
||||
* Saves the style related strings on string references.
|
||||
@ -1083,13 +1104,13 @@ native bool Shavit_IsPracticeMode(int client);
|
||||
|
||||
/**
|
||||
* Save a client's timer into a snapshot.
|
||||
* See the enumeration that ends with TIMERSNAPSHOT_SIZE.
|
||||
* See the timer_snapshot_t enum struct.
|
||||
*
|
||||
* @param client Client index.
|
||||
* @param snapshot Full snapshot of the client's timer.
|
||||
* @noreturn
|
||||
*/
|
||||
native void Shavit_SaveSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]);
|
||||
native void Shavit_SaveSnapshot(int client, any snapshot[sizeof(timer_snapshot_t)]);
|
||||
|
||||
/**
|
||||
* Restores the client's timer from a snapshot.
|
||||
@ -1098,7 +1119,7 @@ native void Shavit_SaveSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]);
|
||||
* @param snapshot Full snapshot of the client's timer.
|
||||
* @noreturn
|
||||
*/
|
||||
native void Shavit_LoadSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]);
|
||||
native void Shavit_LoadSnapshot(int client, any snapshot[sizeof(timer_snapshot_t)]);
|
||||
|
||||
/**
|
||||
* Sets a player's replay recording frames from a provided ArrayList.
|
||||
@ -1141,8 +1162,9 @@ native bool Shavit_ReloadReplay(int style, int track, bool restart, char[] path
|
||||
native int Shavit_ReloadReplays(bool restart);
|
||||
|
||||
/**
|
||||
* Use this native to stop the chat tick sound that happens in CS:S.
|
||||
* Call it before each Shavit_PrintToChat() or Shavit_PrintToChatAll().
|
||||
* Use this native to stop the click sound that plays upon chat messages.
|
||||
* Call it before each Shavit_PrintToChat().
|
||||
* Shavit_PrintToChatAll() is not guaranteed to disable the sound from playing.
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
@ -1215,7 +1237,7 @@ native void Shavit_LogMessage(const char[] format, any ...);
|
||||
// code stolen from the base halflife.inc file
|
||||
stock void Shavit_PrintToChatAll(const char[] format, any ...)
|
||||
{
|
||||
char[] buffer = new char[300];
|
||||
char buffer[300];
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
@ -1249,6 +1271,7 @@ public void __pl_shavit_SetNTVOptional()
|
||||
MarkNativeAsOptional("Shavit_GetBhopStyle");
|
||||
MarkNativeAsOptional("Shavit_GetChatStrings");
|
||||
MarkNativeAsOptional("Shavit_GetClientJumps");
|
||||
MarkNativeAsOptional("Shavit_GetClientPB");
|
||||
MarkNativeAsOptional("Shavit_GetClientTime");
|
||||
MarkNativeAsOptional("Shavit_GetClientTrack");
|
||||
MarkNativeAsOptional("Shavit_GetDatabase");
|
||||
@ -1282,6 +1305,7 @@ public void __pl_shavit_SetNTVOptional()
|
||||
MarkNativeAsOptional("Shavit_GetTimeForRank");
|
||||
MarkNativeAsOptional("Shavit_GetTimer");
|
||||
MarkNativeAsOptional("Shavit_GetTimerStatus");
|
||||
MarkNativeAsOptional("Shavit_GetWorldRecord");
|
||||
MarkNativeAsOptional("Shavit_GetWRCount");
|
||||
MarkNativeAsOptional("Shavit_GetWRName");
|
||||
MarkNativeAsOptional("Shavit_GetWRRecordID");
|
||||
|
||||
@ -32,25 +32,24 @@
|
||||
#include <cstrike>
|
||||
|
||||
#define MAGIC_NUMBER 2147483648.0
|
||||
#define MAXLENGTH_NAME 192
|
||||
#define MAXLENGTH_TEXT 192
|
||||
#define MAXLENGTH_NAME 128
|
||||
#define MAXLENGTH_TEXT 128
|
||||
#define MAXLENGTH_MESSAGE 255
|
||||
#define MAXLENGTH_DISPLAY 192
|
||||
#define MAXLENGTH_CMESSAGE 16
|
||||
#define MAXLENGTH_BUFFER 255
|
||||
|
||||
enum ChatRanksCache
|
||||
enum struct chatranks_cache_t
|
||||
{
|
||||
iCRRangeType, // 0 - flat, 1 - percent, 2 - point range
|
||||
Float:fCRFrom,
|
||||
Float:fCRTo,
|
||||
bool:bCRFree,
|
||||
bool:bCREasterEgg,
|
||||
String:sCRAdminFlag[32],
|
||||
String:sCRName[MAXLENGTH_NAME],
|
||||
String:sCRMessage[MAXLENGTH_MESSAGE],
|
||||
String:sCRDisplay[MAXLENGTH_DISPLAY],
|
||||
CRCACHE_SIZE
|
||||
int iRangeType; // 0 - flat, 1 - percent, 2 - point range
|
||||
float fFrom;
|
||||
float fTo;
|
||||
bool bFree;
|
||||
bool bEasterEgg;
|
||||
char sAdminFlag[32];
|
||||
char sName[MAXLENGTH_NAME];
|
||||
char sMessage[MAXLENGTH_MESSAGE];
|
||||
char sDisplay[MAXLENGTH_DISPLAY];
|
||||
}
|
||||
|
||||
enum
|
||||
@ -77,11 +76,6 @@ ConVar gCV_RankingsIntegration = null;
|
||||
ConVar gCV_CustomChat = null;
|
||||
ConVar gCV_Colon = null;
|
||||
|
||||
// cached cvars
|
||||
bool gB_RankingsIntegration = true;
|
||||
int gI_CustomChat = 1;
|
||||
char gS_Colon[MAXLENGTH_CMESSAGE] = ":";
|
||||
|
||||
// cache
|
||||
EngineVersion gEV_Type = Engine_Unknown;
|
||||
|
||||
@ -148,10 +142,6 @@ public void OnPluginStart()
|
||||
gCV_CustomChat = CreateConVar("shavit_chat_customchat", "1", "Allow custom chat names or message colors?\n0 - Disabled\n1 - Enabled (requires chat flag/'shavit_chat' override)\n2 - Allow use by everyone", 0, true, 0.0, true, 2.0);
|
||||
gCV_Colon = CreateConVar("shavit_chat_colon", ":", "String to use as the colon when messaging.");
|
||||
|
||||
gCV_RankingsIntegration.AddChangeHook(OnConVarChanged);
|
||||
gCV_CustomChat.AddChangeHook(OnConVarChanged);
|
||||
gCV_Colon.AddChangeHook(OnConVarChanged);
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
gSM_Messages = new StringMap();
|
||||
@ -159,7 +149,7 @@ public void OnPluginStart()
|
||||
HookUserMessage(GetUserMessageId("SayText2"), Hook_SayText2, true);
|
||||
|
||||
gH_ChatCookie = RegClientCookie("shavit_chat_selection", "Chat settings", CookieAccess_Protected);
|
||||
gA_ChatRanks = new ArrayList(view_as<int>(CRCACHE_SIZE));
|
||||
gA_ChatRanks = new ArrayList(sizeof(chatranks_cache_t));
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
@ -206,18 +196,18 @@ bool LoadChatConfig()
|
||||
|
||||
do
|
||||
{
|
||||
any[] aChatTitle = new any[CRCACHE_SIZE];
|
||||
chatranks_cache_t chat_title;
|
||||
char sRanks[32];
|
||||
kv.GetString("ranks", sRanks, MAXLENGTH_NAME, "0");
|
||||
|
||||
if(sRanks[0] == 'p')
|
||||
{
|
||||
aChatTitle[iCRRangeType] = Rank_Points;
|
||||
chat_title.iRangeType = Rank_Points;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
aChatTitle[iCRRangeType] = (StrContains(sRanks, "%") == -1)? Rank_Flat:Rank_Percentage;
|
||||
chat_title.iRangeType = (StrContains(sRanks, "%") == -1)? Rank_Flat:Rank_Percentage;
|
||||
}
|
||||
|
||||
ReplaceString(sRanks, 32, "p", "");
|
||||
@ -227,29 +217,29 @@ bool LoadChatConfig()
|
||||
{
|
||||
char sExplodedString[2][16];
|
||||
ExplodeString(sRanks, "-", sExplodedString, 2, 64);
|
||||
aChatTitle[fCRFrom] = StringToFloat(sExplodedString[0]);
|
||||
aChatTitle[fCRTo] = StringToFloat(sExplodedString[1]);
|
||||
chat_title.fFrom = StringToFloat(sExplodedString[0]);
|
||||
chat_title.fTo = StringToFloat(sExplodedString[1]);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
float fRank = StringToFloat(sRanks);
|
||||
|
||||
aChatTitle[fCRFrom] = fRank;
|
||||
aChatTitle[fCRTo] = (aChatTitle[iCRRangeType] == Rank_Flat)? fRank:MAGIC_NUMBER;
|
||||
chat_title.fFrom = fRank;
|
||||
chat_title.fTo = (chat_title.iRangeType == Rank_Flat)? fRank:MAGIC_NUMBER;
|
||||
}
|
||||
|
||||
aChatTitle[bCRFree] = view_as<bool>(kv.GetNum("free", false));
|
||||
aChatTitle[bCREasterEgg] = view_as<bool>(kv.GetNum("easteregg", false));
|
||||
chat_title.bFree = view_as<bool>(kv.GetNum("free", false));
|
||||
chat_title.bEasterEgg = view_as<bool>(kv.GetNum("easteregg", false));
|
||||
|
||||
kv.GetString("name", aChatTitle[sCRName], MAXLENGTH_NAME, "{name}");
|
||||
kv.GetString("message", aChatTitle[sCRMessage], MAXLENGTH_MESSAGE, "");
|
||||
kv.GetString("display", aChatTitle[sCRDisplay], MAXLENGTH_DISPLAY, "");
|
||||
kv.GetString("flag", aChatTitle[sCRAdminFlag], 32, "");
|
||||
kv.GetString("name", chat_title.sName, MAXLENGTH_NAME, "{name}");
|
||||
kv.GetString("message", chat_title.sMessage, MAXLENGTH_MESSAGE, "");
|
||||
kv.GetString("display", chat_title.sDisplay, MAXLENGTH_DISPLAY, "");
|
||||
kv.GetString("flag", chat_title.sAdminFlag, 32, "");
|
||||
|
||||
if(strlen(aChatTitle[sCRDisplay]) > 0)
|
||||
if(strlen(chat_title.sDisplay) > 0)
|
||||
{
|
||||
gA_ChatRanks.PushArray(aChatTitle);
|
||||
gA_ChatRanks.PushArray(chat_title);
|
||||
}
|
||||
}
|
||||
|
||||
@ -340,23 +330,21 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl
|
||||
|
||||
if(gB_Protobuf)
|
||||
{
|
||||
Protobuf pbmsg = msg;
|
||||
Protobuf pbmsg = UserMessageToProtobuf(msg);
|
||||
client = pbmsg.ReadInt("ent_idx");
|
||||
pbmsg.ReadString("msg_name", sMessage, 32);
|
||||
pbmsg.ReadString("params", sOriginalName, MAXLENGTH_NAME, 0);
|
||||
pbmsg.ReadString("params", sOriginalText, MAXLENGTH_TEXT, 1);
|
||||
delete pbmsg;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
BfRead bfmsg = msg;
|
||||
BfRead bfmsg = UserMessageToBfRead(msg);
|
||||
client = bfmsg.ReadByte();
|
||||
bfmsg.ReadByte(); // chat parameter
|
||||
bfmsg.ReadString(sMessage, 32);
|
||||
bfmsg.ReadString(sOriginalName, MAXLENGTH_NAME);
|
||||
bfmsg.ReadString(sOriginalText, MAXLENGTH_TEXT);
|
||||
delete bfmsg;
|
||||
}
|
||||
|
||||
if(client == 0)
|
||||
@ -388,10 +376,13 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl
|
||||
ReplaceString(sOriginalText, MAXLENGTH_TEXT, gS_ControlCharacters[i], "");
|
||||
}
|
||||
|
||||
// fix an exploit that breaks chat colors in cs:s
|
||||
while(ReplaceString(sOriginalText, MAXLENGTH_TEXT, " ", " ") > 0) { }
|
||||
|
||||
char sName[MAXLENGTH_NAME];
|
||||
char sCMessage[MAXLENGTH_CMESSAGE];
|
||||
|
||||
if((gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)) && gI_ChatSelection[client] == -1)
|
||||
if((gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2)) && gI_ChatSelection[client] == -1)
|
||||
{
|
||||
if(gB_NameEnabled[client])
|
||||
{
|
||||
@ -412,29 +403,20 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl
|
||||
if(strlen(sName) > 0)
|
||||
{
|
||||
FormatChat(client, sName, MAXLENGTH_NAME);
|
||||
|
||||
if(gEV_Type == Engine_CSGO)
|
||||
{
|
||||
FormatEx(sOriginalName, MAXLENGTH_NAME, " %s", sName);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
strcopy(sOriginalName, MAXLENGTH_NAME, sName);
|
||||
}
|
||||
strcopy(sOriginalName, MAXLENGTH_NAME, sName);
|
||||
}
|
||||
|
||||
if(strlen(sMessage) > 0)
|
||||
{
|
||||
FormatChat(client, sCMessage, MAXLENGTH_CMESSAGE);
|
||||
|
||||
char sTemp[MAXLENGTH_CMESSAGE];
|
||||
char sFixedMessage[MAXLENGTH_MESSAGE];
|
||||
|
||||
// support RTL messages
|
||||
if(gB_RTLer && RTLify(sTemp, MAXLENGTH_CMESSAGE, sOriginalText) > 0)
|
||||
if(gB_RTLer && RTLify(sFixedMessage, MAXLENGTH_MESSAGE, sOriginalText) > 0)
|
||||
{
|
||||
TrimString(sOriginalText);
|
||||
Format(sOriginalText, MAXLENGTH_MESSAGE, "%s%s", sOriginalText, sCMessage);
|
||||
Format(sOriginalText, MAXLENGTH_MESSAGE, "%s%s", sFixedMessage, sCMessage);
|
||||
}
|
||||
|
||||
else
|
||||
@ -443,7 +425,10 @@ public Action Hook_SayText2(UserMsg msg_id, any msg, const int[] players, int pl
|
||||
}
|
||||
}
|
||||
|
||||
ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, gS_Colon, sOriginalText);
|
||||
char sColon[MAXLENGTH_CMESSAGE];
|
||||
gCV_Colon.GetString(sColon, MAXLENGTH_CMESSAGE);
|
||||
|
||||
ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, sColon, sOriginalText);
|
||||
|
||||
DataPack pack = new DataPack();
|
||||
pack.WriteCell(GetClientSerial(client)); // client serial
|
||||
@ -503,38 +488,32 @@ void Frame_SendText(DataPack pack)
|
||||
|
||||
if(gB_Protobuf)
|
||||
{
|
||||
Protobuf pbmsg = view_as<any>(hSayText2);
|
||||
// show colors in cs:go
|
||||
Format(sText, MAXLENGTH_BUFFER, " %s", sText);
|
||||
|
||||
Protobuf pbmsg = UserMessageToProtobuf(hSayText2);
|
||||
pbmsg.SetInt("ent_idx", client);
|
||||
pbmsg.SetBool("chat", true);
|
||||
pbmsg.SetString("msg_name", sText);
|
||||
|
||||
// needed to not crash
|
||||
for(int i = 1; i <= 4; i++)
|
||||
{
|
||||
pbmsg.AddString("params", "");
|
||||
}
|
||||
|
||||
delete pbmsg;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
BfWrite bfmsg = view_as<any>(hSayText2);
|
||||
BfWrite bfmsg = UserMessageToBfWrite(hSayText2);
|
||||
bfmsg.WriteByte(client);
|
||||
bfmsg.WriteByte(true);
|
||||
bfmsg.WriteString(sText);
|
||||
delete bfmsg;
|
||||
}
|
||||
|
||||
EndMessage();
|
||||
}
|
||||
|
||||
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
gB_RankingsIntegration = gCV_RankingsIntegration.BoolValue;
|
||||
gI_CustomChat = gCV_CustomChat.IntValue;
|
||||
gCV_Colon.GetString(gS_Colon, MAXLENGTH_CMESSAGE);
|
||||
}
|
||||
|
||||
public void Shavit_OnDatabaseLoaded()
|
||||
{
|
||||
gH_SQL = Shavit_GetDatabase();
|
||||
@ -690,7 +669,7 @@ public Action Command_CCName(int client, int args)
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
if(!(gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)))
|
||||
if(!(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2)))
|
||||
{
|
||||
Shavit_PrintToChat(client, "%T", "NoCommandAccess", client);
|
||||
|
||||
@ -739,7 +718,7 @@ public Action Command_CCMessage(int client, int args)
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
if(!(gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)))
|
||||
if(!(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2)))
|
||||
{
|
||||
Shavit_PrintToChat(client, "%T", "NoCommandAccess", client);
|
||||
|
||||
@ -798,7 +777,7 @@ Action ShowChatRanksMenu(int client, int item)
|
||||
FormatEx(sDisplay, MAXLENGTH_DISPLAY, "%T\n ", "AutoAssign", client);
|
||||
menu.AddItem("-2", sDisplay, (gI_ChatSelection[client] == -2)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT);
|
||||
|
||||
if(gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2))
|
||||
if(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2))
|
||||
{
|
||||
FormatEx(sDisplay, MAXLENGTH_DISPLAY, "%T\n ", "CustomChat", client);
|
||||
menu.AddItem("-1", sDisplay, (gI_ChatSelection[client] == -1)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT);
|
||||
@ -813,11 +792,11 @@ Action ShowChatRanksMenu(int client, int item)
|
||||
continue;
|
||||
}
|
||||
|
||||
any[] aCache = new any[CRCACHE_SIZE];
|
||||
gA_ChatRanks.GetArray(i, aCache, view_as<int>(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>", "\n");
|
||||
StrCat(sMenuDisplay, MAXLENGTH_DISPLAY, "\n "); // to add spacing between each entry
|
||||
|
||||
@ -874,11 +853,11 @@ Action ShowRanksMenu(int client, int item)
|
||||
|
||||
for(int i = 0; i < iLength; i++)
|
||||
{
|
||||
any[] aCache = new any[CRCACHE_SIZE];
|
||||
gA_ChatRanks.GetArray(i, aCache, view_as<int>(CRCACHE_SIZE));
|
||||
chatranks_cache_t cache;
|
||||
gA_ChatRanks.GetArray(i, cache, sizeof(chatranks_cache_t));
|
||||
|
||||
char sFlag[32];
|
||||
strcopy(sFlag, 32, aCache[sCRAdminFlag]);
|
||||
strcopy(sFlag, 32, cache.sAdminFlag);
|
||||
|
||||
bool bFlagAccess = false;
|
||||
int iSize = strlen(sFlag);
|
||||
@ -903,13 +882,13 @@ Action ShowRanksMenu(int client, int item)
|
||||
bFlagAccess = CheckCommandAccess(client, sFlag, 0, true);
|
||||
}
|
||||
|
||||
if(aCache[bCREasterEgg] || !bFlagAccess)
|
||||
if(cache.bEasterEgg || !bFlagAccess)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
char sDisplay[MAXLENGTH_DISPLAY];
|
||||
strcopy(sDisplay, MAXLENGTH_DISPLAY, aCache[sCRDisplay]);
|
||||
strcopy(sDisplay, MAXLENGTH_DISPLAY, cache.sDisplay);
|
||||
ReplaceString(sDisplay, MAXLENGTH_DISPLAY, "<n>", "\n");
|
||||
|
||||
char sExplodedString[2][32];
|
||||
@ -919,9 +898,9 @@ Action ShowRanksMenu(int client, int item)
|
||||
|
||||
char sRequirements[64];
|
||||
|
||||
if(!aCache[bCRFree])
|
||||
if(!cache.bFree)
|
||||
{
|
||||
if(aCache[fCRFrom] == 0.0 && (aCache[fCRFrom] == aCache[fCRTo] || aCache[fCRTo] == MAGIC_NUMBER))
|
||||
if(cache.fFrom == 0.0 && (cache.fFrom == cache.fTo || cache.fTo == MAGIC_NUMBER))
|
||||
{
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Unranked", client);
|
||||
}
|
||||
@ -929,44 +908,44 @@ Action ShowRanksMenu(int client, int item)
|
||||
else
|
||||
{
|
||||
// this is really ugly
|
||||
bool bRanged = (aCache[fCRFrom] != aCache[fCRTo] && aCache[fCRTo] != MAGIC_NUMBER);
|
||||
bool bRanged = (cache.fFrom != cache.fTo && cache.fTo != MAGIC_NUMBER);
|
||||
|
||||
if(aCache[iCRRangeType] == Rank_Flat)
|
||||
if(cache.iRangeType == Rank_Flat)
|
||||
{
|
||||
if(bRanged)
|
||||
{
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat_Ranged", client, RoundToZero(aCache[fCRFrom]), RoundToZero(aCache[fCRTo]));
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat_Ranged", client, RoundToZero(cache.fFrom), RoundToZero(cache.fTo));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat", client, RoundToZero(aCache[fCRFrom]));
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat", client, RoundToZero(cache.fFrom));
|
||||
}
|
||||
}
|
||||
|
||||
else if(aCache[iCRRangeType] == Rank_Percentage)
|
||||
else if(cache.iRangeType == Rank_Percentage)
|
||||
{
|
||||
if(bRanged)
|
||||
{
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage_Ranged", client, aCache[fCRFrom], '%', aCache[fCRTo], '%');
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage_Ranged", client, cache.fFrom, '%', cache.fTo, '%');
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage", client, aCache[fCRFrom], '%');
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage", client, cache.fFrom, '%');
|
||||
}
|
||||
}
|
||||
|
||||
else if(aCache[iCRRangeType] == Rank_Points)
|
||||
else if(cache.iRangeType == Rank_Points)
|
||||
{
|
||||
if(bRanged)
|
||||
{
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points_Ranged", client, RoundToZero(aCache[fCRFrom]), RoundToZero(aCache[fCRTo]));
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points_Ranged", client, RoundToZero(cache.fFrom), RoundToZero(cache.fTo));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points", client, RoundToZero(aCache[fCRFrom]));
|
||||
FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points", client, RoundToZero(cache.fFrom));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1025,33 +1004,27 @@ void PreviewChat(int client, int rank)
|
||||
ReplaceString(sOriginalName, MAXLENGTH_NAME, gS_ControlCharacters[i], "");
|
||||
}
|
||||
|
||||
any[] aCache = new any[CRCACHE_SIZE];
|
||||
gA_ChatRanks.GetArray(rank, aCache, view_as<int>(CRCACHE_SIZE));
|
||||
chatranks_cache_t cache;
|
||||
gA_ChatRanks.GetArray(rank, cache, sizeof(chatranks_cache_t));
|
||||
|
||||
char sName[MAXLENGTH_NAME];
|
||||
strcopy(sName, MAXLENGTH_NAME, aCache[sCRName]);
|
||||
strcopy(sName, MAXLENGTH_NAME, cache.sName);
|
||||
|
||||
char sCMessage[MAXLENGTH_CMESSAGE];
|
||||
strcopy(sCMessage, MAXLENGTH_CMESSAGE, aCache[sCRMessage]);
|
||||
strcopy(sCMessage, MAXLENGTH_CMESSAGE, cache.sMessage);
|
||||
|
||||
FormatChat(client, sName, MAXLENGTH_NAME);
|
||||
|
||||
if(gEV_Type == Engine_CSGO)
|
||||
{
|
||||
FormatEx(sOriginalName, MAXLENGTH_NAME, " %s", sName);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
strcopy(sOriginalName, MAXLENGTH_NAME, sName);
|
||||
}
|
||||
strcopy(sOriginalName, MAXLENGTH_NAME, sName);
|
||||
|
||||
FormatChat(client, sCMessage, MAXLENGTH_CMESSAGE);
|
||||
|
||||
char sSampleText[MAXLENGTH_MESSAGE];
|
||||
FormatEx(sSampleText, MAXLENGTH_MESSAGE, "%sThe quick brown fox jumps over the lazy dog", sCMessage);
|
||||
|
||||
ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, gS_Colon, sSampleText);
|
||||
char sColon[MAXLENGTH_CMESSAGE];
|
||||
gCV_Colon.GetString(sColon, MAXLENGTH_CMESSAGE);
|
||||
|
||||
ReplaceFormats(sTextFormatting, MAXLENGTH_BUFFER, sName, sColon, sSampleText);
|
||||
|
||||
Handle hSayText2 = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS);
|
||||
|
||||
@ -1059,7 +1032,10 @@ void PreviewChat(int client, int rank)
|
||||
{
|
||||
if(gB_Protobuf)
|
||||
{
|
||||
Protobuf pbmsg = view_as<any>(hSayText2);
|
||||
// show colors in cs:go
|
||||
Format(sTextFormatting, MAXLENGTH_BUFFER, " %s", sTextFormatting);
|
||||
|
||||
Protobuf pbmsg = UserMessageToProtobuf(hSayText2);
|
||||
pbmsg.SetInt("ent_idx", client);
|
||||
pbmsg.SetBool("chat", true);
|
||||
pbmsg.SetString("msg_name", sTextFormatting);
|
||||
@ -1068,17 +1044,14 @@ void PreviewChat(int client, int rank)
|
||||
{
|
||||
pbmsg.AddString("params", "");
|
||||
}
|
||||
|
||||
delete pbmsg;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
BfWrite bfmsg = view_as<any>(hSayText2);
|
||||
BfWrite bfmsg = UserMessageToBfWrite(hSayText2);
|
||||
bfmsg.WriteByte(client);
|
||||
bfmsg.WriteByte(true);
|
||||
bfmsg.WriteString(sTextFormatting);
|
||||
delete bfmsg;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1087,7 +1060,7 @@ void PreviewChat(int client, int rank)
|
||||
|
||||
bool HasRankAccess(int client, int rank)
|
||||
{
|
||||
bool bAllowCustom = gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2);
|
||||
bool bAllowCustom = gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2);
|
||||
|
||||
if(rank == -2 ||
|
||||
(rank == -1 && bAllowCustom))
|
||||
@ -1100,11 +1073,11 @@ bool HasRankAccess(int client, int rank)
|
||||
return false;
|
||||
}
|
||||
|
||||
any[] aCache = new any[CRCACHE_SIZE];
|
||||
gA_ChatRanks.GetArray(rank, aCache, view_as<int>(CRCACHE_SIZE));
|
||||
chatranks_cache_t cache;
|
||||
gA_ChatRanks.GetArray(rank, cache, sizeof(chatranks_cache_t));
|
||||
|
||||
char sFlag[32];
|
||||
strcopy(sFlag, 32, aCache[sCRAdminFlag]);
|
||||
strcopy(sFlag, 32, cache.sAdminFlag);
|
||||
|
||||
bool bFlagAccess = false;
|
||||
int iSize = strlen(sFlag);
|
||||
@ -1134,21 +1107,21 @@ bool HasRankAccess(int client, int rank)
|
||||
return false;
|
||||
}
|
||||
|
||||
if(aCache[bCRFree])
|
||||
if(cache.bFree)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if(!gB_Rankings || !gB_RankingsIntegration)
|
||||
if(!gB_Rankings || !gCV_RankingsIntegration.BoolValue)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
float fRank = (aCache[iCRRangeType] != Rank_Points)? float(Shavit_GetRank(client)):Shavit_GetPoints(client);
|
||||
float fRank = (cache.iRangeType != Rank_Points)? float(Shavit_GetRank(client)):Shavit_GetPoints(client);
|
||||
|
||||
if(aCache[iCRRangeType] == Rank_Flat || aCache[iCRRangeType] == Rank_Points)
|
||||
if(cache.iRangeType == Rank_Flat || cache.iRangeType == Rank_Points)
|
||||
{
|
||||
if(aCache[fCRFrom] <= fRank <= aCache[fCRTo])
|
||||
if(cache.fFrom <= fRank <= cache.fTo)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -1166,7 +1139,7 @@ bool HasRankAccess(int client, int rank)
|
||||
|
||||
float fPercentile = (fRank / iRanked) * 100.0;
|
||||
|
||||
if(aCache[fCRFrom] <= fPercentile <= aCache[fCRTo])
|
||||
if(cache.fFrom <= fPercentile <= cache.fTo)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -1202,11 +1175,11 @@ void GetPlayerChatSettings(int client, char[] name, char[] message)
|
||||
|
||||
if(0 <= iRank <= (iLength - 1))
|
||||
{
|
||||
any[] aCache = new any[CRCACHE_SIZE];
|
||||
gA_ChatRanks.GetArray(iRank, aCache, view_as<int>(CRCACHE_SIZE));
|
||||
chatranks_cache_t cache;
|
||||
gA_ChatRanks.GetArray(iRank, cache, sizeof(chatranks_cache_t));
|
||||
|
||||
strcopy(name, MAXLENGTH_NAME, aCache[sCRName]);
|
||||
strcopy(message, MAXLENGTH_NAME, aCache[sCRMessage]);
|
||||
strcopy(name, MAXLENGTH_NAME, cache.sName);
|
||||
strcopy(message, MAXLENGTH_NAME, cache.sMessage);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1221,7 +1194,7 @@ public Action Command_CCList(int client, int args)
|
||||
continue;
|
||||
}
|
||||
|
||||
if(gI_CustomChat > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2))
|
||||
if(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2))
|
||||
{
|
||||
PrintToConsole(client, "%N (%d/#%d) (name: \"%s\"; message: \"%s\")", i, i, GetClientUserId(i), gS_CustomName[i], gS_CustomMessage[i]);
|
||||
}
|
||||
@ -1378,7 +1351,7 @@ public void SQL_CreateTable_Callback(Database db, DBResultSet results, const cha
|
||||
continue;
|
||||
}
|
||||
|
||||
if(gI_CustomChat > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2))
|
||||
if(gCV_CustomChat.IntValue > 0 && (CheckCommandAccess(i, "shavit_chat", ADMFLAG_CHAT) || gCV_CustomChat.IntValue == 2))
|
||||
{
|
||||
LoadFromDatabase(i);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -64,7 +64,7 @@ ArrayList gA_ValidMaps = null;
|
||||
StringMap gA_MapTiers = null;
|
||||
|
||||
ConVar gCV_PointsPerTier = null;
|
||||
float gF_PointsPerTier = 50.0;
|
||||
ConVar gCV_WeightingMultiplier = null;
|
||||
|
||||
int gI_Rank[MAXPLAYERS+1];
|
||||
float gF_Points[MAXPLAYERS+1];
|
||||
@ -75,13 +75,12 @@ Menu gH_Top100Menu = null;
|
||||
Handle gH_Forwards_OnTierAssigned = null;
|
||||
|
||||
// Timer settings.
|
||||
char gS_ChatStrings[CHATSETTINGS_SIZE][128];
|
||||
chatstrings_t gS_ChatStrings;
|
||||
int gI_Styles = 0;
|
||||
stylesettings_t gA_StyleSettings[STYLE_LIMIT];
|
||||
char gS_StyleNames[STYLE_LIMIT][64];
|
||||
char gS_TrackNames[TRACKS_SIZE][32];
|
||||
|
||||
any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE];
|
||||
int gI_Styles = 0;
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] Rankings",
|
||||
@ -143,7 +142,7 @@ public void OnPluginStart()
|
||||
RegAdminCmd("sm_recalcall", Command_RecalcAll, ADMFLAG_ROOT, "Recalculate the points for every map on the server. Run this after you change the ranking multiplier for a style or after you install the plugin.");
|
||||
|
||||
gCV_PointsPerTier = CreateConVar("shavit_rankings_pointspertier", "50.0", "Base points to use for per-tier scaling.\nRead the design idea to see how it works: https://github.com/shavitush/bhoptimer/issues/465", 0, true, 1.0);
|
||||
gCV_PointsPerTier.AddChangeHook(OnConVarChanged);
|
||||
gCV_WeightingMultiplier = CreateConVar("shavit_rankings_weighting", "0.975", "Weighing multiplier. 1.0 to disable weighting.\nFormula: p[1] * this^0 + p[2] * this^1 + p[3] * this^2 + ... + p[n] * this^(n-1)\nRestart server to apply.", 0, true, 0.01, true, 1.0);
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
@ -165,10 +164,12 @@ public void OnPluginStart()
|
||||
|
||||
public void Shavit_OnChatConfigLoaded()
|
||||
{
|
||||
for(int i = 0; i < CHATSETTINGS_SIZE; i++)
|
||||
{
|
||||
Shavit_GetChatStrings(i, gS_ChatStrings[i], 128);
|
||||
}
|
||||
Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix));
|
||||
Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText));
|
||||
Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning));
|
||||
Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable));
|
||||
Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2));
|
||||
Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle));
|
||||
}
|
||||
|
||||
public void Shavit_OnStyleConfigLoaded(int styles)
|
||||
@ -319,11 +320,11 @@ public void SQL_CreateTable_Callback(Database db, DBResultSet results, const cha
|
||||
"LEAVE iter; " ...
|
||||
"END IF; " ...
|
||||
"SET total = total + (p * mult); " ...
|
||||
"SET mult = mult * 0.975; " ...
|
||||
"SET mult = mult * %f; " ...
|
||||
"END LOOP; " ...
|
||||
"CLOSE cur; " ...
|
||||
"RETURN total; " ...
|
||||
"END;;", gS_MySQLPrefix);
|
||||
"END;;", gS_MySQLPrefix, gCV_WeightingMultiplier.FloatValue);
|
||||
|
||||
RunLongFastQuery(bSuccess, "CREATE GetRecordPoints",
|
||||
"CREATE FUNCTION GetRecordPoints(rstyle INT, rtrack INT, rtime FLOAT, rmap CHAR(128), pointspertier FLOAT, stylemultiplier FLOAT) " ...
|
||||
@ -376,11 +377,6 @@ void RunLongFastQuery(bool &success, const char[] func, const char[] query, any
|
||||
}
|
||||
}
|
||||
|
||||
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
gF_PointsPerTier = gCV_PointsPerTier.FloatValue;
|
||||
}
|
||||
|
||||
public void OnClientConnected(int client)
|
||||
{
|
||||
gI_Rank[client] = 0;
|
||||
@ -548,7 +544,7 @@ public Action Command_Tier(int client, int args)
|
||||
}
|
||||
}
|
||||
|
||||
Shavit_PrintToChat(client, "%T", "CurrentTier", client, gS_ChatStrings[sMessageVariable], sMap, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], tier, gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "CurrentTier", client, gS_ChatStrings.sVariable, sMap, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, tier, gS_ChatStrings.sText);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@ -572,15 +568,15 @@ public Action Command_Rank(int client, int args)
|
||||
|
||||
if(gF_Points[target] == 0.0)
|
||||
{
|
||||
Shavit_PrintToChat(client, "%T", "Unranked", client, gS_ChatStrings[sMessageVariable2], target, gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "Unranked", client, gS_ChatStrings.sVariable2, target, gS_ChatStrings.sText);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
Shavit_PrintToChat(client, "%T", "Rank", client, gS_ChatStrings[sMessageVariable2], target, gS_ChatStrings[sMessageText],
|
||||
gS_ChatStrings[sMessageVariable], (gI_Rank[target] > gI_RankedPlayers)? gI_RankedPlayers:gI_Rank[target], gS_ChatStrings[sMessageText],
|
||||
Shavit_PrintToChat(client, "%T", "Rank", client, gS_ChatStrings.sVariable2, target, gS_ChatStrings.sText,
|
||||
gS_ChatStrings.sVariable, (gI_Rank[target] > gI_RankedPlayers)? gI_RankedPlayers:gI_Rank[target], gS_ChatStrings.sText,
|
||||
gI_RankedPlayers,
|
||||
gS_ChatStrings[sMessageVariable], gF_Points[target], gS_ChatStrings[sMessageText]);
|
||||
gS_ChatStrings.sVariable, gF_Points[target], gS_ChatStrings.sText);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@ -631,7 +627,7 @@ public Action Command_SetTier(int client, int args)
|
||||
Call_PushCell(tier);
|
||||
Call_Finish();
|
||||
|
||||
Shavit_PrintToChat(client, "%T", "SetTier", client, gS_ChatStrings[sMessageVariable2], tier, gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "SetTier", client, gS_ChatStrings.sVariable2, tier, gS_ChatStrings.sText);
|
||||
|
||||
char sQuery[256];
|
||||
FormatEx(sQuery, 256, "REPLACE INTO %smaptiers (map, tier) VALUES ('%s', %d);", gS_MySQLPrefix, gS_Map, tier);
|
||||
@ -673,14 +669,14 @@ public Action Command_RecalcAll(int client, int args)
|
||||
{
|
||||
char sQuery[192];
|
||||
|
||||
if(gA_StyleSettings[i][bUnranked] || view_as<float>(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<float>(gA_StyleSettings[i][fRankingMultiplier]), i);
|
||||
FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = GetRecordPoints(%d, track, time, map, %.1f, %.3f) WHERE style = %d;", gS_MySQLPrefix, i, gCV_PointsPerTier.FloatValue, gA_StyleSettings[i].fRankingMultiplier, i);
|
||||
}
|
||||
|
||||
trans.AddQuery(sQuery);
|
||||
@ -731,7 +727,7 @@ void RecalculateAll(const char[] map)
|
||||
{
|
||||
for(int j = 0; j < gI_Styles; j++)
|
||||
{
|
||||
if(gA_StyleSettings[j][bUnranked])
|
||||
if(gA_StyleSettings[j].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -753,7 +749,8 @@ void RecalculateMap(const char[] map, const int track, const int style)
|
||||
#endif
|
||||
|
||||
char sQuery[192];
|
||||
FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = GetRecordPoints(%d, %d, time, '%s', %.1f, %.3f) WHERE style = %d AND track = %d AND map = '%s';", gS_MySQLPrefix, style, track, map, gF_PointsPerTier, gA_StyleSettings[style][fRankingMultiplier], style, track, map);
|
||||
FormatEx(sQuery, 192, "UPDATE %splayertimes SET points = GetRecordPoints(%d, %d, time, '%s', %.1f, %.3f) WHERE style = %d AND track = %d AND map = '%s';",
|
||||
gS_MySQLPrefix, style, track, map, gCV_PointsPerTier.FloatValue, gA_StyleSettings[style].fRankingMultiplier, style, track, map);
|
||||
|
||||
gH_SQL.Query(SQL_Recalculate_Callback, sQuery, 0, DBPrio_High);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -38,9 +38,6 @@ StringMap gSM_RankSounds = null;
|
||||
// cvars
|
||||
ConVar gCV_MinimumWorst = null;
|
||||
|
||||
// cached cvars
|
||||
int gI_MinimumWorst = 10;
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] Sounds",
|
||||
@ -81,16 +78,9 @@ public void OnPluginStart()
|
||||
// cvars
|
||||
gCV_MinimumWorst = CreateConVar("shavit_sounds_minimumworst", "10", "Minimum amount of records to be saved for a \"worst\" sound to play.", 0, true, 1.0);
|
||||
|
||||
gCV_MinimumWorst.AddChangeHook(OnConVarChanged);
|
||||
|
||||
AutoExecConfig();
|
||||
}
|
||||
|
||||
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
gI_MinimumWorst = gCV_MinimumWorst.IntValue;
|
||||
}
|
||||
|
||||
public void OnLibraryAdded(const char[] name)
|
||||
{
|
||||
if(StrEqual(name, "shavit-hud"))
|
||||
@ -195,8 +185,7 @@ public void OnMapStart()
|
||||
|
||||
public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, int strafes, float sync, int rank, int overwrite, int track)
|
||||
{
|
||||
float fOldTime = 0.0;
|
||||
Shavit_GetPlayerPB(client, style, fOldTime, track);
|
||||
float fOldTime = Shavit_GetClientPB(client, style, track);
|
||||
|
||||
char sSound[PLATFORM_MAX_PATH];
|
||||
bool bEveryone = false;
|
||||
@ -234,7 +223,7 @@ public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, i
|
||||
|
||||
public void Shavit_OnWorstRecord(int client, int style, float time, int jumps, int strafes, float sync, int track)
|
||||
{
|
||||
if(gA_WorstSounds.Length != 0 && Shavit_GetRecordAmount(style, track) >= gI_MinimumWorst)
|
||||
if(gA_WorstSounds.Length != 0 && Shavit_GetRecordAmount(style, track) >= gCV_MinimumWorst.IntValue)
|
||||
{
|
||||
char sSound[PLATFORM_MAX_PATH];
|
||||
gA_WorstSounds.GetString(GetRandomInt(0, gA_WorstSounds.Length - 1), sSound, PLATFORM_MAX_PATH);
|
||||
|
||||
@ -59,17 +59,13 @@ bool gB_Late = false;
|
||||
ConVar gCV_MVPRankOnes = null;
|
||||
ConVar gCV_MVPRankOnes_Main = null;
|
||||
|
||||
// cached cvars
|
||||
int gI_MVPRankOnes = 2;
|
||||
bool gB_MVPRankOnes_Main = true;
|
||||
|
||||
// timer settings
|
||||
int gI_Styles = 0;
|
||||
char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128];
|
||||
any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE];
|
||||
stylestrings_t gS_StyleStrings[STYLE_LIMIT];
|
||||
stylesettings_t gA_StyleSettings[STYLE_LIMIT];
|
||||
|
||||
// chat settings
|
||||
char gS_ChatStrings[CHATSETTINGS_SIZE][128];
|
||||
chatstrings_t gS_ChatStrings;
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
@ -127,9 +123,6 @@ public void OnPluginStart()
|
||||
gCV_MVPRankOnes = CreateConVar("shavit_stats_mvprankones", "2", "Set the players' amount of MVPs to the amount of #1 times they have.\n0 - Disabled\n1 - Enabled, for all styles.\n2 - Enabled, for default style only.\n(CS:S/CS:GO only)", 0, true, 0.0, true, 2.0);
|
||||
gCV_MVPRankOnes_Main = CreateConVar("shavit_stats_mvprankones_maintrack", "1", "If set to 0, all tracks will be counted for the MVP stars.\nOtherwise, only the main track will be checked.\n\nRequires \"shavit_stats_mvprankones\" set to 1 or above.\n(CS:S/CS:GO only)", 0, true, 0.0, true, 1.0);
|
||||
|
||||
gCV_MVPRankOnes.AddChangeHook(OnConVarChanged);
|
||||
gCV_MVPRankOnes_Main.AddChangeHook(OnConVarChanged);
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
gB_Rankings = LibraryExists("shavit-rankings");
|
||||
@ -167,8 +160,8 @@ public void Shavit_OnStyleConfigLoaded(int styles)
|
||||
for(int i = 0; i < styles; i++)
|
||||
{
|
||||
Shavit_GetStyleSettings(i, gA_StyleSettings[i]);
|
||||
Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i][sStyleName], 128);
|
||||
Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i][sShortName], 128);
|
||||
Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName));
|
||||
Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i].sShortName, sizeof(stylestrings_t::sShortName));
|
||||
}
|
||||
|
||||
gI_Styles = styles;
|
||||
@ -176,16 +169,12 @@ public void Shavit_OnStyleConfigLoaded(int styles)
|
||||
|
||||
public void Shavit_OnChatConfigLoaded()
|
||||
{
|
||||
for(int i = 0; i < CHATSETTINGS_SIZE; i++)
|
||||
{
|
||||
Shavit_GetChatStrings(i, gS_ChatStrings[i], 128);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
gI_MVPRankOnes = gCV_MVPRankOnes.IntValue;
|
||||
gB_MVPRankOnes_Main = gCV_MVPRankOnes_Main.BoolValue;
|
||||
Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix));
|
||||
Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText));
|
||||
Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning));
|
||||
Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable));
|
||||
Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2));
|
||||
Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle));
|
||||
}
|
||||
|
||||
public void OnClientPutInServer(int client)
|
||||
@ -271,7 +260,7 @@ void SQL_SetPrefix()
|
||||
|
||||
public void Player_Event(Event event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
if(gI_MVPRankOnes == 0)
|
||||
if(gCV_MVPRankOnes.IntValue == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -297,14 +286,14 @@ void UpdateWRs(int client)
|
||||
{
|
||||
char sQuery[256];
|
||||
|
||||
if(gI_MVPRankOnes == 2)
|
||||
if(gCV_MVPRankOnes.IntValue == 2)
|
||||
{
|
||||
FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes WHERE style = 0 %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gB_MVPRankOnes_Main)? "AND track = 0 ":"", sAuthID);
|
||||
FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes WHERE style = 0 %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gCV_MVPRankOnes_Main.BoolValue)? "AND track = 0 ":"", sAuthID);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gB_MVPRankOnes_Main)? "WHERE track = 0 ":"", sAuthID);
|
||||
FormatEx(sQuery, 256, "SELECT COUNT(*) FROM %splayertimes a JOIN (SELECT MIN(time) time FROM %splayertimes %sGROUP by map) b ON a.time = b.time WHERE auth = '%s';", gS_MySQLPrefix, gS_MySQLPrefix, (gCV_MVPRankOnes_Main.BoolValue)? "WHERE track = 0 ":"", sAuthID);
|
||||
}
|
||||
|
||||
gH_SQL.Query(SQL_GetWRs_Callback, sQuery, GetClientSerial(client));
|
||||
@ -329,7 +318,7 @@ public void SQL_GetWRs_Callback(Database db, DBResultSet results, const char[] e
|
||||
|
||||
int iWRs = results.FetchInt(0);
|
||||
|
||||
if(gI_MVPRankOnes > 0 && gEV_Type != Engine_TF2)
|
||||
if(gCV_MVPRankOnes.IntValue > 0 && gEV_Type != Engine_TF2)
|
||||
{
|
||||
CS_SetMVPCount(client, iWRs);
|
||||
}
|
||||
@ -469,11 +458,13 @@ public void OpenStatsMenuCallback(Database db, DBResultSet results, const char[]
|
||||
FormatEx(sClearString, 128, "%T: %d/%d (%.01f%%)", "MapCompletions", client, iClears, iTotalMaps, ((float(iClears) / iTotalMaps) * 100.0));
|
||||
|
||||
Menu menu = new Menu(MenuHandler_ProfileHandler);
|
||||
menu.SetTitle("%s's %T. %s\n%T: %s\n%s\n%s\n[%s] %T: %d%s\n", gS_TargetName[client], "Profile", client, gS_TargetAuth[client], "Country", client, sCountry, sLastLogin, sClearString, gS_StyleStrings[0][sStyleName], "WorldRecords", client, iWRs, sRankingString);
|
||||
menu.SetTitle("%s's %T. %s\n%T: %s\n%s\n%s\n[%s] %T: %d%s\n",
|
||||
gS_TargetName[client], "Profile", client, gS_TargetAuth[client], "Country", client, sCountry, sLastLogin, sClearString,
|
||||
gS_StyleStrings[0].sStyleName, "WorldRecords", client, iWRs, sRankingString);
|
||||
|
||||
for(int i = 0; i < gI_Styles; i++)
|
||||
{
|
||||
if(gA_StyleSettings[i][bUnranked])
|
||||
if(gA_StyleSettings[i].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -481,7 +472,7 @@ public void OpenStatsMenuCallback(Database db, DBResultSet results, const char[]
|
||||
char sInfo[4];
|
||||
IntToString(i, sInfo, 4);
|
||||
|
||||
menu.AddItem(sInfo, gS_StyleStrings[i][sStyleName]);
|
||||
menu.AddItem(sInfo, gS_StyleStrings[i].sStyleName);
|
||||
}
|
||||
|
||||
// should NEVER happen
|
||||
@ -498,7 +489,7 @@ public void OpenStatsMenuCallback(Database db, DBResultSet results, const char[]
|
||||
|
||||
else
|
||||
{
|
||||
Shavit_PrintToChat(client, "%T", "StatsMenuFailure", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "StatsMenuFailure", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText);
|
||||
}
|
||||
}
|
||||
|
||||
@ -512,7 +503,7 @@ public int MenuHandler_ProfileHandler(Menu menu, MenuAction action, int param1,
|
||||
gBS_Style[param1] = StringToInt(sInfo);
|
||||
|
||||
Menu submenu = new Menu(MenuHandler_TypeHandler);
|
||||
submenu.SetTitle("%T", "MapsMenu", param1, gS_StyleStrings[gBS_Style[param1]][sShortName]);
|
||||
submenu.SetTitle("%T", "MapsMenu", param1, gS_StyleStrings[gBS_Style[param1]].sShortName);
|
||||
|
||||
for(int j = 0; j < TRACKS_SIZE; j++)
|
||||
{
|
||||
@ -636,12 +627,12 @@ public void ShowMapsCallback(Database db, DBResultSet results, const char[] erro
|
||||
|
||||
if(gI_MapType[client] == MAPSDONE)
|
||||
{
|
||||
menu.SetTitle("%T (%s)", "MapsDoneFor", client, gS_StyleStrings[gBS_Style[client]][sShortName], gS_TargetName[client], rows, sTrack);
|
||||
menu.SetTitle("%T (%s)", "MapsDoneFor", client, gS_StyleStrings[gBS_Style[client]].sShortName, gS_TargetName[client], rows, sTrack);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
menu.SetTitle("%T (%s)", "MapsLeftFor", client, gS_StyleStrings[gBS_Style[client]][sShortName], gS_TargetName[client], rows, sTrack);
|
||||
menu.SetTitle("%T (%s)", "MapsLeftFor", client, gS_StyleStrings[gBS_Style[client]].sShortName, gS_TargetName[client], rows, sTrack);
|
||||
}
|
||||
|
||||
while(results.FetchRow())
|
||||
@ -773,7 +764,7 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[]
|
||||
|
||||
// 3 - style
|
||||
int style = results.FetchInt(3);
|
||||
FormatEx(sDisplay, 128, "%T: %s", "Style", client, gS_StyleStrings[style][sStyleName]);
|
||||
FormatEx(sDisplay, 128, "%T: %s", "Style", client, gS_StyleStrings[style].sStyleName);
|
||||
menu.AddItem("-1", sDisplay);
|
||||
|
||||
// 4 - steamid3
|
||||
|
||||
@ -53,15 +53,6 @@ ConVar gCV_MinimumTimes = null;
|
||||
ConVar gCV_PlayerAmount = null;
|
||||
ConVar gCV_Style = null;
|
||||
|
||||
// cached cvars
|
||||
bool gB_Config = true;
|
||||
float gF_DefaultLimit = 60.0;
|
||||
bool gB_DynamicTimelimits = true;
|
||||
bool gB_ForceMapEnd = true;
|
||||
int gI_MinimumTimes = 5;
|
||||
int gI_PlayerAmount = 25;
|
||||
bool gB_Style = true;
|
||||
|
||||
// misc cache
|
||||
Handle gH_Timer = null;
|
||||
EngineVersion gEV_Type = Engine_Unknown;
|
||||
@ -117,13 +108,7 @@ public void OnPluginStart()
|
||||
gCV_PlayerAmount = CreateConVar("shavit_timelimit_playertime", "25", "Limited amount of times to grab from the database to calculate an average.\nREQUIRES \"shavit_timelimit_dynamic\" TO BE ENABLED!\nSet to 0 to have it \"unlimited\".", 0);
|
||||
gCV_Style = CreateConVar("shavit_timelimit_style", "1", "If set to 1, calculate an average only from times that the first (default: forwards) style was used to set.\nREQUIRES \"shavit_timelimit_dynamic\" TO BE ENABLED!", 0, true, 0.0, true, 1.0);
|
||||
|
||||
gCV_Config.AddChangeHook(OnConVarChanged);
|
||||
gCV_DefaultLimit.AddChangeHook(OnConVarChanged);
|
||||
gCV_DynamicTimelimits.AddChangeHook(OnConVarChanged);
|
||||
gCV_ForceMapEnd.AddChangeHook(OnConVarChanged);
|
||||
gCV_MinimumTimes.AddChangeHook(OnConVarChanged);
|
||||
gCV_PlayerAmount.AddChangeHook(OnConVarChanged);
|
||||
gCV_Style.AddChangeHook(OnConVarChanged);
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
@ -132,31 +117,20 @@ public void OnPluginStart()
|
||||
|
||||
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
gB_Config = gCV_Config.BoolValue;
|
||||
gF_DefaultLimit = gCV_DefaultLimit.FloatValue;
|
||||
gB_DynamicTimelimits = gCV_DynamicTimelimits.BoolValue;
|
||||
gB_ForceMapEnd = gCV_ForceMapEnd.BoolValue;
|
||||
gI_MinimumTimes = gCV_MinimumTimes.IntValue;
|
||||
gI_PlayerAmount = gCV_PlayerAmount.IntValue;
|
||||
gB_Style = gCV_Style.BoolValue;
|
||||
|
||||
if(convar == gCV_ForceMapEnd)
|
||||
if(view_as<bool>(StringToInt(newValue)) && gEV_Type != Engine_TF2)
|
||||
{
|
||||
if(gB_ForceMapEnd && gEV_Type != Engine_TF2)
|
||||
{
|
||||
gH_Timer = CreateTimer(1.0, Timer_PrintToChat, 0, TIMER_REPEAT);
|
||||
}
|
||||
gH_Timer = CreateTimer(1.0, Timer_PrintToChat, 0, TIMER_REPEAT);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
delete gH_Timer;
|
||||
}
|
||||
else
|
||||
{
|
||||
delete gH_Timer;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnConfigsExecuted()
|
||||
{
|
||||
if(gB_Config)
|
||||
if(gCV_Config.BoolValue)
|
||||
{
|
||||
if(mp_do_warmup_period != null)
|
||||
{
|
||||
@ -182,17 +156,17 @@ public void OnMapStart()
|
||||
return;
|
||||
}
|
||||
|
||||
if(gB_DynamicTimelimits)
|
||||
if(gCV_DynamicTimelimits.BoolValue)
|
||||
{
|
||||
StartCalculating();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
SetLimit(RoundToNearest(gF_DefaultLimit));
|
||||
SetLimit(RoundToNearest(gCV_DefaultLimit.FloatValue));
|
||||
}
|
||||
|
||||
if(gB_ForceMapEnd && gH_Timer == null && gEV_Type != Engine_TF2)
|
||||
if(gCV_ForceMapEnd.BoolValue && gH_Timer == null && gEV_Type != Engine_TF2)
|
||||
{
|
||||
gH_Timer = CreateTimer(1.0, Timer_PrintToChat, 0, TIMER_REPEAT);
|
||||
}
|
||||
@ -262,7 +236,7 @@ void StartCalculating()
|
||||
GetMapDisplayName(sMap, sMap, 160);
|
||||
|
||||
char sQuery[512];
|
||||
FormatEx(sQuery, 512, "SELECT COUNT(*), SUM(t.time) FROM (SELECT r.time, r.style FROM %splayertimes r WHERE r.map = '%s' AND r.track = 0 %sORDER BY r.time LIMIT %d) t;", gS_MySQLPrefix, sMap, (gB_Style)? "AND style = 0 ":"", gI_PlayerAmount);
|
||||
FormatEx(sQuery, 512, "SELECT COUNT(*), SUM(t.time) FROM (SELECT r.time, r.style FROM %splayertimes r WHERE r.map = '%s' AND r.track = 0 %sORDER BY r.time LIMIT %d) t;", gS_MySQLPrefix, sMap, (gCV_Style.BoolValue)? "AND style = 0 ":"", gCV_PlayerAmount.IntValue);
|
||||
|
||||
#if defined DEBUG
|
||||
PrintToServer("%s", sQuery);
|
||||
@ -284,7 +258,7 @@ public void SQL_GetMapTimes(Database db, DBResultSet results, const char[] error
|
||||
results.FetchRow();
|
||||
int iRows = results.FetchInt(0);
|
||||
|
||||
if(iRows >= gI_MinimumTimes)
|
||||
if(iRows >= gCV_MinimumTimes.IntValue)
|
||||
{
|
||||
float fTimeSum = results.FetchFloat(1);
|
||||
float fAverage = (fTimeSum / 60 / iRows);
|
||||
@ -331,7 +305,7 @@ public void SQL_GetMapTimes(Database db, DBResultSet results, const char[] error
|
||||
|
||||
else
|
||||
{
|
||||
SetLimit(RoundToNearest(gF_DefaultLimit));
|
||||
SetLimit(RoundToNearest(gCV_DefaultLimit.FloatValue));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -29,6 +29,14 @@
|
||||
|
||||
// #define DEBUG
|
||||
|
||||
enum struct wrcache_t
|
||||
{
|
||||
int iLastStyle;
|
||||
int iLastTrack;
|
||||
bool bPendingMenu;
|
||||
char sClientMap[128];
|
||||
};
|
||||
|
||||
bool gB_Late = false;
|
||||
bool gB_Rankings = false;
|
||||
bool gB_Stats = false;
|
||||
@ -45,10 +53,7 @@ bool gB_Connected = false;
|
||||
bool gB_MySQL = false;
|
||||
|
||||
// cache
|
||||
int gBS_LastWR[MAXPLAYERS+1];
|
||||
char gS_ClientMap[MAXPLAYERS+1][128];
|
||||
int gI_LastTrack[MAXPLAYERS+1];
|
||||
bool gB_PendingMenu[MAXPLAYERS+1];
|
||||
wrcache_t gA_WRCache[MAXPLAYERS+1];
|
||||
|
||||
char gS_Map[160]; // blame workshop paths being so fucking long
|
||||
ArrayList gA_ValidMaps = null;
|
||||
@ -73,17 +78,13 @@ char gS_MySQLPrefix[32];
|
||||
ConVar gCV_RecordsLimit = null;
|
||||
ConVar gCV_RecentLimit = null;
|
||||
|
||||
// cached cvars
|
||||
int gI_RecordsLimit = 50;
|
||||
int gI_RecentLimit = 50;
|
||||
|
||||
// timer settings
|
||||
int gI_Styles = 0;
|
||||
char gS_StyleStrings[STYLE_LIMIT][STYLESTRINGS_SIZE][128];
|
||||
any gA_StyleSettings[STYLE_LIMIT][STYLESETTINGS_SIZE];
|
||||
stylestrings_t gS_StyleStrings[STYLE_LIMIT];
|
||||
stylesettings_t gA_StyleSettings[STYLE_LIMIT];
|
||||
|
||||
// chat settings
|
||||
char gS_ChatStrings[CHATSETTINGS_SIZE][128];
|
||||
chatstrings_t gS_ChatStrings;
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
@ -97,10 +98,12 @@ public Plugin myinfo =
|
||||
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
|
||||
{
|
||||
// natives
|
||||
CreateNative("Shavit_GetClientPB", Native_GetClientPB);
|
||||
CreateNative("Shavit_GetPlayerPB", Native_GetPlayerPB);
|
||||
CreateNative("Shavit_GetRankForTime", Native_GetRankForTime);
|
||||
CreateNative("Shavit_GetRecordAmount", Native_GetRecordAmount);
|
||||
CreateNative("Shavit_GetTimeForRank", Native_GetTimeForRank);
|
||||
CreateNative("Shavit_GetWorldRecord", Native_GetWorldRecord);
|
||||
CreateNative("Shavit_GetWRName", Native_GetWRName);
|
||||
CreateNative("Shavit_GetWRRecordID", Native_GetWRRecordID);
|
||||
CreateNative("Shavit_GetWRTime", Native_GetWRTime);
|
||||
@ -161,9 +164,6 @@ public void OnPluginStart()
|
||||
gCV_RecordsLimit = CreateConVar("shavit_wr_recordlimit", "50", "Limit of records shown in the WR menu.\nAdvised to not set above 1,000 because scrolling through so many pages is useless.\n(And can also cause the command to take long time to run)", 0, true, 1.0);
|
||||
gCV_RecentLimit = CreateConVar("shavit_wr_recentlimit", "50", "Limit of records shown in the RR menu.", 0, true, 1.0);
|
||||
|
||||
gCV_RecordsLimit.AddChangeHook(OnConVarChanged);
|
||||
gCV_RecentLimit.AddChangeHook(OnConVarChanged);
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
// admin menu
|
||||
@ -182,12 +182,6 @@ public void OnPluginStart()
|
||||
SQL_SetPrefix();
|
||||
}
|
||||
|
||||
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
gI_RecordsLimit = gCV_RecordsLimit.IntValue;
|
||||
gI_RecentLimit = gCV_RecentLimit.IntValue;
|
||||
}
|
||||
|
||||
public void OnAdminMenuCreated(Handle topmenu)
|
||||
{
|
||||
if(gH_AdminMenu == null || (topmenu == gH_AdminMenu && gH_TimerCommands != INVALID_TOPMENUOBJECT))
|
||||
@ -384,8 +378,8 @@ public void Shavit_OnStyleConfigLoaded(int styles)
|
||||
for(int i = 0; i < styles; i++)
|
||||
{
|
||||
Shavit_GetStyleSettings(i, gA_StyleSettings[i]);
|
||||
Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i][sStyleName], 128);
|
||||
Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i][sShortName], 128);
|
||||
Shavit_GetStyleStrings(i, sStyleName, gS_StyleStrings[i].sStyleName, sizeof(stylestrings_t::sStyleName));
|
||||
Shavit_GetStyleStrings(i, sShortName, gS_StyleStrings[i].sShortName, sizeof(stylestrings_t::sShortName));
|
||||
}
|
||||
|
||||
// arrays
|
||||
@ -416,15 +410,17 @@ public void Shavit_OnStyleConfigLoaded(int styles)
|
||||
|
||||
public void Shavit_OnChatConfigLoaded()
|
||||
{
|
||||
for(int i = 0; i < CHATSETTINGS_SIZE; i++)
|
||||
{
|
||||
Shavit_GetChatStrings(i, gS_ChatStrings[i], 128);
|
||||
}
|
||||
Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix));
|
||||
Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText));
|
||||
Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning));
|
||||
Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable));
|
||||
Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2));
|
||||
Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle));
|
||||
}
|
||||
|
||||
public void OnClientPutInServer(int client)
|
||||
{
|
||||
gB_PendingMenu[client] = false;
|
||||
gA_WRCache[client].bPendingMenu = false;
|
||||
|
||||
for(int i = 0; i < gI_Styles; i++)
|
||||
{
|
||||
@ -534,7 +530,7 @@ public void SQL_UpdateWRCache_Callback(Database db, DBResultSet results, const c
|
||||
{
|
||||
int style = results.FetchInt(0);
|
||||
|
||||
if(style >= gI_Styles || style < 0 || gA_StyleSettings[style][bUnranked])
|
||||
if(style >= gI_Styles || style < 0 || gA_StyleSettings[style].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -550,6 +546,11 @@ public void SQL_UpdateWRCache_Callback(Database db, DBResultSet results, const c
|
||||
UpdateLeaderboards();
|
||||
}
|
||||
|
||||
public int Native_GetWorldRecord(Handle handler, int numParams)
|
||||
{
|
||||
return view_as<int>(gF_WRTime[GetNativeCell(1)][GetNativeCell(2)]);
|
||||
}
|
||||
|
||||
public int Native_GetWRTime(Handle handler, int numParams)
|
||||
{
|
||||
SetNativeCellRef(2, gF_WRTime[GetNativeCell(1)][GetNativeCell(3)]);
|
||||
@ -565,6 +566,11 @@ public int Native_GetWRName(Handle handler, int numParams)
|
||||
SetNativeString(2, gS_WRName[GetNativeCell(1)][GetNativeCell(4)], GetNativeCell(3));
|
||||
}
|
||||
|
||||
public int Native_GetClientPB(Handle handler, int numParams)
|
||||
{
|
||||
return view_as<int>(gF_PlayerRecord[GetNativeCell(1)][GetNativeCell(2)][GetNativeCell(3)]);
|
||||
}
|
||||
|
||||
public int Native_GetPlayerPB(Handle handler, int numParams)
|
||||
{
|
||||
SetNativeCellRef(3, gF_PlayerRecord[GetNativeCell(1)][GetNativeCell(2)][GetNativeCell(4)]);
|
||||
@ -721,7 +727,7 @@ public int MenuHandler_Delete_First(Menu menu, MenuAction action, int param1, in
|
||||
{
|
||||
char info[16];
|
||||
menu.GetItem(param2, info, 16);
|
||||
gI_LastTrack[param1] = StringToInt(info);
|
||||
gA_WRCache[param1].iLastTrack = StringToInt(info);
|
||||
|
||||
DeleteSubmenu(param1);
|
||||
}
|
||||
@ -745,9 +751,9 @@ void DeleteSubmenu(int client)
|
||||
IntToString(i, sInfo, 8);
|
||||
|
||||
char sDisplay[64];
|
||||
FormatEx(sDisplay, 64, "%s (%T: %d)", gS_StyleStrings[i][sStyleName], "WRRecord", client, gI_RecordAmount[i][gI_LastTrack[client]]);
|
||||
FormatEx(sDisplay, 64, "%s (%T: %d)", gS_StyleStrings[i].sStyleName, "WRRecord", client, gI_RecordAmount[i][gA_WRCache[client].iLastTrack]);
|
||||
|
||||
menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][gI_LastTrack[client]] > 0)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED);
|
||||
menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][gA_WRCache[client].iLastTrack] > 0)? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED);
|
||||
}
|
||||
|
||||
menu.ExitButton = true;
|
||||
@ -794,7 +800,7 @@ public int MenuHandler_DeleteAll_First(Menu menu, MenuAction action, int param1,
|
||||
{
|
||||
char info[16];
|
||||
menu.GetItem(param2, info, 16);
|
||||
gI_LastTrack[param1] = StringToInt(info);
|
||||
gA_WRCache[param1].iLastTrack = StringToInt(info);
|
||||
|
||||
DeleteAllSubmenu(param1);
|
||||
}
|
||||
@ -810,7 +816,7 @@ public int MenuHandler_DeleteAll_First(Menu menu, MenuAction action, int param1,
|
||||
void DeleteAllSubmenu(int client)
|
||||
{
|
||||
char sTrack[32];
|
||||
GetTrackName(client, gI_LastTrack[client], sTrack, 32);
|
||||
GetTrackName(client, gA_WRCache[client].iLastTrack, sTrack, 32);
|
||||
|
||||
Menu menu = new Menu(MenuHandler_DeleteAll);
|
||||
menu.SetTitle("%T\n ", "DeleteAllRecordsMenuTitle", client, gS_Map, sTrack);
|
||||
@ -851,12 +857,12 @@ public int MenuHandler_DeleteAll(Menu menu, MenuAction action, int param1, int p
|
||||
}
|
||||
|
||||
char sTrack[32];
|
||||
GetTrackName(LANG_SERVER, gI_LastTrack[param1], sTrack, 32);
|
||||
GetTrackName(LANG_SERVER, gA_WRCache[param1].iLastTrack, sTrack, 32);
|
||||
|
||||
Shavit_LogMessage("%L - deleted all %s track records from map `%s`.", param1, sTrack, gS_Map);
|
||||
|
||||
char sQuery[256];
|
||||
FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s' AND track = %d;", gS_MySQLPrefix, gS_Map, gI_LastTrack[param1]);
|
||||
FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s' AND track = %d;", gS_MySQLPrefix, gS_Map, gA_WRCache[param1].iLastTrack);
|
||||
|
||||
gH_SQL.Query(DeleteAll_Callback, sQuery, GetClientSerial(param1), DBPrio_High);
|
||||
}
|
||||
@ -881,7 +887,7 @@ public Action Command_DeleteStyleRecords(int client, int args)
|
||||
|
||||
for(int i = 0; i < gI_Styles; i++)
|
||||
{
|
||||
if(gA_StyleSettings[i][bUnranked])
|
||||
if(gA_StyleSettings[i].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -890,7 +896,7 @@ public Action Command_DeleteStyleRecords(int client, int args)
|
||||
IntToString(i, sInfo, 8);
|
||||
|
||||
char sDisplay[64];
|
||||
FormatEx(sDisplay, 64, "%s (%d %T)", gS_StyleStrings[i][sStyleName], gI_RecordAmount[i], "WRRecord", client);
|
||||
FormatEx(sDisplay, 64, "%s (%d %T)", gS_StyleStrings[i].sStyleName, gI_RecordAmount[i], "WRRecord", client);
|
||||
|
||||
int iTotalAmount = 0;
|
||||
|
||||
@ -938,7 +944,7 @@ public int MenuHandler_DeleteStyleRecords(Menu menu, MenuAction action, int para
|
||||
char sMenuItem[128];
|
||||
|
||||
Menu submenu = new Menu(MenuHandler_DeleteStyleRecords_Confirm);
|
||||
submenu.SetTitle("%T\n ", "DeleteConfirmStyle", param1, gS_StyleStrings[style][sStyleName]);
|
||||
submenu.SetTitle("%T\n ", "DeleteConfirmStyle", param1, gS_StyleStrings[style].sStyleName);
|
||||
|
||||
for(int i = 1; i <= GetRandomInt(1, 4); i++)
|
||||
{
|
||||
@ -946,7 +952,7 @@ public int MenuHandler_DeleteStyleRecords(Menu menu, MenuAction action, int para
|
||||
submenu.AddItem("-1", sMenuItem);
|
||||
}
|
||||
|
||||
FormatEx(sMenuItem, 128, "%T", "MenuResponseYesStyle", param1, gS_StyleStrings[style][sStyleName]);
|
||||
FormatEx(sMenuItem, 128, "%T", "MenuResponseYesStyle", param1, gS_StyleStrings[style].sStyleName);
|
||||
|
||||
IntToString(style, info, 16);
|
||||
submenu.AddItem(info, sMenuItem);
|
||||
@ -985,7 +991,7 @@ public int MenuHandler_DeleteStyleRecords_Confirm(Menu menu, MenuAction action,
|
||||
return 0;
|
||||
}
|
||||
|
||||
Shavit_LogMessage("%L - deleted all %s style records from map `%s`.", param1, gS_StyleStrings[style][sStyleName], gS_Map);
|
||||
Shavit_LogMessage("%L - deleted all %s style records from map `%s`.", param1, gS_StyleStrings[style].sStyleName, gS_Map);
|
||||
|
||||
char sQuery[256];
|
||||
FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s' AND style = %d;", gS_MySQLPrefix, gS_Map, style);
|
||||
@ -1033,7 +1039,7 @@ public void DeleteStyleRecords_Callback(Database db, DBResultSet results, const
|
||||
return;
|
||||
}
|
||||
|
||||
Shavit_PrintToChat(client, "%T", "DeletedRecordsStyle", client, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "DeletedRecordsStyle", client, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText);
|
||||
}
|
||||
|
||||
public int MenuHandler_Delete(Menu menu, MenuAction action, int param1, int param2)
|
||||
@ -1060,7 +1066,7 @@ void OpenDelete(int client, int style)
|
||||
{
|
||||
char sQuery[512];
|
||||
|
||||
FormatEx(sQuery, 512, "SELECT p.id, u.name, p.time, p.jumps FROM %splayertimes p JOIN %susers u ON p.auth = u.auth WHERE map = '%s' AND style = %d AND track = %d ORDER BY time ASC, date ASC LIMIT 1000;", gS_MySQLPrefix, gS_MySQLPrefix, gS_Map, style, gI_LastTrack[client]);
|
||||
FormatEx(sQuery, 512, "SELECT p.id, u.name, p.time, p.jumps FROM %splayertimes p JOIN %susers u ON p.auth = u.auth WHERE map = '%s' AND style = %d AND track = %d ORDER BY time ASC, date ASC LIMIT 1000;", gS_MySQLPrefix, gS_MySQLPrefix, gS_Map, style, gA_WRCache[client].iLastTrack);
|
||||
DataPack datapack = new DataPack();
|
||||
datapack.WriteCell(GetClientSerial(client));
|
||||
datapack.WriteCell(style);
|
||||
@ -1088,7 +1094,7 @@ public void SQL_OpenDelete_Callback(Database db, DBResultSet results, const char
|
||||
}
|
||||
|
||||
Menu menu = new Menu(OpenDelete_Handler);
|
||||
menu.SetTitle("%t", "ListClientRecords", gS_Map, gS_StyleStrings[style][sStyleName]);
|
||||
menu.SetTitle("%t", "ListClientRecords", gS_Map, gS_StyleStrings[style].sStyleName);
|
||||
|
||||
int iCount = 0;
|
||||
|
||||
@ -1199,7 +1205,7 @@ public int DeleteConfirm_Handler(Menu menu, MenuAction action, int param1, int p
|
||||
|
||||
for(int i = 0; i < gI_Styles; i++)
|
||||
{
|
||||
if(gA_StyleSettings[i][bUnranked])
|
||||
if(gA_StyleSettings[i].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -1287,7 +1293,7 @@ public void DeleteAll_Callback(Database db, DBResultSet results, const char[] er
|
||||
|
||||
for(int i = 0; i < gI_Styles; i++)
|
||||
{
|
||||
if(gA_StyleSettings[i][bUnranked])
|
||||
if(gA_StyleSettings[i].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -1295,11 +1301,11 @@ public void DeleteAll_Callback(Database db, DBResultSet results, const char[] er
|
||||
Call_StartForward(gH_OnWRDeleted);
|
||||
Call_PushCell(i);
|
||||
Call_PushCell(-1);
|
||||
Call_PushCell(gI_LastTrack[client]);
|
||||
Call_PushCell(gA_WRCache[client].iLastTrack);
|
||||
Call_Finish();
|
||||
}
|
||||
|
||||
Shavit_PrintToChat(client, "%T", "DeletedRecordsMap", client, gS_ChatStrings[sMessageVariable], gS_Map, gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "DeletedRecordsMap", client, gS_ChatStrings.sVariable, gS_Map, gS_ChatStrings.sText);
|
||||
}
|
||||
|
||||
public Action Command_WorldRecord(int client, int args)
|
||||
@ -1311,13 +1317,13 @@ public Action Command_WorldRecord(int client, int args)
|
||||
|
||||
if(args == 0)
|
||||
{
|
||||
strcopy(gS_ClientMap[client], 128, gS_Map);
|
||||
strcopy(gA_WRCache[client].sClientMap, 128, gS_Map);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
GetCmdArgString(gS_ClientMap[client], 128);
|
||||
GuessBestMapName(gS_ClientMap[client], gS_ClientMap[client], 128);
|
||||
GetCmdArgString(gA_WRCache[client].sClientMap, 128);
|
||||
GuessBestMapName(gA_WRCache[client].sClientMap, gA_WRCache[client].sClientMap, 128);
|
||||
}
|
||||
|
||||
return ShowWRStyleMenu(client, Track_Main);
|
||||
@ -1332,13 +1338,13 @@ public Action Command_WorldRecord_Bonus(int client, int args)
|
||||
|
||||
if(args == 0)
|
||||
{
|
||||
strcopy(gS_ClientMap[client], 128, gS_Map);
|
||||
strcopy(gA_WRCache[client].sClientMap, 128, gS_Map);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
GetCmdArgString(gS_ClientMap[client], 128);
|
||||
GuessBestMapName(gS_ClientMap[client], gS_ClientMap[client], 128);
|
||||
GetCmdArgString(gA_WRCache[client].sClientMap, 128);
|
||||
GuessBestMapName(gA_WRCache[client].sClientMap, gA_WRCache[client].sClientMap, 128);
|
||||
}
|
||||
|
||||
return ShowWRStyleMenu(client, Track_Bonus);
|
||||
@ -1346,14 +1352,14 @@ public Action Command_WorldRecord_Bonus(int client, int args)
|
||||
|
||||
Action ShowWRStyleMenu(int client, int track)
|
||||
{
|
||||
gI_LastTrack[client] = track;
|
||||
gA_WRCache[client].iLastTrack = track;
|
||||
|
||||
Menu menu = new Menu(MenuHandler_StyleChooser);
|
||||
menu.SetTitle("%T", "WRMenuTitle", client);
|
||||
|
||||
for(int i = 0; i < gI_Styles; i++)
|
||||
{
|
||||
if(gA_StyleSettings[i][bUnranked])
|
||||
if(gA_StyleSettings[i].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -1363,20 +1369,20 @@ Action ShowWRStyleMenu(int client, int track)
|
||||
|
||||
char sDisplay[64];
|
||||
|
||||
if(StrEqual(gS_ClientMap[client], gS_Map) && gF_WRTime[i][track] > 0.0)
|
||||
if(StrEqual(gA_WRCache[client].sClientMap, gS_Map) && gF_WRTime[i][track] > 0.0)
|
||||
{
|
||||
char sTime[32];
|
||||
FormatSeconds(gF_WRTime[i][track], sTime, 32, false);
|
||||
|
||||
FormatEx(sDisplay, 64, "%s - WR: %s", gS_StyleStrings[i][sStyleName], sTime);
|
||||
FormatEx(sDisplay, 64, "%s - WR: %s", gS_StyleStrings[i].sStyleName, sTime);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
strcopy(sDisplay, 64, gS_StyleStrings[i][sStyleName]);
|
||||
strcopy(sDisplay, 64, gS_StyleStrings[i].sStyleName);
|
||||
}
|
||||
|
||||
menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][track] > 0 || !StrEqual(gS_ClientMap[client], gS_Map))? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED);
|
||||
menu.AddItem(sInfo, sDisplay, (gI_RecordAmount[i][track] > 0 || !StrEqual(gA_WRCache[client].sClientMap, gS_Map))? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED);
|
||||
}
|
||||
|
||||
// should NEVER happen
|
||||
@ -1409,14 +1415,14 @@ public int MenuHandler_StyleChooser(Menu menu, MenuAction action, int param1, in
|
||||
|
||||
if(iStyle == -1)
|
||||
{
|
||||
Shavit_PrintToChat(param1, "%T", "NoStyles", param1, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(param1, "%T", "NoStyles", param1, gS_ChatStrings.sWarning, gS_ChatStrings.sText);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
gBS_LastWR[param1] = iStyle;
|
||||
gA_WRCache[param1].iLastStyle = iStyle;
|
||||
|
||||
StartWRMenu(param1, gS_ClientMap[param1], iStyle, gI_LastTrack[param1]);
|
||||
StartWRMenu(param1, gA_WRCache[param1].sClientMap, iStyle, gA_WRCache[param1].iLastTrack);
|
||||
}
|
||||
|
||||
else if(action == MenuAction_End)
|
||||
@ -1478,7 +1484,7 @@ public void SQL_WR_Callback(Database db, DBResultSet results, const char[] error
|
||||
|
||||
while(results.FetchRow())
|
||||
{
|
||||
if(++iCount <= gI_RecordsLimit)
|
||||
if(++iCount <= gCV_RecordsLimit.IntValue)
|
||||
{
|
||||
// 0 - record id, for statistic purposes.
|
||||
int id = results.FetchInt(0);
|
||||
@ -1525,12 +1531,13 @@ public void SQL_WR_Callback(Database db, DBResultSet results, const char[] error
|
||||
|
||||
else
|
||||
{
|
||||
int iStyle = gA_WRCache[client].iLastStyle;
|
||||
int iRecords = results.RowCount;
|
||||
|
||||
// [32] just in case there are 150k records on a map and you're ranked 100k or something
|
||||
char sRanks[32];
|
||||
|
||||
if(gF_PlayerRecord[client][gBS_LastWR[client]][track] == 0.0 || iMyRank == 0)
|
||||
if(gF_PlayerRecord[client][iStyle][track] == 0.0 || iMyRank == 0)
|
||||
{
|
||||
FormatEx(sRanks, 32, "(%d %T)", iRecords, "WRRecord", client);
|
||||
}
|
||||
@ -1566,13 +1573,13 @@ public int WRMenu_Handler(Menu menu, MenuAction action, int param1, int param2)
|
||||
|
||||
else
|
||||
{
|
||||
ShowWRStyleMenu(param1, gI_LastTrack[param1]);
|
||||
ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack);
|
||||
}
|
||||
}
|
||||
|
||||
else if(action == MenuAction_Cancel && param2 == MenuCancel_ExitBack)
|
||||
{
|
||||
ShowWRStyleMenu(param1, gI_LastTrack[param1]);
|
||||
ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack);
|
||||
}
|
||||
|
||||
else if(action == MenuAction_End)
|
||||
@ -1585,7 +1592,7 @@ public int WRMenu_Handler(Menu menu, MenuAction action, int param1, int param2)
|
||||
|
||||
public Action Command_RecentRecords(int client, int args)
|
||||
{
|
||||
if(gB_PendingMenu[client] || !IsValidClient(client))
|
||||
if(gA_WRCache[client].bPendingMenu || !IsValidClient(client))
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@ -1600,7 +1607,7 @@ public Action Command_RecentRecords(int client, int args)
|
||||
|
||||
gH_SQL.Query(SQL_RR_Callback, sQuery, GetClientSerial(client), DBPrio_Low);
|
||||
|
||||
gB_PendingMenu[client] = true;
|
||||
gA_WRCache[client].bPendingMenu = true;
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@ -1609,7 +1616,7 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error
|
||||
{
|
||||
int client = GetClientFromSerial(data);
|
||||
|
||||
gB_PendingMenu[client] = false;
|
||||
gA_WRCache[client].bPendingMenu = false;
|
||||
|
||||
if(results == null)
|
||||
{
|
||||
@ -1624,7 +1631,7 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error
|
||||
}
|
||||
|
||||
Menu menu = new Menu(RRMenu_Handler);
|
||||
menu.SetTitle("%T:", "RecentRecords", client, gI_RecentLimit);
|
||||
menu.SetTitle("%T:", "RecentRecords", client, gCV_RecentLimit.IntValue);
|
||||
|
||||
while(results.FetchRow())
|
||||
{
|
||||
@ -1654,12 +1661,12 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error
|
||||
|
||||
if(gB_Rankings && fPoints > 0.0)
|
||||
{
|
||||
FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%.03f %T)", gS_StyleStrings[style][sShortName], sTrack[0], sMap, sName, sTime, fPoints, "WRPoints", client);
|
||||
FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%.03f %T)", gS_StyleStrings[style].sShortName, sTrack[0], sMap, sName, sTime, fPoints, "WRPoints", client);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%d %T)", gS_StyleStrings[style][sShortName], sTrack[0], sMap, sName, sTime, jumps, "WRJumps", client);
|
||||
FormatEx(sDisplay, 192, "[%s, %c] %s - %s @ %s (%d %T)", gS_StyleStrings[style].sShortName, sTrack[0], sMap, sName, sTime, jumps, "WRJumps", client);
|
||||
}
|
||||
|
||||
char sInfo[192];
|
||||
@ -1679,37 +1686,37 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error
|
||||
menu.Display(client, 60);
|
||||
}
|
||||
|
||||
public int RRMenu_Handler(Menu m, MenuAction action, int param1, int param2)
|
||||
public int RRMenu_Handler(Menu menu, MenuAction action, int param1, int param2)
|
||||
{
|
||||
if(action == MenuAction_Select)
|
||||
{
|
||||
char sInfo[128];
|
||||
m.GetItem(param2, sInfo, 128);
|
||||
menu.GetItem(param2, sInfo, 128);
|
||||
|
||||
if(StringToInt(sInfo) != -1)
|
||||
{
|
||||
char sExploded[2][128];
|
||||
ExplodeString(sInfo, ";", sExploded, 2, 128, true);
|
||||
|
||||
strcopy(gS_ClientMap[param1], 128, sExploded[1]);
|
||||
strcopy(gA_WRCache[param1].sClientMap, 128, sExploded[1]);
|
||||
|
||||
OpenSubMenu(param1, StringToInt(sExploded[0]));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
ShowWRStyleMenu(param1, gI_LastTrack[param1]);
|
||||
ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack);
|
||||
}
|
||||
}
|
||||
|
||||
else if(action == MenuAction_Cancel && param2 == MenuCancel_ExitBack)
|
||||
{
|
||||
ShowWRStyleMenu(param1, gI_LastTrack[param1]);
|
||||
ShowWRStyleMenu(param1, gA_WRCache[param1].iLastTrack);
|
||||
}
|
||||
|
||||
else if(action == MenuAction_End)
|
||||
{
|
||||
delete m;
|
||||
delete menu;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1773,7 +1780,7 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[]
|
||||
int jumps = results.FetchInt(2);
|
||||
float perfs = results.FetchFloat(9);
|
||||
|
||||
if(gA_StyleSettings[style][bAutobhop] && perfs > 0.0)
|
||||
if(gA_StyleSettings[style].bAutobhop && perfs > 0.0)
|
||||
{
|
||||
FormatEx(sDisplay, 128, "%T: %d", "WRJumps", client, jumps);
|
||||
}
|
||||
@ -1786,7 +1793,7 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[]
|
||||
menu.AddItem("-1", sDisplay);
|
||||
|
||||
// 3 - style
|
||||
FormatEx(sDisplay, 128, "%T: %s", "WRStyle", client, gS_StyleStrings[style][sStyleName]);
|
||||
FormatEx(sDisplay, 128, "%T: %s", "WRStyle", client, gS_StyleStrings[style].sStyleName);
|
||||
menu.AddItem("-1", sDisplay);
|
||||
|
||||
// 6 - map
|
||||
@ -1867,12 +1874,12 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[]
|
||||
menu.Display(client, 20);
|
||||
}
|
||||
|
||||
public int SubMenu_Handler(Menu m, MenuAction action, int param1, int param2)
|
||||
public int SubMenu_Handler(Menu menu, MenuAction action, int param1, int param2)
|
||||
{
|
||||
if(action == MenuAction_Select)
|
||||
{
|
||||
char sInfo[32];
|
||||
m.GetItem(param2, sInfo, 32);
|
||||
menu.GetItem(param2, sInfo, 32);
|
||||
|
||||
if(gB_Stats && StringToInt(sInfo) != -1)
|
||||
{
|
||||
@ -1897,18 +1904,18 @@ public int SubMenu_Handler(Menu m, MenuAction action, int param1, int param2)
|
||||
|
||||
else
|
||||
{
|
||||
StartWRMenu(param1, gS_ClientMap[param1], gBS_LastWR[param1], gI_LastTrack[param1]);
|
||||
StartWRMenu(param1, gA_WRCache[param1].sClientMap, gA_WRCache[param1].iLastStyle, gA_WRCache[param1].iLastTrack);
|
||||
}
|
||||
}
|
||||
|
||||
else if(action == MenuAction_Cancel && param2 == MenuCancel_ExitBack)
|
||||
{
|
||||
StartWRMenu(param1, gS_ClientMap[param1], gBS_LastWR[param1], gI_LastTrack[param1]);
|
||||
StartWRMenu(param1, gA_WRCache[param1].sClientMap, gA_WRCache[param1].iLastStyle, gA_WRCache[param1].iLastTrack);
|
||||
}
|
||||
|
||||
else if(action == MenuAction_End)
|
||||
{
|
||||
delete m;
|
||||
delete menu;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2155,7 +2162,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
|
||||
// 2 - update
|
||||
int overwrite = 0;
|
||||
|
||||
if(gA_StyleSettings[style][bUnranked] || Shavit_IsPracticeMode(client))
|
||||
if(gA_StyleSettings[style].bUnranked || Shavit_IsPracticeMode(client))
|
||||
{
|
||||
overwrite = 0; // ugly way of not writing to database
|
||||
}
|
||||
@ -2221,7 +2228,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
|
||||
FormatSeconds(fDifference, sDifference, 16, true);
|
||||
|
||||
char sSync[32]; // 32 because colors
|
||||
FormatEx(sSync, 32, (sync != -1.0)? " @ %s%.02f%%":"", gS_ChatStrings[sMessageVariable], sync);
|
||||
FormatEx(sSync, 32, (sync != -1.0)? " @ %s%.02f%%":"", gS_ChatStrings.sVariable, sync);
|
||||
|
||||
if(overwrite > 0)
|
||||
{
|
||||
@ -2232,7 +2239,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
|
||||
|
||||
if(overwrite == 1) // insert
|
||||
{
|
||||
Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "FirstCompletion", LANG_SERVER, gS_ChatStrings[sMessageVariable2], client, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], iRank, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "FirstCompletion", LANG_SERVER, gS_ChatStrings.sVariable2, client, gS_ChatStrings.sText, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, gS_ChatStrings.sVariable, iRank, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText);
|
||||
|
||||
if(gH_SQL == null)
|
||||
{
|
||||
@ -2244,7 +2251,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
|
||||
|
||||
else // update
|
||||
{
|
||||
Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "NotFirstCompletion", LANG_SERVER, gS_ChatStrings[sMessageVariable2], client, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable], iRank, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageWarning], sDifference);
|
||||
Shavit_PrintToChatAll("%s[%s]%s %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "NotFirstCompletion", LANG_SERVER, gS_ChatStrings.sVariable2, client, gS_ChatStrings.sText, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, gS_ChatStrings.sVariable, iRank, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText, gS_ChatStrings.sWarning, sDifference);
|
||||
|
||||
FormatEx(sQuery, 512, "UPDATE %splayertimes SET time = %.03f, jumps = %d, date = %d, strafes = %d, sync = %.02f, points = 0.0, perfs = %.2f WHERE map = '%s' AND auth = '%s' AND style = %d AND track = %d;", gS_MySQLPrefix, time, jumps, GetTime(), strafes, sync, perfs, gS_Map, sAuthID, style, track);
|
||||
}
|
||||
@ -2268,14 +2275,14 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st
|
||||
gF_PlayerRecord[client][style][track] = time;
|
||||
}
|
||||
|
||||
else if(overwrite == 0 && !gA_StyleSettings[style][bUnranked])
|
||||
else if(overwrite == 0 && !gA_StyleSettings[style].bUnranked)
|
||||
{
|
||||
Shavit_PrintToChat(client, "%s[%s]%s %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "WorseTime", client, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText], sDifference);
|
||||
Shavit_PrintToChat(client, "%s[%s]%s %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "WorseTime", client, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText, sDifference);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
Shavit_PrintToChat(client, "%s[%s]%s] %T", gS_ChatStrings[sMessageVariable], sTrack, gS_ChatStrings[sMessageText], "UnrankedTime", client, gS_ChatStrings[sMessageStyle], gS_StyleStrings[style][sStyleName], gS_ChatStrings[sMessageText], gS_ChatStrings[sMessageVariable2], sTime, gS_ChatStrings[sMessageText], jumps, strafes, sSync, gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%s[%s]%s] %T", gS_ChatStrings.sVariable, sTrack, gS_ChatStrings.sText, "UnrankedTime", client, gS_ChatStrings.sStyle, gS_StyleStrings[style].sStyleName, gS_ChatStrings.sText, gS_ChatStrings.sVariable2, sTime, gS_ChatStrings.sText, jumps, strafes, sSync, gS_ChatStrings.sText);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2329,7 +2336,7 @@ public void SQL_UpdateLeaderboards_Callback(Database db, DBResultSet results, co
|
||||
int style = results.FetchInt(0);
|
||||
int track = results.FetchInt(2);
|
||||
|
||||
if(style >= gI_Styles || gA_StyleSettings[style][bUnranked] || track >= TRACKS_SIZE)
|
||||
if(style >= gI_Styles || gA_StyleSettings[style].bUnranked || track >= TRACKS_SIZE)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -2339,7 +2346,7 @@ public void SQL_UpdateLeaderboards_Callback(Database db, DBResultSet results, co
|
||||
|
||||
for(int i = 0; i < gI_Styles; i++)
|
||||
{
|
||||
if(i >= gI_Styles || gA_StyleSettings[i][bUnranked])
|
||||
if(i >= gI_Styles || gA_StyleSettings[i].bUnranked)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -57,16 +57,24 @@ char gS_ZoneNames[][] =
|
||||
"Slide Zone" // allows players to slide, in order to fix parts like the 5th stage of bhop_arcane
|
||||
};
|
||||
|
||||
enum
|
||||
enum struct zone_cache_t
|
||||
{
|
||||
bVisible,
|
||||
iRed,
|
||||
iGreen,
|
||||
iBlue,
|
||||
iAlpha,
|
||||
fWidth,
|
||||
bFlatZone,
|
||||
ZONESETTINGS_SIZE
|
||||
bool bZoneInitialized;
|
||||
int iZoneType;
|
||||
int iZoneTrack; // 0 - main, 1 - bonus
|
||||
int iEntityID;
|
||||
int iDatabaseID;
|
||||
}
|
||||
|
||||
enum struct zone_settings_t
|
||||
{
|
||||
bool bVisible;
|
||||
int iRed;
|
||||
int iGreen;
|
||||
int iBlue;
|
||||
int iAlpha;
|
||||
float fWidth;
|
||||
bool bFlatZone;
|
||||
}
|
||||
|
||||
int gI_ZoneType[MAXPLAYERS+1];
|
||||
@ -96,8 +104,8 @@ int gI_ZoneTrack[MAXPLAYERS+1];
|
||||
int gI_ZoneDatabaseID[MAXPLAYERS+1];
|
||||
|
||||
// zone cache
|
||||
any gA_ZoneSettings[ZONETYPES_SIZE][TRACKS_SIZE][ZONESETTINGS_SIZE];
|
||||
any gA_ZoneCache[MAX_ZONES][ZONECACHE_SIZE]; // Vectors will not be inside this array.
|
||||
zone_settings_t gA_ZoneSettings[ZONETYPES_SIZE][TRACKS_SIZE];
|
||||
zone_cache_t gA_ZoneCache[MAX_ZONES]; // Vectors will not be inside this array.
|
||||
int gI_MapZones = 0;
|
||||
float gV_MapZones[MAX_ZONES][2][3];
|
||||
float gV_MapZones_Visual[MAX_ZONES][8][3];
|
||||
@ -127,15 +135,6 @@ ConVar gCV_Height = null;
|
||||
ConVar gCV_Offset = null;
|
||||
ConVar gCV_EnforceTracks = null;
|
||||
|
||||
// cached cvars
|
||||
float gF_Interval = 1.0;
|
||||
bool gB_TeleportToStart = true;
|
||||
bool gB_TeleportToEnd = true;
|
||||
bool gB_UseCustomSprite = true;
|
||||
float gF_Height = 128.0;
|
||||
float gF_Offset = 0.5;
|
||||
bool gB_EnforceTracks = true;
|
||||
|
||||
// handles
|
||||
Handle gH_DrawEverything = null;
|
||||
|
||||
@ -143,7 +142,7 @@ Handle gH_DrawEverything = null;
|
||||
char gS_MySQLPrefix[32];
|
||||
|
||||
// chat settings
|
||||
char gS_ChatStrings[CHATSETTINGS_SIZE][128];
|
||||
chatstrings_t gS_ChatStrings;
|
||||
|
||||
// forwards
|
||||
Handle gH_Forwards_EnterZone = null;
|
||||
@ -239,12 +238,8 @@ public void OnPluginStart()
|
||||
gCV_EnforceTracks = CreateConVar("shavit_zones_enforcetracks", "1", "Enforce zone tracks upon entry?\n0 - allow every zone except for start/end to affect users on every zone.\n1- require the user's track to match the zone's track.", 0, true, 0.0, true, 1.0);
|
||||
|
||||
gCV_Interval.AddChangeHook(OnConVarChanged);
|
||||
gCV_TeleportToStart.AddChangeHook(OnConVarChanged);
|
||||
gCV_TeleportToEnd.AddChangeHook(OnConVarChanged);
|
||||
gCV_UseCustomSprite.AddChangeHook(OnConVarChanged);
|
||||
gCV_Height.AddChangeHook(OnConVarChanged);
|
||||
gCV_Offset.AddChangeHook(OnConVarChanged);
|
||||
gCV_EnforceTracks.AddChangeHook(OnConVarChanged);
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
@ -261,13 +256,13 @@ public void OnPluginStart()
|
||||
{
|
||||
for(int j = 0; j < TRACKS_SIZE; j++)
|
||||
{
|
||||
gA_ZoneSettings[i][j][bVisible] = true;
|
||||
gA_ZoneSettings[i][j][iRed] = 255;
|
||||
gA_ZoneSettings[i][j][iGreen] = 255;
|
||||
gA_ZoneSettings[i][j][iBlue] = 255;
|
||||
gA_ZoneSettings[i][j][iAlpha] = 255;
|
||||
gA_ZoneSettings[i][j][fWidth] = 2.0;
|
||||
gA_ZoneSettings[i][j][bFlatZone] = false;
|
||||
gA_ZoneSettings[i][j].bVisible = true;
|
||||
gA_ZoneSettings[i][j].iRed = 255;
|
||||
gA_ZoneSettings[i][j].iGreen = 255;
|
||||
gA_ZoneSettings[i][j].iBlue = 255;
|
||||
gA_ZoneSettings[i][j].iAlpha = 255;
|
||||
gA_ZoneSettings[i][j].fWidth = 2.0;
|
||||
gA_ZoneSettings[i][j].bFlatZone = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -284,25 +279,17 @@ public void OnPluginStart()
|
||||
|
||||
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
gF_Interval = gCV_Interval.FloatValue;
|
||||
gB_TeleportToStart = gCV_TeleportToStart.BoolValue;
|
||||
gB_UseCustomSprite = gCV_UseCustomSprite.BoolValue;
|
||||
gB_TeleportToEnd = gCV_TeleportToEnd.BoolValue;
|
||||
gF_Height = gCV_Height.FloatValue;
|
||||
gF_Offset = gCV_Offset.FloatValue;
|
||||
gB_EnforceTracks = gCV_EnforceTracks.BoolValue;
|
||||
|
||||
if(convar == gCV_Interval)
|
||||
{
|
||||
delete gH_DrawEverything;
|
||||
gH_DrawEverything = CreateTimer(gF_Interval, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
|
||||
gH_DrawEverything = CreateTimer(gCV_Interval.FloatValue, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
|
||||
}
|
||||
|
||||
else if(convar == gCV_Offset && gI_MapZones > 0)
|
||||
{
|
||||
for(int i = 0; i < gI_MapZones; i++)
|
||||
{
|
||||
if(!gA_ZoneCache[i][bZoneInitialized])
|
||||
if(!gA_ZoneCache[i].bZoneInitialized)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -314,7 +301,7 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n
|
||||
gV_MapZones_Visual[i][7][1] = gV_MapZones[i][1][1];
|
||||
gV_MapZones_Visual[i][7][2] = gV_MapZones[i][1][2];
|
||||
|
||||
CreateZonePoints(gV_MapZones_Visual[i], gF_Offset);
|
||||
CreateZonePoints(gV_MapZones_Visual[i], gCV_Offset.FloatValue);
|
||||
}
|
||||
}
|
||||
|
||||
@ -545,13 +532,13 @@ bool LoadZonesConfig()
|
||||
|
||||
int index = (i % ZONETYPES_SIZE);
|
||||
|
||||
gA_ZoneSettings[index][track][bVisible] = view_as<bool>(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<bool>(kv.GetNum("flat", false));
|
||||
gA_ZoneSettings[index][track].bVisible = view_as<bool>(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<bool>(kv.GetNum("flat", false));
|
||||
|
||||
i++;
|
||||
}
|
||||
@ -570,7 +557,7 @@ void LoadZoneSettings()
|
||||
SetFailState("Cannot open \"configs/shavit-zones.cfg\". Make sure this file exists and that the server has read permissions to it.");
|
||||
}
|
||||
|
||||
if(gB_UseCustomSprite)
|
||||
if(gCV_UseCustomSprite.BoolValue)
|
||||
{
|
||||
gI_BeamSprite = PrecacheModel(gS_BeamSprite, true);
|
||||
gI_HaloSprite = 0;
|
||||
@ -590,7 +577,6 @@ void LoadZoneSettings()
|
||||
gI_HaloSprite = PrecacheModel("sprites/glow01.vmt", true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void OnMapStart()
|
||||
@ -624,7 +610,7 @@ public void OnMapStart()
|
||||
// start drawing mapzones here
|
||||
if(gH_DrawEverything == null)
|
||||
{
|
||||
gH_DrawEverything = CreateTimer(gF_Interval, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
|
||||
gH_DrawEverything = CreateTimer(gCV_Interval.FloatValue, Timer_DrawEverything, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
|
||||
}
|
||||
|
||||
if(gB_Late)
|
||||
@ -758,10 +744,12 @@ public void Frame_HookTrigger(any data)
|
||||
|
||||
public void Shavit_OnChatConfigLoaded()
|
||||
{
|
||||
for(int i = 0; i < CHATSETTINGS_SIZE; i++)
|
||||
{
|
||||
Shavit_GetChatStrings(i, gS_ChatStrings[i], 128);
|
||||
}
|
||||
Shavit_GetChatStrings(sMessagePrefix, gS_ChatStrings.sPrefix, sizeof(chatstrings_t::sPrefix));
|
||||
Shavit_GetChatStrings(sMessageText, gS_ChatStrings.sText, sizeof(chatstrings_t::sText));
|
||||
Shavit_GetChatStrings(sMessageWarning, gS_ChatStrings.sWarning, sizeof(chatstrings_t::sWarning));
|
||||
Shavit_GetChatStrings(sMessageVariable, gS_ChatStrings.sVariable, sizeof(chatstrings_t::sVariable));
|
||||
Shavit_GetChatStrings(sMessageVariable2, gS_ChatStrings.sVariable2, sizeof(chatstrings_t::sVariable2));
|
||||
Shavit_GetChatStrings(sMessageStyle, gS_ChatStrings.sStyle, sizeof(chatstrings_t::sStyle));
|
||||
}
|
||||
|
||||
void ClearZone(int index)
|
||||
@ -774,11 +762,11 @@ void ClearZone(int index)
|
||||
gV_ZoneCenter[index][i] = 0.0;
|
||||
}
|
||||
|
||||
gA_ZoneCache[index][bZoneInitialized] = false;
|
||||
gA_ZoneCache[index][iZoneType] = -1;
|
||||
gA_ZoneCache[index][iZoneTrack] = -1;
|
||||
gA_ZoneCache[index][iEntityID] = -1;
|
||||
gA_ZoneCache[index][iDatabaseID] = -1;
|
||||
gA_ZoneCache[index].bZoneInitialized = false;
|
||||
gA_ZoneCache[index].iZoneType = -1;
|
||||
gA_ZoneCache[index].iZoneTrack = -1;
|
||||
gA_ZoneCache[index].iEntityID = -1;
|
||||
gA_ZoneCache[index].iDatabaseID = -1;
|
||||
}
|
||||
|
||||
void UnhookEntity(int entity)
|
||||
@ -790,7 +778,7 @@ void UnhookEntity(int entity)
|
||||
|
||||
void KillZoneEntity(int index)
|
||||
{
|
||||
int entity = gA_ZoneCache[index][iEntityID];
|
||||
int entity = gA_ZoneCache[index].iEntityID;
|
||||
|
||||
if(entity > MaxClients && IsValidEntity(entity))
|
||||
{
|
||||
@ -798,7 +786,7 @@ void KillZoneEntity(int index)
|
||||
{
|
||||
for(int j = 0; j < TRACKS_SIZE; j++)
|
||||
{
|
||||
gB_InsideZone[i][gA_ZoneCache[index][iZoneType]][j] = false;
|
||||
gB_InsideZone[i][gA_ZoneCache[index].iZoneType][j] = false;
|
||||
}
|
||||
|
||||
gB_InsideZoneID[i][index] = false;
|
||||
@ -829,7 +817,7 @@ void UnloadZones(int zone)
|
||||
{
|
||||
for(int i = 0; i < MAX_ZONES; i++)
|
||||
{
|
||||
if((zone == 0 || gA_ZoneCache[i][iZoneType] == zone) && gA_ZoneCache[i][bZoneInitialized])
|
||||
if((zone == 0 || gA_ZoneCache[i].iZoneType == zone) && gA_ZoneCache[i].bZoneInitialized)
|
||||
{
|
||||
KillZoneEntity(i);
|
||||
ClearZone(i);
|
||||
@ -901,7 +889,7 @@ public void SQL_RefreshZones_Callback(Database db, DBResultSet results, const ch
|
||||
gV_MapZones[gI_MapZones][1][1] = gV_MapZones_Visual[gI_MapZones][7][1] = results.FetchFloat(5);
|
||||
gV_MapZones[gI_MapZones][1][2] = gV_MapZones_Visual[gI_MapZones][7][2] = results.FetchFloat(6);
|
||||
|
||||
CreateZonePoints(gV_MapZones_Visual[gI_MapZones], gF_Offset);
|
||||
CreateZonePoints(gV_MapZones_Visual[gI_MapZones], gCV_Offset.FloatValue);
|
||||
|
||||
gV_ZoneCenter[gI_MapZones][0] = (gV_MapZones[gI_MapZones][0][0] + gV_MapZones[gI_MapZones][1][0]) / 2.0;
|
||||
gV_ZoneCenter[gI_MapZones][1] = (gV_MapZones[gI_MapZones][0][1] + gV_MapZones[gI_MapZones][1][1]) / 2.0;
|
||||
@ -914,11 +902,11 @@ public void SQL_RefreshZones_Callback(Database db, DBResultSet results, const ch
|
||||
gV_Destinations[gI_MapZones][2] = results.FetchFloat(9);
|
||||
}
|
||||
|
||||
gA_ZoneCache[gI_MapZones][bZoneInitialized] = true;
|
||||
gA_ZoneCache[gI_MapZones][iZoneType] = type;
|
||||
gA_ZoneCache[gI_MapZones][iZoneTrack] = results.FetchInt(10);
|
||||
gA_ZoneCache[gI_MapZones][iDatabaseID] = results.FetchInt(11);
|
||||
gA_ZoneCache[gI_MapZones][iEntityID] = -1;
|
||||
gA_ZoneCache[gI_MapZones].bZoneInitialized = true;
|
||||
gA_ZoneCache[gI_MapZones].iZoneType = type;
|
||||
gA_ZoneCache[gI_MapZones].iZoneTrack = results.FetchInt(10);
|
||||
gA_ZoneCache[gI_MapZones].iDatabaseID = results.FetchInt(11);
|
||||
gA_ZoneCache[gI_MapZones].iEntityID = -1;
|
||||
|
||||
gI_MapZones++;
|
||||
}
|
||||
@ -979,7 +967,7 @@ public Action Command_Modifier(int client, int args)
|
||||
|
||||
gF_Modifier[client] = fArg1;
|
||||
|
||||
Shavit_PrintToChat(client, "%T %s%.01f%s.", "ModifierSet", client, gS_ChatStrings[sMessageVariable], fArg1, gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T %s%.01f%s.", "ModifierSet", client, gS_ChatStrings.sVariable, fArg1, gS_ChatStrings.sText);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@ -1096,7 +1084,7 @@ public Action Command_Zones(int client, int args)
|
||||
|
||||
if(!IsPlayerAlive(client))
|
||||
{
|
||||
Shavit_PrintToChat(client, "%T", "ZonesCommand", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "ZonesCommand", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@ -1136,7 +1124,7 @@ Action OpenEditMenu(int client)
|
||||
|
||||
for(int i = 0; i < sizeof(gS_ZoneNames); i++)
|
||||
{
|
||||
if(!gA_ZoneCache[i][bZoneInitialized])
|
||||
if(!gA_ZoneCache[i].bZoneInitialized)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -1145,9 +1133,9 @@ Action OpenEditMenu(int client)
|
||||
IntToString(i, sInfo, 8);
|
||||
|
||||
char sTrack[32];
|
||||
GetTrackName(client, gA_ZoneCache[i][iZoneTrack], sTrack, 32);
|
||||
GetTrackName(client, gA_ZoneCache[i].iZoneTrack, sTrack, 32);
|
||||
|
||||
FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i][iZoneType]], sTrack);
|
||||
FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i].iZoneType], sTrack);
|
||||
|
||||
if(gB_InsideZoneID[client][i])
|
||||
{
|
||||
@ -1196,13 +1184,13 @@ public int ZoneEdit_MenuHandler(Menu menu, MenuAction action, int param1, int pa
|
||||
gI_MapStep[param1] = 3;
|
||||
gV_Point1[param1] = gV_MapZones[id][0];
|
||||
gV_Point2[param1] = gV_MapZones[id][1];
|
||||
gI_ZoneType[param1] = gA_ZoneCache[id][iZoneType];
|
||||
gI_ZoneTrack[param1] = gA_ZoneCache[id][iZoneTrack];
|
||||
gI_ZoneType[param1] = gA_ZoneCache[id].iZoneType;
|
||||
gI_ZoneTrack[param1] = gA_ZoneCache[id].iZoneTrack;
|
||||
gV_Teleport[param1] = gV_Destinations[id];
|
||||
gI_ZoneDatabaseID[param1] = gA_ZoneCache[id][iDatabaseID];
|
||||
gI_ZoneDatabaseID[param1] = gA_ZoneCache[id].iDatabaseID;
|
||||
|
||||
// to stop the original zone from drawing
|
||||
gA_ZoneCache[id][bZoneInitialized] = false;
|
||||
gA_ZoneCache[id].bZoneInitialized = false;
|
||||
|
||||
// draw the zone edit
|
||||
CreateTimer(0.1, Timer_Draw, GetClientSerial(param1), TIMER_REPEAT);
|
||||
@ -1241,12 +1229,12 @@ Action OpenDeleteMenu(int client)
|
||||
|
||||
for(int i = 0; i < gI_MapZones; i++)
|
||||
{
|
||||
if(gA_ZoneCache[i][bZoneInitialized])
|
||||
if(gA_ZoneCache[i].bZoneInitialized)
|
||||
{
|
||||
char sTrack[32];
|
||||
GetTrackName(client, gA_ZoneCache[i][iZoneTrack], sTrack, 32);
|
||||
GetTrackName(client, gA_ZoneCache[i].iZoneTrack, sTrack, 32);
|
||||
|
||||
FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i][iZoneType]], sTrack);
|
||||
FormatEx(sDisplay, 64, "#%d - %s (%s)", (i + 1), gS_ZoneNames[gA_ZoneCache[i].iZoneType], sTrack);
|
||||
|
||||
char sInfo[8];
|
||||
IntToString(i, sInfo, 8);
|
||||
@ -1296,14 +1284,14 @@ public int DeleteZone_MenuHandler(Menu menu, MenuAction action, int param1, int
|
||||
|
||||
default:
|
||||
{
|
||||
Shavit_LogMessage("%L - deleted %s (id %d) from map `%s`.", param1, gS_ZoneNames[gA_ZoneCache[id][iZoneType]], gA_ZoneCache[id][iDatabaseID], gS_Map);
|
||||
Shavit_LogMessage("%L - deleted %s (id %d) from map `%s`.", param1, gS_ZoneNames[gA_ZoneCache[id].iZoneType], gA_ZoneCache[id].iDatabaseID, gS_Map);
|
||||
|
||||
char sQuery[256];
|
||||
FormatEx(sQuery, 256, "DELETE FROM %smapzones WHERE %s = %d;", gS_MySQLPrefix, (gB_MySQL)? "id":"rowid", gA_ZoneCache[id][iDatabaseID]);
|
||||
FormatEx(sQuery, 256, "DELETE FROM %smapzones WHERE %s = %d;", gS_MySQLPrefix, (gB_MySQL)? "id":"rowid", gA_ZoneCache[id].iDatabaseID);
|
||||
|
||||
DataPack hDatapack = new DataPack();
|
||||
hDatapack.WriteCell(GetClientSerial(param1));
|
||||
hDatapack.WriteCell(gA_ZoneCache[id][iZoneType]);
|
||||
hDatapack.WriteCell(gA_ZoneCache[id].iZoneType);
|
||||
|
||||
gH_SQL.Query(SQL_DeleteZone_Callback, sQuery, hDatapack);
|
||||
}
|
||||
@ -1341,7 +1329,7 @@ public void SQL_DeleteZone_Callback(Database db, DBResultSet results, const char
|
||||
return;
|
||||
}
|
||||
|
||||
Shavit_PrintToChat(client, "%T", "ZoneDeleteSuccessful", client, gS_ChatStrings[sMessageVariable], gS_ZoneNames[type], gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(client, "%T", "ZoneDeleteSuccessful", client, gS_ChatStrings.sVariable, gS_ZoneNames[type], gS_ChatStrings.sText);
|
||||
}
|
||||
|
||||
public Action Command_DeleteAllZones(int client, int args)
|
||||
@ -1656,7 +1644,7 @@ public bool TraceFilter_World(int entity, int contentsMask)
|
||||
return (entity == 0);
|
||||
}
|
||||
|
||||
public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, any stylesettings[STYLESETTINGS_SIZE])
|
||||
public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status, int track, int style, stylesettings_t stylesettings)
|
||||
{
|
||||
if(gI_MapStep[client] > 0 && gI_MapStep[client] != 3)
|
||||
{
|
||||
@ -1698,7 +1686,7 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float
|
||||
|
||||
else if(gI_MapStep[client] == 2)
|
||||
{
|
||||
origin[2] += gF_Height;
|
||||
origin[2] += gCV_Height.FloatValue;
|
||||
gV_Point2[client] = origin;
|
||||
|
||||
gI_MapStep[client]++;
|
||||
@ -1716,7 +1704,7 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float
|
||||
}
|
||||
}
|
||||
|
||||
if(InsideZone(client, Zone_Slide, (gB_EnforceTracks)? track:-1) && GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1)
|
||||
if(InsideZone(client, Zone_Slide, (gCV_EnforceTracks.BoolValue)? track:-1) && GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1)
|
||||
{
|
||||
// trace down, see if there's 8 distance or less to ground
|
||||
float fPosition[3];
|
||||
@ -1949,7 +1937,7 @@ public int ZoneAdjuster_Handler(Menu menu, MenuAction action, int param1, int pa
|
||||
bool bIncrease = view_as<bool>(StringToInt(sExploded[2]) == 1);
|
||||
|
||||
((iPoint == 1)? gV_Point1:gV_Point2)[param1][iAxis] += ((bIncrease)? gF_Modifier[param1]:-gF_Modifier[param1]);
|
||||
Shavit_PrintToChat(param1, "%T", (bIncrease)? "ZoneSizeIncrease":"ZoneSizeDecrease", param1, gS_ChatStrings[sMessageVariable2], sAxis[iAxis], gS_ChatStrings[sMessageText], iPoint, gS_ChatStrings[sMessageVariable], gF_Modifier[param1], gS_ChatStrings[sMessageText]);
|
||||
Shavit_PrintToChat(param1, "%T", (bIncrease)? "ZoneSizeIncrease":"ZoneSizeDecrease", param1, gS_ChatStrings.sVariable2, sAxis[iAxis], gS_ChatStrings.sText, iPoint, gS_ChatStrings.sVariable, gF_Modifier[param1], gS_ChatStrings.sText);
|
||||
|
||||
CreateAdjustMenu(param1, GetMenuSelectionPosition());
|
||||
}
|
||||
@ -1994,9 +1982,9 @@ void InsertZone(int client)
|
||||
{
|
||||
for(int i = 0; i < gI_MapZones; i++)
|
||||
{
|
||||
if(gA_ZoneCache[i][bZoneInitialized] && gA_ZoneCache[i][iZoneType] == type && gA_ZoneCache[i][iZoneTrack] == gI_ZoneTrack[client])
|
||||
if(gA_ZoneCache[i].bZoneInitialized && gA_ZoneCache[i].iZoneType == type && gA_ZoneCache[i].iZoneTrack == gI_ZoneTrack[client])
|
||||
{
|
||||
gI_ZoneDatabaseID[client] = gA_ZoneCache[i][iDatabaseID];
|
||||
gI_ZoneDatabaseID[client] = gA_ZoneCache[i].iDatabaseID;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2051,18 +2039,18 @@ public Action Timer_DrawEverything(Handle Timer)
|
||||
|
||||
for(int i = iCycle; i < gI_MapZones; i++)
|
||||
{
|
||||
if(gA_ZoneCache[i][bZoneInitialized])
|
||||
if(gA_ZoneCache[i].bZoneInitialized)
|
||||
{
|
||||
int type = gA_ZoneCache[i][iZoneType];
|
||||
int track = gA_ZoneCache[i][iZoneTrack];
|
||||
int type = gA_ZoneCache[i].iZoneType;
|
||||
int track = gA_ZoneCache[i].iZoneTrack;
|
||||
|
||||
if(gA_ZoneSettings[type][track][bVisible])
|
||||
if(gA_ZoneSettings[type][track].bVisible)
|
||||
{
|
||||
DrawZone(gV_MapZones_Visual[i],
|
||||
GetZoneColors(type, track),
|
||||
RoundToCeil(float(gI_MapZones) / iMaxZonesPerFrame) * gF_Interval,
|
||||
gA_ZoneSettings[type][track][fWidth],
|
||||
gA_ZoneSettings[type][track][bFlatZone],
|
||||
RoundToCeil(float(gI_MapZones) / iMaxZonesPerFrame) * gCV_Interval.FloatValue,
|
||||
gA_ZoneSettings[type][track].fWidth,
|
||||
gA_ZoneSettings[type][track].bFlatZone,
|
||||
gV_ZoneCenter[i]);
|
||||
}
|
||||
}
|
||||
@ -2081,10 +2069,10 @@ public Action Timer_DrawEverything(Handle Timer)
|
||||
int[] GetZoneColors(int type, int track, int customalpha = 0)
|
||||
{
|
||||
int colors[4];
|
||||
colors[0] = gA_ZoneSettings[type][track][iRed];
|
||||
colors[1] = gA_ZoneSettings[type][track][iGreen];
|
||||
colors[2] = gA_ZoneSettings[type][track][iBlue];
|
||||
colors[3] = (customalpha > 0)? customalpha:gA_ZoneSettings[type][track][iAlpha];
|
||||
colors[0] = gA_ZoneSettings[type][track].iRed;
|
||||
colors[1] = gA_ZoneSettings[type][track].iGreen;
|
||||
colors[2] = gA_ZoneSettings[type][track].iBlue;
|
||||
colors[3] = (customalpha > 0)? customalpha:gA_ZoneSettings[type][track].iAlpha;
|
||||
|
||||
return colors;
|
||||
}
|
||||
@ -2122,7 +2110,7 @@ public Action Timer_Draw(Handle Timer, any data)
|
||||
|
||||
if(gI_MapStep[client] == 1 || gV_Point2[client][0] == 0.0)
|
||||
{
|
||||
origin[2] = (vPlayerOrigin[2] + gF_Height);
|
||||
origin[2] = (vPlayerOrigin[2] + gCV_Height.FloatValue);
|
||||
}
|
||||
|
||||
else
|
||||
@ -2135,7 +2123,7 @@ public Action Timer_Draw(Handle Timer, any data)
|
||||
float points[8][3];
|
||||
points[0] = gV_Point1[client];
|
||||
points[7] = origin;
|
||||
CreateZonePoints(points, gF_Offset);
|
||||
CreateZonePoints(points, gCV_Offset.FloatValue);
|
||||
|
||||
// This is here to make the zone setup grid snapping be 1:1 to how it looks when done with the setup.
|
||||
origin = points[7];
|
||||
@ -2143,7 +2131,7 @@ public Action Timer_Draw(Handle Timer, any data)
|
||||
int type = gI_ZoneType[client];
|
||||
int track = gI_ZoneTrack[client];
|
||||
|
||||
DrawZone(points, GetZoneColors(type, track, 125), 0.1, gA_ZoneSettings[type][track][fWidth], false, origin);
|
||||
DrawZone(points, GetZoneColors(type, track, 125), 0.1, gA_ZoneSettings[type][track].fWidth, false, origin);
|
||||
|
||||
if(gI_ZoneType[client] == Zone_Teleport && !EmptyVector(gV_Teleport[client]))
|
||||
{
|
||||
@ -2154,7 +2142,7 @@ public Action Timer_Draw(Handle Timer, any data)
|
||||
|
||||
if(gI_MapStep[client] != 3 && !EmptyVector(origin))
|
||||
{
|
||||
origin[2] -= gF_Height;
|
||||
origin[2] -= gCV_Height.FloatValue;
|
||||
|
||||
TE_SetupBeamPoints(vPlayerOrigin, origin, gI_BeamSprite, gI_HaloSprite, 0, 0, 0.1, 1.0, 1.0, 0, 0.0, {255, 255, 255, 75}, 0);
|
||||
TE_SendToAll(0.0);
|
||||
@ -2424,7 +2412,7 @@ public void SQL_AlterTable2_Callback(Database db, DBResultSet results, const cha
|
||||
|
||||
public void Shavit_OnRestart(int client, int track)
|
||||
{
|
||||
if(gB_TeleportToStart)
|
||||
if(gCV_TeleportToStart.BoolValue)
|
||||
{
|
||||
// custom spawns
|
||||
if(!EmptyVector(gF_CustomSpawn[track]))
|
||||
@ -2470,7 +2458,7 @@ public void Shavit_OnRestart(int client, int track)
|
||||
|
||||
public void Shavit_OnEnd(int client, int track)
|
||||
{
|
||||
if(gB_TeleportToEnd)
|
||||
if(gCV_TeleportToEnd.BoolValue)
|
||||
{
|
||||
int index = GetZoneIndex(Zone_End, track);
|
||||
|
||||
@ -2503,7 +2491,7 @@ int GetZoneIndex(int type, int track, int start = 0)
|
||||
|
||||
for(int i = start; i < gI_MapZones; i++)
|
||||
{
|
||||
if(gA_ZoneCache[i][bZoneInitialized] && gA_ZoneCache[i][iZoneType] == type && (gA_ZoneCache[i][iZoneTrack] == track || track == -1))
|
||||
if(gA_ZoneCache[i].bZoneInitialized && gA_ZoneCache[i].iZoneType == type && (gA_ZoneCache[i].iZoneTrack == track || track == -1))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
@ -2558,20 +2546,20 @@ public void CreateZoneEntities()
|
||||
{
|
||||
for(int k = 0; k < TRACKS_SIZE; k++)
|
||||
{
|
||||
gB_InsideZone[j][gA_ZoneCache[i][iZoneType]][k] = false;
|
||||
gB_InsideZone[j][gA_ZoneCache[i].iZoneType][k] = false;
|
||||
}
|
||||
|
||||
gB_InsideZoneID[j][i] = false;
|
||||
}
|
||||
|
||||
if(gA_ZoneCache[i][iEntityID] != -1)
|
||||
if(gA_ZoneCache[i].iEntityID != -1)
|
||||
{
|
||||
KillZoneEntity(i);
|
||||
|
||||
gA_ZoneCache[i][iEntityID] = -1;
|
||||
gA_ZoneCache[i].iEntityID = -1;
|
||||
}
|
||||
|
||||
if(!gA_ZoneCache[i][bZoneInitialized])
|
||||
if(!gA_ZoneCache[i].bZoneInitialized)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -2626,10 +2614,10 @@ public void CreateZoneEntities()
|
||||
SDKHook(entity, SDKHook_TouchPost, TouchPost);
|
||||
|
||||
gI_EntityZone[entity] = i;
|
||||
gA_ZoneCache[i][iEntityID] = entity;
|
||||
gA_ZoneCache[i].iEntityID = entity;
|
||||
|
||||
char sTargetname[32];
|
||||
FormatEx(sTargetname, 32, "shavit_zones_%d_%d", gA_ZoneCache[i][iZoneTrack], gA_ZoneCache[i][iZoneType]);
|
||||
FormatEx(sTargetname, 32, "shavit_zones_%d_%d", gA_ZoneCache[i].iZoneTrack, gA_ZoneCache[i].iZoneType);
|
||||
DispatchKeyValue(entity, "targetname", sTargetname);
|
||||
|
||||
gB_ZonesCreated = true;
|
||||
@ -2638,15 +2626,15 @@ public void CreateZoneEntities()
|
||||
|
||||
public void StartTouchPost(int entity, int other)
|
||||
{
|
||||
if(other < 1 || other > MaxClients || gI_EntityZone[entity] == -1 || !gA_ZoneCache[gI_EntityZone[entity]][bZoneInitialized] || IsFakeClient(other) ||
|
||||
(gB_EnforceTracks && gA_ZoneCache[gI_EntityZone[entity]][iZoneType] > Zone_End && gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack] != Shavit_GetClientTrack(other)))
|
||||
if(other < 1 || other > MaxClients || gI_EntityZone[entity] == -1 || !gA_ZoneCache[gI_EntityZone[entity]].bZoneInitialized || IsFakeClient(other) ||
|
||||
(gCV_EnforceTracks.BoolValue && gA_ZoneCache[gI_EntityZone[entity]].iZoneType > Zone_End && gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack != Shavit_GetClientTrack(other)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TimerStatus status = Shavit_GetTimerStatus(other);
|
||||
|
||||
switch(gA_ZoneCache[gI_EntityZone[entity]][iZoneType])
|
||||
switch(gA_ZoneCache[gI_EntityZone[entity]].iZoneType)
|
||||
{
|
||||
case Zone_Respawn:
|
||||
{
|
||||
@ -2662,7 +2650,7 @@ public void StartTouchPost(int entity, int other)
|
||||
{
|
||||
Shavit_StopTimer(other);
|
||||
ForcePlayerSuicide(other);
|
||||
Shavit_PrintToChat(other, "%T", "ZoneSlayEnter", other, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageVariable2], gS_ChatStrings[sMessageWarning]);
|
||||
Shavit_PrintToChat(other, "%T", "ZoneSlayEnter", other, gS_ChatStrings.sWarning, gS_ChatStrings.sVariable2, gS_ChatStrings.sWarning);
|
||||
}
|
||||
|
||||
case Zone_Stop:
|
||||
@ -2670,26 +2658,26 @@ public void StartTouchPost(int entity, int other)
|
||||
if(status != Timer_Stopped)
|
||||
{
|
||||
Shavit_StopTimer(other);
|
||||
Shavit_PrintToChat(other, "%T", "ZoneStopEnter", other, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageVariable2], gS_ChatStrings[sMessageWarning]);
|
||||
Shavit_PrintToChat(other, "%T", "ZoneStopEnter", other, gS_ChatStrings.sWarning, gS_ChatStrings.sVariable2, gS_ChatStrings.sWarning);
|
||||
}
|
||||
}
|
||||
|
||||
case Zone_End:
|
||||
{
|
||||
if(status != Timer_Stopped && Shavit_GetClientTrack(other) == gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack])
|
||||
if(status != Timer_Stopped && Shavit_GetClientTrack(other) == gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack)
|
||||
{
|
||||
Shavit_FinishMap(other, gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]);
|
||||
Shavit_FinishMap(other, gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gB_InsideZone[other][gA_ZoneCache[gI_EntityZone[entity]][iZoneType]][gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]] = true;
|
||||
gB_InsideZone[other][gA_ZoneCache[gI_EntityZone[entity]].iZoneType][gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack] = true;
|
||||
gB_InsideZoneID[other][gI_EntityZone[entity]] = true;
|
||||
|
||||
Call_StartForward(gH_Forwards_EnterZone);
|
||||
Call_PushCell(other);
|
||||
Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]][iZoneType]);
|
||||
Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]);
|
||||
Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]].iZoneType);
|
||||
Call_PushCell(gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack);
|
||||
Call_PushCell(gI_EntityZone[entity]);
|
||||
Call_PushCell(entity);
|
||||
Call_Finish();
|
||||
@ -2703,8 +2691,8 @@ public void EndTouchPost(int entity, int other)
|
||||
}
|
||||
|
||||
int entityzone = gI_EntityZone[entity];
|
||||
int type = gA_ZoneCache[entityzone][iZoneType];
|
||||
int track = gA_ZoneCache[entityzone][iZoneTrack];
|
||||
int type = gA_ZoneCache[entityzone].iZoneType;
|
||||
int track = gA_ZoneCache[entityzone].iZoneTrack;
|
||||
|
||||
gB_InsideZone[other][type][track] = false;
|
||||
gB_InsideZoneID[other][entityzone] = false;
|
||||
@ -2721,13 +2709,13 @@ public void EndTouchPost(int entity, int other)
|
||||
public void TouchPost(int entity, int other)
|
||||
{
|
||||
if(other < 1 || other > MaxClients || gI_EntityZone[entity] == -1 || IsFakeClient(other) ||
|
||||
(gB_EnforceTracks && gA_ZoneCache[gI_EntityZone[entity]][iZoneType] > Zone_End && gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack] != Shavit_GetClientTrack(other)))
|
||||
(gCV_EnforceTracks.BoolValue && gA_ZoneCache[gI_EntityZone[entity]].iZoneType > Zone_End && gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack != Shavit_GetClientTrack(other)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// do precise stuff here, this will be called *A LOT*
|
||||
switch(gA_ZoneCache[gI_EntityZone[entity]][iZoneType])
|
||||
switch(gA_ZoneCache[gI_EntityZone[entity]].iZoneType)
|
||||
{
|
||||
case Zone_Start:
|
||||
{
|
||||
@ -2735,10 +2723,10 @@ public void TouchPost(int entity, int other)
|
||||
// so you don't accidentally step on those while running
|
||||
if(Shavit_GetTimerStatus(other) == Timer_Stopped || Shavit_GetClientTrack(other) != Track_Main)
|
||||
{
|
||||
Shavit_StartTimer(other, gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack]);
|
||||
Shavit_StartTimer(other, gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack);
|
||||
}
|
||||
|
||||
else if(gA_ZoneCache[gI_EntityZone[entity]][iZoneTrack] == Track_Main)
|
||||
else if(gA_ZoneCache[gI_EntityZone[entity]].iZoneTrack == Track_Main)
|
||||
{
|
||||
Shavit_StartTimer(other, Track_Main);
|
||||
}
|
||||
|
||||
@ -11,6 +11,11 @@
|
||||
"#format" "{1:d}"
|
||||
"en" "In Start Zone\n\n{1}"
|
||||
}
|
||||
"HudInStartZoneCSGO"
|
||||
{
|
||||
"#format" "{1:d}"
|
||||
"en" "In Start Zone\n\n\t\t\t{1}"
|
||||
}
|
||||
"HudEndZone"
|
||||
{
|
||||
"en" "End Zone"
|
||||
@ -20,6 +25,11 @@
|
||||
"#format" "{1:d}"
|
||||
"en" "In End Zone\n\n{1}"
|
||||
}
|
||||
"HudInEndZoneCSGO"
|
||||
{
|
||||
"#format" "{1:d}"
|
||||
"en" "In End Zone\n\n\t\t\t{1}"
|
||||
}
|
||||
"HudPaused"
|
||||
{
|
||||
"en" "[PAUSED]"
|
||||
@ -83,7 +93,7 @@
|
||||
}
|
||||
"HudObserve"
|
||||
{
|
||||
"en" "Shows the HUD of the player you spectate"
|
||||
"en" "Spectate HUD"
|
||||
}
|
||||
"HudSpectators"
|
||||
{
|
||||
@ -91,7 +101,7 @@
|
||||
}
|
||||
"HudKeyOverlay"
|
||||
{
|
||||
"en" "Key overlay"
|
||||
"en" "Key display"
|
||||
}
|
||||
"HudHideWeapon"
|
||||
{
|
||||
@ -107,11 +117,19 @@
|
||||
}
|
||||
"HudNoRecordSounds"
|
||||
{
|
||||
"en" "Disable record sounds"
|
||||
"en" "No record sounds"
|
||||
}
|
||||
"HudPracticeModeAlert"
|
||||
{
|
||||
"en" "Disable practice mode alert"
|
||||
"en" "No practice mode alert"
|
||||
}
|
||||
"HudRankText"
|
||||
{
|
||||
"en" "Expected rank"
|
||||
}
|
||||
"HudTrackText"
|
||||
{
|
||||
"en" "Timer track"
|
||||
}
|
||||
// ---------- Record Bots ---------- //
|
||||
"ReplayText"
|
||||
@ -135,4 +153,15 @@
|
||||
{
|
||||
"en" "Other Spectators"
|
||||
}
|
||||
// ---------- Commands ---------- //
|
||||
"HudEnabledComponent"
|
||||
{
|
||||
"#format" "{1:s},{2:s},{3:s},{4:s},{5:s}"
|
||||
"en" "{1}{2} {3}HUD setting {4}enabled{5}."
|
||||
}
|
||||
"HudDisabledComponent"
|
||||
{
|
||||
"#format" "{1:s},{2:s},{3:s},{4:s},{5:s}"
|
||||
"en" "{1}{2} {3}HUD setting {4}disabled{5}."
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user