shavit-credits/scripting/include/shavit.inc
2020-04-13 01:00:12 +02:00

1874 lines
53 KiB
SourcePawn

/*
* shavit's Timer - .inc file
* by: shavit
*
* This file is part of shavit's Timer.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#if defined _shavit_included
#endinput
#endif
#define _shavit_included
#define SHAVIT_VERSION "2.5.7"
#define STYLE_LIMIT 256
#define MAX_ZONES 64
#define MAX_NAME_LENGTH_SQL 32
// HUD
#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
#define HUD_OBSERVE (1 << 3) // show the HUD of the player you spectate
#define HUD_SPECTATORS (1 << 4) // show list of spectators
#define HUD_KEYOVERLAY (1 << 5) // show a key overlay
#define HUD_HIDEWEAPON (1 << 6) // hide the player's weapon
#define HUD_TOPLEFT (1 << 7) // show top left white HUD with WR/PB times
#define HUD_SYNC (1 << 8) // shows sync at right side of the screen (css only)
#define HUD_TIMELEFT (1 << 9) // shows time left at right tside of the screen (css only)
#define HUD_2DVEL (1 << 10) // shows 2d velocity
#define HUD_NOSOUNDS (1 << 11) // disables sounds on personal best, world record etc
#define HUD_NOPRACALERT (1 << 12) // hides practice mode chat alert
// status
enum TimerStatus
{
Timer_Stopped,
Timer_Running,
Timer_Paused
};
enum ReplayStatus
{
Replay_Start,
Replay_Running,
Replay_End,
Replay_Idle
};
enum ReplayBotType
{
Replay_Central,
Replay_Legacy
};
enum
{
CPR_ByConVar = (1 << 0),
CPR_NoTimer = (1 << 1),
CPR_InStartZone = (1 << 2),
CPR_NotOnGround = (1 << 3)
};
enum
{
Migration_RemoveWorkshopMaptiers,
Migration_RemoveWorkshopMapzones,
Migration_RemoveWorkshopPlayertimes,
Migration_LastLoginIndex,
Migration_RemoveCountry,
Migration_ConvertIPAddresses,
Migration_ConvertSteamIDsUsers,
Migration_ConvertSteamIDsPlayertimes,
Migration_ConvertSteamIDsChat,
Migration_PlayertimesDateToInt,
Migration_AddZonesFlagsAndData,
Migration_AddPlayertimesCompletions,
MIGRATIONS_END
};
enum
{
Zone_Start,
Zone_End,
Zone_Respawn,
Zone_Stop,
Zone_Slay,
Zone_Freestyle,
Zone_CustomSpeedLimit,
Zone_Teleport,
Zone_CustomSpawn,
Zone_Easybhop,
Zone_Slide,
Zone_Airaccelerate,
Zone_Stage,
ZONETYPES_SIZE
};
enum
{
Track_Main,
Track_Bonus,
TRACKS_SIZE
};
// for Shavit_GetStyleStrings
enum
{
sStyleName,
sShortName,
sHTMLColor,
sChangeCommand,
sClanTag,
sSpecialString,
sStylePermission
};
// for Shavit_GetChatStrings
enum
{
sMessagePrefix,
sMessageText,
sMessageWarning,
sMessageVariable,
sMessageVariable2,
sMessageStyle
};
enum struct stylestrings_t
{
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;
int iPrespeed;
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;
int iOrdering;
bool bInaccessible;
int iEnabled;
bool bKZCheckpoints;
bool bForceKeysOnGround;
float fJumpMultiplier;
float fJumpBonus;
}
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;
}
enum struct cp_cache_t
{
float fPosition[3];
float fAngles[3];
float fVelocity[3];
float fBaseVelocity[3];
MoveType iMoveType;
float fGravity;
float fSpeed;
float fStamina;
bool bDucked;
bool bDucking;
float fDucktime; // m_flDuckAmount in csgo
float fDuckSpeed; // m_flDuckSpeed in csgo; doesn't exist in css
int iFlags;
timer_snapshot_t aSnapshot;
int iTargetname;
int iClassname;
ArrayList aFrames;
int iPreFrames;
bool bSegmented;
int iSerial;
bool bPractice;
int iGroundEntity;
}
#if defined USES_CHAT_COLORS
// hardcoded colors
char gS_GlobalColorNames[][] =
{
"{default}",
"{team}",
"{green}"
};
char gS_GlobalColors[][] =
{
"\x01",
"\x03",
"\x04"
};
char gS_CSGOColorNames[][] =
{
"{blue}",
"{bluegrey}",
"{darkblue}",
"{darkred}",
"{gold}",
"{grey}",
"{grey2}",
"{lightgreen}",
"{lightred}",
"{lime}",
"{orchid}",
"{yellow}",
"{palered}"
};
char gS_CSGOColors[][] =
{
"\x0B",
"\x0A",
"\x0C",
"\x02",
"\x10",
"\x08",
"\x0D",
"\x05",
"\x0F",
"\x06",
"\x0E",
"\x09",
"\x07"
};
#endif
// connects synchronously to the bhoptimer database
// calls errors if needed
stock Database GetTimerDatabaseHandle()
{
Database db = null;
char sError[255];
if(SQL_CheckConfig("shavit"))
{
if((db = SQL_Connect("shavit", true, sError, 255)) == null)
{
SetFailState("Timer startup failed. Reason: %s", sError);
}
}
else
{
db = SQLite_UseDatabase("shavit", sError, 255);
}
return db;
}
// figures out if the database is a mysql database
stock bool IsMySQLDatabase(Database db)
{
char sDriver[8];
db.Driver.GetIdentifier(sDriver, 8);
return StrEqual(sDriver, "mysql", false);
}
// retrieves the table prefix defined in configs/shavit-prefix.txt
stock void GetTimerSQLPrefix(char[] buffer, int maxlen)
{
char sFile[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sFile, PLATFORM_MAX_PATH, "configs/shavit-prefix.txt");
File fFile = OpenFile(sFile, "r");
if(fFile == null)
{
SetFailState("Cannot open \"configs/shavit-prefix.txt\". Make sure this file exists and that the server has read permissions to it.");
}
char sLine[PLATFORM_MAX_PATH * 2];
if(fFile.ReadLine(sLine, PLATFORM_MAX_PATH * 2))
{
TrimString(sLine);
strcopy(buffer, maxlen, sLine);
}
delete fFile;
}
stock bool IsValidClient(int client, bool bAlive = false)
{
return (client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && !IsClientSourceTV(client) && (!bAlive || IsPlayerAlive(client)));
}
stock bool IsSource2013(EngineVersion ev)
{
return (ev == Engine_CSS || ev == Engine_TF2);
}
stock void IPAddressToString(int ip, char[] buffer, int maxlen)
{
FormatEx(buffer, maxlen, "%d.%d.%d.%d", ((ip >> 24) & 0xFF), ((ip >> 16) & 0xFF), ((ip >> 8) & 0xFF), (ip & 0xFF));
}
stock int IPStringToAddress(const char[] ip)
{
char sExplodedAddress[4][4];
ExplodeString(ip, ".", sExplodedAddress, 4, 4, false);
int iIPAddress =
(StringToInt(sExplodedAddress[0]) << 24) |
(StringToInt(sExplodedAddress[1]) << 16) |
(StringToInt(sExplodedAddress[2]) << 8) |
StringToInt(sExplodedAddress[3]);
return iIPAddress;
}
// time formatting!
stock void FormatSeconds(float time, char[] newtime, int newtimesize, bool precise = true)
{
float fTempTime = time;
if(fTempTime < 0.0)
{
fTempTime = -fTempTime;
}
int iRounded = RoundToFloor(fTempTime);
float fSeconds = (iRounded % 60) + fTempTime - iRounded;
char sSeconds[8];
FormatEx(sSeconds, 8, precise? "%s%.03f":"%s%.01f", (time < 0.0)? "-":"", fSeconds);
if(fTempTime < 60.0)
{
strcopy(newtime, newtimesize, sSeconds);
}
else
{
int iMinutes = (iRounded / 60);
if(fTempTime < 3600.0)
{
FormatEx(newtime, newtimesize, "%s%d:%s%s", (time < 0.0)? "-":"", iMinutes, (fSeconds < 10)? "0":"", sSeconds);
}
else
{
iMinutes %= 60;
int iHours = (iRounded / 3600);
FormatEx(newtime, newtimesize, "%s%d:%s%d:%s%s", (time < 0.0)? "-":"", iHours, (iMinutes < 10)? "0":"", iMinutes, (fSeconds < 10)? "0":"", sSeconds);
}
}
}
/**
* Called before shavit-core processes the client's usercmd.
* Before this is called, safety checks (fake/dead clients) happen.
* Use this forward in modules that use OnPlayerRunCmd to avoid errors and unintended behavior.
* If a module conflicts with buttons/velocity/angles being changed in shavit-core, this forward is recommended.
* This forward will NOT be called if a player's timer is paused.
*
* @param client Client index.
* @param buttons Buttons sent in the usercmd.
* @param impulse Impulse sent in the usercmd.
* @param vel A vector that contains the player's desired movement. vel[0] is forwardmove, vel[1] is sidemove.
* @param angles The player's requested viewangles. They will not necessarily be applied as SRCDS itself won't accept every value.
* @param status The player's timer status.
* @param track The player's timer track.
* @param style The player's bhop style.
* @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, stylesettings_t stylesettings, int mouse[2]);
/**
* Called just before shavit-core adds time to a player's timer.
* This is the forward you should use to modify the player's timer smoothly.
* A good example use case is timescaling.
*
* @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 A stylesettings_t struct that contains the player's bhop style's settings.
* @noreturn
*/
forward void Shavit_OnTimeIncrement(int client, timer_snapshot_t snapshot, float &time, stylesettings_t stylesettings);
/**
* Called just before shavit-core adds time to a player's timer.
* This is the forward you should use to modify the player's timer smoothly.
* A good example use case is timescaling.
*
* @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 A stylesettings_t struct that contains the player's bhop style's settings.
* @noreturn
*/
forward void Shavit_OnTimeIncrementPost(int client, float time, stylesettings_t stylesettings);
/**
* Called when a player's timer starts.
* (WARNING: Will be called every tick when the player stands at the start zone!)
*
* @param client Client index.
* @param track Timer track.
* @return Plugin_Continue to do nothing or anything else to not start the timer.
*/
forward Action Shavit_OnStart(int client, int track);
/**
* Called when a player uses the restart command.
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
forward void Shavit_OnRestart(int client, int track);
/**
* Called when a player uses the !end command.
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
forward void Shavit_OnEnd(int client, int track);
/**
* Called before a player's timer is stopped. (stop =/= finish a map)
*
* @param client Client index.
* @param track Timer track.
* @return False to prevent the timer from stopping.
*/
forward bool Shavit_OnStopPre(int client, int track);
/**
* Called when a player's timer stops. (stop =/= finish a map)
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
forward void Shavit_OnStop(int client, int track);
/**
* Called before a player finishes a map.
*
* @param client Client index.
* @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, timer_snapshot_t snapshot);
/**
* Called when a player finishes a map. (touches the end zone)
*
* @param client Client index.
* @param style Style the record was done on.
* @param time Record time.
* @param jumps Jumps amount.
* @param strafes Amount of strafes.
* @param sync Sync percentage (0.0 to 100.0) or -1.0 when not measured.
* @param track Timer track.
* @param oldtime The player's best time on the map before this finish.
* @param perfs Perfect jump percentage (0.0 to 100.0) or 100.0 when not measured.
* @noreturn
*/
forward void Shavit_OnFinish(int client, int style, float time, int jumps, int strafes, float sync, int track, float oldtime, float perfs);
/**
* Like Shavit_OnFinish, but after the insertion query was called.
* Called from shavit-wr
*
* @param client Client index.
* @param style Style the record was done on.
* @param time Record time.
* @param jumps Jumps amount.
* @param strafes Amount of strafes.
* @param sync Sync percentage (0.0 to 100.0) or -1.0 when not measured.
* @param rank Rank on map.
* @param overwrite 1 - brand new record. 2 - update.
* @param track Timer track.
* @param oldtime The player's best time on the map before this finish.
* @param perfs Perfect jump percentage (0.0 to 100.0) or 100.0 when not measured.
* @noreturn
*/
forward void Shavit_OnFinish_Post(int client, int style, float time, int jumps, int strafes, float sync, int rank, int overwrite, int track, float oldtime, float perfs);
/**
* Called when there's a new WR on the map.
*
* @param client Client index.
* @param style Style the record was done on.
* @param time Record time.
* @param jumps Jumps amount.
* @param strafes Amount of strafes.
* @param sync Sync percentage (0.0 to 100.0) or -1.0 when not measured.
* @param track Timer track.
* @param oldwr Time of the old WR. 0.0 if there's none.
* @param oldtime The player's best time on the map before this finish.
* @param perfs Perfect jump percentage (0.0 to 100.0) or 100.0 when not measured.
* @noreturn
*/
forward void Shavit_OnWorldRecord(int client, int style, float time, int jumps, int strafes, float sync, int track, float oldwr, float oldtime, float perfs);
/**
* Called when an admin deletes a WR.
*
* @param style Style the record was done on.
* @param id Record ID. -1 if mass deletion.
* @param track Timer track.
* @noreturn
*/
forward void Shavit_OnWRDeleted(int style, int id, int track);
/**
* Called when a player's timer paused.
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
forward void Shavit_OnPause(int client, int track);
/**
* Called when a player's timer resumed.
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
forward void Shavit_OnResume(int client, int track);
/**
* Called when a player changes their bhopstyle.
* Note: Doesn't guarantee that the player is in-game or connected.
*
* @param client Client index.
* @param oldstyle Old bhop style.
* @param newstyle New bhop style.
* @param track Timer track.
* @param manual Was the change manual, or assigned automatically?
* @noreturn
*/
forward void Shavit_OnStyleChanged(int client, int oldstyle, int newstyle, int track, bool manual);
/**
* Called when a player changes their bhop track.
*
* @param client Client index.
* @param oldtrack Old bhop track.
* @param newtrack New bhop track.
* @noreturn
*/
forward void Shavit_OnTrackChanged(int client, int oldtrack, int newtrack);
/**
* Called when the styles configuration finishes loading and it's ready to load everything into the cache.
*
* @param styles Amount of styles loaded.
* @noreturn
*/
forward void Shavit_OnStyleConfigLoaded(int styles);
/**
* Called when there's a successful connection to the database and it is ready to be used.
* Called through shavit-core after migrations have been applied, and after the attempt to create the default `users` table.
*
* @noreturn
*/
forward void Shavit_OnDatabaseLoaded();
/**
* Called when the chat messages configuration finishes loading and it's ready to load everything into the cache.
*
* @noreturn
*/
forward void Shavit_OnChatConfigLoaded();
/**
* Called when a player teleports with checkpoints.
*
* @param client Client index.
* @param index Checkpoint that was teleported to.
* @return Plugin_Continue to allow teleporting, anything else to prevent.
*/
forward Action Shavit_OnTeleport(int client, int index);
/**
* Called when a player teleports with checkpoints.
*
* @param client Client index.
* @param index Checkpoint that was saved to.
* @param overflow Does this checkpoint shift the rest.
* @return Plugin_Continue to allow teleporting, anything else to prevent.
*/
forward Action Shavit_OnSave(int client, int index, bool overflow);
/**
* Called when a player enters a zone.
*
* @param client Client index.
* @param type Zone type.
* @param track Zone track.
* @param id Zone ID.
* @param entity Zone trigger entity index.
* @param data Zone data if any.
* @noreturn
*/
forward void Shavit_OnEnterZone(int client, int type, int track, int id, int entity, int data);
/**
* Called when a player leaves a zone.
*
* @param client Client index.
* @param type Zone type.
* @param track Zone track.
* @param id Zone ID.
* @param entity Zone trigger entity index.
* @param data Zone data if any.
* @noreturn
*/
forward void Shavit_OnLeaveZone(int client, int type, int track, int id, int entity, int data);
/**
* Called when a player gets the worst record in the server for the style.
* Note: Will be only called for ranked styles.
*
* @param client Client index.
* @param style Style the record was done on.
* @param time Record time.
* @param jumps Jumps amount.
* @param strafes Amount of strafes.
* @param sync Sync percentage (0.0 to 100.0) or -1.0 when not measured.
* @param track Timer track.
* @param oldtime The player's best time on the map before this finish.
* @param perfs Perfect jump percentage (0.0 to 100.0) or 100.0 when not measured.
* @noreturn
*/
forward void Shavit_OnWorstRecord(int client, int style, float time, int jumps, int strafes, float sync, int track, float oldtime, float perfs);
/**
* Gets called when a map's tier is assigned.
* Only called once per map, if the rankings plugin is enabled.
* The exception is if the admin changes the current map's tier.
*
* @param map Map display name.
* @param tier Map's tier.
* @noreturn
*/
forward void Shavit_OnTierAssigned(const char[] map, int tier);
/**
* Gets called when the server acknowledges the client's ranking status.
* It is called after OnClientPostAdminCheck and at forced rank recalculations.
*
* @param client Client index.
* @param rank Client's rank. (0 if unranked or unassigned)
* @param points Client's points. (0.0 if unranked or unassigned)
* @param first True if the forward is called after the initial connection, false if it is caused by recalculation.
* @noreturn
*/
forward void Shavit_OnRankAssigned(int client, int rank, float points, bool first);
/**
* Called when replay playback starts.
*
* @param client Client index for the bot.
* @noreturn
*/
forward void Shavit_OnReplayStart(int client);
/**
* Called when replay playback ends.
*
* @param client Client index for the bot.
* @noreturn
*/
forward void Shavit_OnReplayEnd(int client);
/**
* Called when all replays files have been loaded.
*
* @noreturn
*/
forward void Shavit_OnReplaysLoaded();
/**
* Called when top left HUD updates.
*
* @param client Client index that recieves the hud.
* @param target Client index that recieves the hud.
* @param topleft Reference to the HUD buffer.
* @param topleftlength Max length of the topleft buffer.
* @return Plugin_Handled or Plugin_Stop to block the HUD message from appearing. Anything else to pass along new values.
*/
forward Action Shavit_OnTopLeftHUD(int client, int target, char[] topleft, int topleftlength);
/**
* Called before clan tag variables are processed.
*
* @param client Client index.
* @param clantag Reference to the clan tag buffer.
* @param clantaglength Max length of the customtag buffer.
* @return Plugin_Handled or Plugin_Stop to block the clan tag from changing. Anything else to pass along new values.
*/
forward Action Shavit_OnClanTagChangePre(int client, char[] clantag, int clantaglength);
/**
* Called after clan tags are changed.
*
* @param client Client index.
* @param customtag Reference to the custom clan tag buffer.
* @param customtaglength Max length of the customtag buffer.
* @noreturn
*/
forward void Shavit_OnClanTagChangePost(int client, char[] customtag, int customtaglength);
/**
* Called before the timer finish message is printed to the users.
*
* @param client Client index.
* @param everyone Is the message printed to everyone, or just the client?
* @param snapshot A snapshot of the client's timer when printing the message.
* @param overwrite Modify the database? 0 - no. 1 - brand new record. 2 - new personal best.
* @param rank Rank on map.
* @return Plugin_Handled or Plugin_Stop to stop the message. Anything else to use new values.
*/
forward Action Shavit_OnFinishMessage(int client, bool &everyone, timer_snapshot_t snapshot, int overwrite, int rank, char[] message, int maxlen);
/**
* Called when a clients dynamic timescale has been changed.
*
* @param client Client index.
* @param oldtimescale The old timescale value
* @param newtimescale The new timescale value
* @noreturn
*/
forward void Shavit_OnTimescaleChanged(int client, float oldtimescale, float newtimescale);
/**
* Called after the checkpoint menu has been made and before it's sent to the client.
*
* @param client Client index.
* @param segmented If the menu was a segmented menu
* @return Plugin_Handled or Plugin_Stop to stop the menu.
*/
forward Action Shavit_OnCheckPointMenuMade(int client, bool segmented);
/**
* Called when before a selection is processed in the main checkpoint menu.
*
* @param client Client index.
* @param param2 Second parameter in the callback, usually the item selected.
* @param info reference copy of the info string used in the callback
* @param maxlength length of the info buffer
* @param currentCheckpoint Clients current checkpoint
* @param maxCPs Max checkpoints the client can use
* @return Plugin_Continue to continue the callback.
*/
forward Action Shavit_OnCheckpointMenuSelect(int client, int param2, char[] info, int maxlength, int currentCheckpoint, int maxCPs);
/**
* Returns the game type the server is running.
*
* @return Game type. (See "enum ServerGame")
*/
#pragma deprecated Use GetEngineVersion() instead.
native EngineVersion Shavit_GetGameType();
/**
* Returns the database handle the timer is using.
*
* @param hSQL Handle to store the database on.
* @noreturn
*/
#pragma deprecated Use Shavit_GetDatabase() instead.
native void Shavit_GetDB(Database &hSQL);
/**
* Returns bhoptimer's database handle.
* Call within Shavit_OnDatabaseLoaded. Safety is not guaranteed anywhere else!
*
* @return Database handle.
*/
native Database Shavit_GetDatabase();
/**
* Starts the timer for a player.
* Will not teleport the player to anywhere, it's handled inside the mapzones plugin.
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
native void Shavit_StartTimer(int client, int track);
/**
* Restarts the timer for a player.
* Will work as if the player just used sm_r.
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
native void Shavit_RestartTimer(int client, int track);
/**
* Stops the timer for a player.
* Will not teleport the player to anywhere, it's handled inside the mapzones plugin.
*
* @param client Client index.
* @param bypass Bypass call to Shavit_OnStopPre?
* @return True if the operation went through.
*/
native bool Shavit_StopTimer(int client, bool bypass = true);
/**
* Deletes all map records for the specified map.
* Plugin will refresh if map is currently on.
*
* @param map Map name.
* @noreturn
*/
native void Shavit_WR_DeleteMap(const char[] map);
/**
* Deletes all map zones for the specified map.
* Plugin will refresh if map is currently on.
*
* @param map Map name.
* @noreturn
*/
native void Shavit_Zones_DeleteMap(const char[] map);
/**
* Deletes all replays for the specified map.
* Plugin will refresh if map is currently on.
*
* @param map Map name.
* @noreturn
*/
native void Shavit_Replay_DeleteMap(const char[] map);
/**
* Deletes tier setting for the specified map.
* Points recalculation will run right after this is finished.
*
* @param map Map name.
* @noreturn
*/
native void Shavit_Rankings_DeleteMap(const char[] map);
/**
* Changes a player's bhop style.
*
* @param client Client index.
* @param style Style.
* @param force Ignore style permissions. This being true will bypass the `inaccessible` style setting as well.
* @param manual Is it a manual style change? (Was it caused by user interaction?)
* @param noforward Bypasses the call to `Shavit_OnStyleChanged`.
* @return False if failed due to lack of access, true otherwise.
*/
native bool Shavit_ChangeClientStyle(int client, int style, bool force = false, bool manual = false, bool noforward = false);
/**
* Finishes the map for a player, with their current timer stats.
* Will not teleport the player to anywhere, it's handled inside the mapzones plugin.
*
* @param client Client index.
* @param track Timer track.
* @noreturn
*/
native void Shavit_FinishMap(int client, int track);
/**
* Stores the player's timer stats on variables
*
* @param client Client index.
* @param time Time passed since the player started.
* @param jumps How many times the player jumped since he started.
* @param style Style, check "enum BhopStyle"
* @param started Timer started?
* @noreturn
*/
#pragma deprecated Use different natives or Shavit_SaveSnapshot instead.
native void Shavit_GetTimer(int client, float &time, int &jumps, int &style, bool &started);
/**
* Retrieve a client's current time.
*
* @param client Client index.
* @return Current time.
*/
native float Shavit_GetClientTime(int client);
/**
* Retrieve the client's track. (Track_Main/Track_Bonus etc..)
*
* @param client Client index.
* @return Timer track.
*/
native int Shavit_GetClientTrack(int client);
/**
* Retrieve client jumps since timer start.
*
* @param client Client index.
* @return Current amount of jumps, 0 if timer is inactive.
*/
native int Shavit_GetClientJumps(int client);
/**
* Retrieve a client's bhopstyle
*
* @param client Client index.
* @return Style.
*/
native int Shavit_GetBhopStyle(int client);
/**
* Retrieve a client's timer status
*
* @param client Client index.
* @return See TimerStatus enum.
*/
native TimerStatus Shavit_GetTimerStatus(int client);
/**
* Retrieve the amount of strafes done since the timer started.
* Will return 0 if timer isn't running.
*
* @param client Client index.
* @return Amount of strafes since timer start.
*/
native int Shavit_GetStrafeCount(int client);
/**
* Retrieve the perfect jumps percentage for the player.
* Will return 100.0 if no jumps were measured.
*
* @param client Client index.
* @return Perfect jump percentage.
*/
native float Shavit_GetPerfectJumps(int client);
/**
* Retrieve strafe sync since timer start.
* Will return 0.0 if timer isn't running or -1.0 when not measured.
*
* @param client Client index.
* @return Amount of strafes since timer start.
*/
native float Shavit_GetSync(int client);
/**
* Saves the WR time for the current map on a variable.
*
* @param style Style to get the WR for.
* @param time Reference to the time variable. 0.0 will be returned if no records.
* @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);
/**
* Reloads WR leaderboards cache for the current map.
*
* @noreturn
*/
native void Shavit_ReloadLeaderboards();
/**
* Saves the WR's record ID for the current map on a variable.
* Unused in base plugins, as of pre-1.4b.
*
* @param style Style to get the WR for.
* @param time Reference to the time variable. 0.0 will be returned if no records.
* @param track Timer track.
* @noreturn
*/
native void Shavit_GetWRRecordID(int style, int &recordid, int track);
/**
* Saves the WR's player name on the map on a variable.
*
* @param style Style to get the WR for.
* @param wrname Reference to the name variable.
* @param wrmaxlength Max length for the string.
* @param track Timer track.
* @noreturn
*/
native void Shavit_GetWRName(int style, char[] wrname, int wrmaxlength, int track);
/**
* Saves the player's personal best time on a variable.
*
* @param client Client index.
* @param style Style to get the PB for.
* @param time Reference to the time variable. 0.0 will be returned if no personal record.
* @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.
*
* @param style Style.
* @param track Timer track.
* @return Amount of records.
*/
native int Shavit_GetRecordAmount(int style, int track);
/**
* Calculate potential rank for a given style and time.
*
* @param style Style.
* @param time Time to check for.
* @param track Timer track.
* @return Map rank.
*/
native int Shavit_GetRankForTime(int style, float time, int track);
/**
* Retrieves the time of a record from a specified rank.
*
* @param style Style.
* @param rank Rank to retrieve the time from.
* @param track Timer track.
* @return Record time. 0.0 if none.
*/
native float Shavit_GetTimeForRank(int style, int rank, int track);
/**
* Checks if a mapzone exists.
*
* @param type Mapzone type.
* @param track Mapzone track, -1 to ignore track.
* @return Boolean value.
*/
native bool Shavit_ZoneExists(int type, int track);
/**
* Checks if a player is inside a mapzone.
*
* @param client Client index.
* @param type Mapzone type.
* @param track Mapzone track, -1 to ignore track.
* @return Boolean value.
*/
native bool Shavit_InsideZone(int client, int type, int track);
/**
* Gets the specified zone's data.
*
* @param zoneid ID of the zone we query the data of.
* @return Zone data. 0 if none is specified.
*/
native int Shavit_GetZoneData(int zoneid);
/**
* Gets the specified zone's flags.
*
* @param zoneid ID of the zone we query the flags of.
* @return Zone flags. 0 if none is specified.
*/
native int Shavit_GetZoneFlags(int zoneid);
/**
* Checks if a player is inside a mapzone.
*
* @param client Client index.
* @param type Mapzone type.
* @param track Mapzone track, -1 to ignore track.
* @param zoneid Reference to variable that will hold the zone's ID.
* @return Boolean value.
*/
native bool Shavit_InsideZoneGetID(int client, int type, int track, int &zoneid);
/**
* Checks if a player is in the process of creating a mapzone.
*
* @param client Client index.
* @return Boolean value.
*/
native bool Shavit_IsClientCreatingZone(int client);
/**
* Pauses a player's timer.
*
* @param client Client index.
* @noreturn
*/
native void Shavit_PauseTimer(int client);
/**
* Resumes a player's timer.
*
* @param client Client index.
* @param teleport Should the player be teleported to their location prior to saving?
* @noreturn
*/
native void Shavit_ResumeTimer(int client, bool teleport = false);
/**
* Deletes the specified replay file.
* Replay data will be unloaded if necessary.
*
* @param map Map display name.
* @param style Bhop style.
* @param track Timer track.
* @return true if replay existed, false otherwise.
*/
native bool Shavit_DeleteReplay(const char[] map, int style, int track);
/**
* Retrieves the engine time of the replay bot's first frame.
*
* @param style Style.
* @param time Reference to save the time on.
* @noreturn
*/
native void Shavit_GetReplayBotFirstFrame(int style, float &time);
/**
* Retrieve the replay bot's client index.
*
* @param style Style.
* @return Client index for the replay bot.
*/
native int Shavit_GetReplayBotIndex(int style);
/**
* Retrieve the style being played by the replay bot.
*
* @param client Client index.
* @return Style being played by the replay bot. -1 if it's a central replay bot that's idle.
*/
native int Shavit_GetReplayBotStyle(int client);
/**
* Retrieve the timer track being played by the replay bot.
*
* @param client Client index.
* @return Timer track replayed by the bot. -1 if it's not a bot.
*/
native int Shavit_GetReplayBotTrack(int client);
/**
* Gets the replay bot type setting of the server.
*
* @return See ReplayBotType enum.
*/
native ReplayBotType Shavit_GetReplayBotType();
/**
* Retrieve the replay bot's current played frame.
*
* @param style Style.
* @return Current played frame.
*/
native int Shavit_GetReplayBotCurrentFrame(int style);
/**
* Retrieves a replay's frame count.
*
* @param style Style.
* @param track Track.
* @noreturn
*/
native int Shavit_GetReplayFrameCount(int style, int track);
/**
* Retrieves the replay data for the given style and track.
*
* @param style Style.
* @param track Track.
* @return ArrayList with proper replay data, or null if there is no recorded data.
*/
native ArrayList Shavit_GetReplayFrames(int style, int track);
/**
* Retrieves a client's frame count.
*
* @param client Client Index.
* @return Current number of frames.
*/
native int Shavit_GetClientFrameCount(int client);
/**
* Retrieves a replay's total length in seconds.
*
* @param style Style.
* @param track Track.
* @noreturn
*/
native float Shavit_GetReplayLength(int style, int track);
/**
* Retrieves an actively playing replay's time.
*
* @param style Style.
* @param track Track. (ignored for non-central bots)
* @noreturn
*/
native float Shavit_GetReplayTime(int style, int track);
/**
* Retrieves a replay holder's name.
*
* @param style Style.
* @param track Track.
* @param buffer Buffer string.
* @param length String length.
* @noreturn
*/
native void Shavit_GetReplayName(int style, int track, char[] buffer, int length);
/**
* Hijack the replay data so that this view angle will be used for the next tick.
* Use case is to make segmented runs look smoother.
*
* @param client Client index.
* @param pitch Vertical view angle.
* @param yaw Horizontal view angle.
* @noreturn
*/
native void Shavit_HijackAngles(int client, float pitch, float yaw);
/**
* Checks if there's loaded replay data for a bhop style or not.
*
* @param style Style.
* @param track Track.
* @return Boolean value of if there's loaded replay data.
*/
native bool Shavit_IsReplayDataLoaded(int style, int track);
/**
* Gets player points.
*
* @param client Client index.
* @return Points. 0.0 if unranked.
*/
native float Shavit_GetPoints(int client);
/**
* Gets player rank.
*
* @param client Client index.
* @return Rank. 0 if unranked.
*/
native int Shavit_GetRank(int client);
/**
* Gets the amount of players with over 0 points.
*
* @return Amount of ranked players.
*/
native int Shavit_GetRankedPlayers();
/**
* Force an HUD update for a player. Requires shavit-hud.
*
* @param client Client index.
* @param spectators Should also update it for the player's spectators?
* @error Error code 200 if client isn't valid.
* @return Amount of players that had their HUD updated (client + spectators) or -1 on error.
*/
native int Shavit_ForceHUDUpdate(int client, bool spectators);
/**
* Opens the stats menu for a client.
*
* @param client Client index.
* @param steamid Target Steam account ID to use.
* @noreturn
*/
native void Shavit_OpenStatsMenu(int client, int steamid);
/**
* Retrieves the amount of #1 records a player has.
* Result will depend on the value of `shavit_stats_mvprankones`.
* Called from shavit-stats.
*
* @param client Client index.
* @noreturn
*/
native int Shavit_GetWRCount(int client);
/**
* Saves the style settings on `any` references.
*
* @param style Style index.
* @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[sizeof(stylesettings_t)]);
/**
* Saves the style related strings on string references.
*
* @param style Style index.
* @param stringtype String type to grab.
* @param StyleStrings Reference to the string buffer.
* @param size Max length for the buffer.
* @return SP_ERROR_NONE on success, anything else on failure.
*/
native int Shavit_GetStyleStrings(int style, int stringtype, char[] StyleStrings, int size);
/**
* Retrieves the amount of styles in the server.
*
* @return Amount of styles or -1 if there's an error.
*/
native int Shavit_GetStyleCount();
/**
* Gets an array with style IDs in their configured menu ordering as specified in the styles config.
*
* @param arr Reference to array to fill with style IDs.
* @param size Array size.
* @noreturn
*/
native void Shavit_GetOrderedStyles(int[] arr, int size);
/**
* Saves chat related strings on string references.
*
* @param stringtype String type to grab.
* @param ChatStrings Reference to the string buffer.
* @param size Max length for the buffer.
* @return SP_ERROR_NONE on success, anything else on failure.
*/
native int Shavit_GetChatStrings(int stringtype, char[] ChatStrings, int size);
/**
* Gets the HUD settings of a player.
* See the HUD_* defines for information.
*
* @param client Client index.
* @return HUD settings.
*/
native int Shavit_GetHUDSettings(int client);
/**
* Sets practice mode on a client.
* Practice mode means that the client's records will not be saved, just like unranked mode, but for ranked styles.
* Intended to be used by checkpoints.
*
* @param client Client index.
* @param practice Enable or disable practice mode.
* @param alert Alert the client about practice mode?
* @noreturn
*/
native void Shavit_SetPracticeMode(int client, bool practice, bool alert);
/**
* Gets a client's practice mode status.
*
* @param client Client index.
* @return Practice mode status.
*/
native bool Shavit_IsPracticeMode(int client);
/**
* Save a client's timer into a snapshot.
* 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[sizeof(timer_snapshot_t)]);
/**
* Restores the client's timer from a snapshot.
*
* @param client Client index.
* @param snapshot Full snapshot of the client's timer.
* @noreturn
*/
native void Shavit_LoadSnapshot(int client, any snapshot[sizeof(timer_snapshot_t)]);
/**
* Sets a player's replay recording frames from a provided ArrayList.
* To be used by save states/TAS etc.
*
* @param client Client index.
* @param data ArrayList with proper replay data.
* @noreturn
*/
native void Shavit_SetReplayData(int client, ArrayList data);
/**
* Saves a player's replay recording frames (if exists) into an ArrayList.
* To be used by save states/TAS etc.
*
* @param client Client index.
* @return ArrayList with proper replay data, or null if the player has no recorded data.
*/
native ArrayList Shavit_GetReplayData(int client);
/**
* Reloads a specific replay into the replay bot cache.
* Note: Not guaranteed to work with legacy replay bots.
*
* @param style Replay style.
* @param track Replay track.
* @param restart Restart the playback of the replay bot if it's playing?
* @param path Path to the replay file. Use `BuildPath(Path_SM, ...)` to generate one. Leave as empty to use default.
* @return Was the replay loaded?
*/
native bool Shavit_ReloadReplay(int style, int track, bool restart, char[] path = "");
/**
* Reloads all of the replays for the map.
* Note: Not guaranteed to work with legacy replay bots.
*
* @param restart Restart the playback of the replay bots?
* @return Amount of loaded replays.
*/
native int Shavit_ReloadReplays(bool restart);
/**
* 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
*/
native void Shavit_StopChatSound();
/**
* Marks a map as if it has built-in zones/buttons.
*
* @noreturn
*/
native void Shavit_MarkKZMap();
/**
* Lets us know if the map was marked as a KZ map.
* KZ map: a map with built-in zones/buttons.
* Does not necessarily mean that the map was designed for KZ gameplay.
*
* @return Boolean value.
*/
native bool Shavit_IsKZMap();
/**
* Gets the map tier for a specified map.
* Use the map's display name.
*
* @param map Map to get the tier of.
* @return Map tier. 0 if no results were found.
*/
native int Shavit_GetMapTier(const char[] map);
/**
* Gets a StringMap that contains all the cached map tiers.
* The returned StringMap must be deleted from memory after use!
*
* @return StringMap with {const char[]: map, int: tier} structure.
*/
native StringMap Shavit_GetMapTiers();
/**
* Retrieves style access for a player.
*
* @param client Client index.
* @param style Style.
* @return Boolean value.
*/
native bool Shavit_HasStyleAccess(int client, int style);
/**
* Determines whether a client's timer is paused or not.
*
* @param client Client index.
* @return Boolean value.
*/
native bool Shavit_IsPaused(int client);
/**
* Determines whether a client is able to pause their timer or not.
*
* @param client Client index.
* @return Flags which are reasons to allow pausing or not, see CPR enum. 0 if toggling pause is allowed.
*/
native int Shavit_CanPause(int client);
/**
* Use this native when printing anything in chat if it's related to the timer.
* This native will auto-assign colors and a chat prefix.
*
* @param client Client index.
* @param format Formatting rules.
* @param any Variable number of format parameters.
* @return PrintToChat()
*/
native int Shavit_PrintToChat(int client, const char[] format, any ...);
/**
* Logs an entry to bhoptimer's log file.
* (addons/sourcemod/logs/shavit.log)
*
* @param format Formatting rules.
* @param any Variable number of format parameters.
* @noreturn
*/
native void Shavit_LogMessage(const char[] format, any ...);
/**
* Gets the total number of CPs that a client has saved
*
* @param client Client index
*
* @return Total number of checkpoints
*/
native int Shavit_GetTotalCheckpoints(int client);
/**
* Gets CP data for a client at specified index
*
* @param client Client index
* @param index Index of CP to get
* @param cpcache Buffer to store cp data in
*
* @noreturn
*/
native bool Shavit_GetCheckpoint(int client, int index, any cpcache[sizeof(cp_cache_t)]);
/**
* Sets checkpoint data at the given index for the given client
*
* @param client Client index
* @param index Index of CP to set, or -1 to push cp as last
* @param cpcache Buffer with cp data
*
* @noreturn
*/
native void Shavit_SetCheckpoint(int client, int index, any cpcache[sizeof(cp_cache_t)]);
/**
* Teleports client to the checkpoint at given index
*
* @param client Client index
* @param index Index of CP to teleport to
* @param suppress Supress checkpoint message
*
* @noreturn
*/
native void Shavit_TeleportToCheckpoint(int client, int index, bool suppress = false);
/**
* Clears all saved checkpoints for the specified client
*
* @param client Client index
*
* @noreturn
*/
native void Shavit_ClearCheckpoints(int client);
/**
* Opens checkpoint menu for a client
*
* @param client Client index
*
* @noreturn
*/
native void Shavit_OpenCheckpointMenu(int client);
/**
* Sets the clients dynamic timescale. -1.0 to use the timescale of the client's style.
* Note: Values above 1.0 won't scale into the replay bot.
*
* @param client Client index
* @param scale New timescale
*
* @noreturn
*/
native void Shavit_SetClientTimescale(int client, float scale);
/**
* Gets the clients dynamic timescale, or -1.0 if unset.
*
* @param client Client index
*
* @return Client's dynamic timescale
*/
native float Shavit_GetClientTimescale(int client);
/**
* Gets the replay status
*
* @param style Replay style
*
* @return Replay's status
*/
native ReplayStatus Shavit_GetReplayStatus(int style);
/**
* Saves a new checkpoint and returns the new checkpoint index
*
* @param client Client index
*
* @return The new current checkpoint
*/
native int Shavit_SaveCheckpoint(int client);
/**
* Gets the current checkpoint index.
*
* @param client Client index
*
* @return The current checkpoint
*/
native int Shavit_GetCurrentCheckpoint(int client);
/**
* Sets the current checkpoint index.
*
* @param client Client index
* @param index New index to use
*
* @noreturn
*/
native void Shavit_SetCurrentCheckpoint(int client, int index);
/*
* returns the number of preframes in the players current run.
*
* @param client Client index
*
* @return Preframe count
*/
native int Shavit_GetPlayerPreFrame(int client);
/*
* Sets player's preframe length.
*
* @param client Client index
* @param preframe preframe length
*
* @noreturn
*/
native void Shavit_SetPlayerPreFrame(int client, int preframe);
// same as Shavit_PrintToChat() but loops through the whole server
// code stolen from the base halflife.inc file
stock void Shavit_PrintToChatAll(const char[] format, any ...)
{
char buffer[300];
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i))
{
SetGlobalTransTarget(i);
VFormat(buffer, 300, format, 2);
Shavit_PrintToChat(i, "%s", buffer);
}
}
}
public SharedPlugin __pl_shavit =
{
name = "shavit",
// SM bug? commented until it's fixed
// file = "shavit-core.smx",
#if defined REQUIRE_PLUGIN
required = 1
#else
required = 0
#endif
};
#if !defined REQUIRE_PLUGIN
public void __pl_shavit_SetNTVOptional()
{
MarkNativeAsOptional("Shavit_CanPause");
MarkNativeAsOptional("Shavit_ChangeClientStyle");
MarkNativeAsOptional("Shavit_DeleteReplay");
MarkNativeAsOptional("Shavit_FinishMap");
MarkNativeAsOptional("Shavit_ForceHUDUpdate");
MarkNativeAsOptional("Shavit_FormatChat");
MarkNativeAsOptional("Shavit_GetBhopStyle");
MarkNativeAsOptional("Shavit_GetChatStrings");
MarkNativeAsOptional("Shavit_GetClientJumps");
MarkNativeAsOptional("Shavit_GetClientPB");
MarkNativeAsOptional("Shavit_GetClientTime");
MarkNativeAsOptional("Shavit_GetClientTrack");
MarkNativeAsOptional("Shavit_GetDatabase");
MarkNativeAsOptional("Shavit_GetDB");
MarkNativeAsOptional("Shavit_GetHUDSettings");
MarkNativeAsOptional("Shavit_GetMapTier");
MarkNativeAsOptional("Shavit_GetMapTiers");
MarkNativeAsOptional("Shavit_GetOrderedStyles");
MarkNativeAsOptional("Shavit_GetPerfectJumps");
MarkNativeAsOptional("Shavit_GetPlayerPB");
MarkNativeAsOptional("Shavit_GetPoints");
MarkNativeAsOptional("Shavit_GetRank");
MarkNativeAsOptional("Shavit_GetRankedPlayers");
MarkNativeAsOptional("Shavit_GetRankForTime");
MarkNativeAsOptional("Shavit_GetRecordAmount");
MarkNativeAsOptional("Shavit_GetReplayBotCurrentFrame");
MarkNativeAsOptional("Shavit_GetClientFrameCount");
MarkNativeAsOptional("Shavit_GetReplayBotFirstFrame");
MarkNativeAsOptional("Shavit_GetReplayBotIndex");
MarkNativeAsOptional("Shavit_GetReplayBotStyle");
MarkNativeAsOptional("Shavit_GetReplayBotTrack");
MarkNativeAsOptional("Shavit_GetReplayBotType");
MarkNativeAsOptional("Shavit_GetReplayData");
MarkNativeAsOptional("Shavit_GetReplayFrameCount");
MarkNativeAsOptional("Shavit_GetReplayFrames");
MarkNativeAsOptional("Shavit_GetReplayLength");
MarkNativeAsOptional("Shavit_GetReplayName");
MarkNativeAsOptional("Shavit_GetReplayStatus");
MarkNativeAsOptional("Shavit_GetReplayTime");
MarkNativeAsOptional("Shavit_GetStrafeCount");
MarkNativeAsOptional("Shavit_GetStyleCount");
MarkNativeAsOptional("Shavit_GetStyleSettings");
MarkNativeAsOptional("Shavit_GetStyleStrings");
MarkNativeAsOptional("Shavit_GetSync");
MarkNativeAsOptional("Shavit_GetTimeForRank");
MarkNativeAsOptional("Shavit_GetTimer");
MarkNativeAsOptional("Shavit_GetTimerStatus");
MarkNativeAsOptional("Shavit_GetWorldRecord");
MarkNativeAsOptional("Shavit_GetWRCount");
MarkNativeAsOptional("Shavit_GetWRName");
MarkNativeAsOptional("Shavit_GetWRRecordID");
MarkNativeAsOptional("Shavit_GetWRTime");
MarkNativeAsOptional("Shavit_GetZoneData");
MarkNativeAsOptional("Shavit_GetZoneFlags");
MarkNativeAsOptional("Shavit_HasStyleAccess");
MarkNativeAsOptional("Shavit_HijackAngles");
MarkNativeAsOptional("Shavit_InsideZone");
MarkNativeAsOptional("Shavit_InsideZoneGetID");
MarkNativeAsOptional("Shavit_IsClientCreatingZone");
MarkNativeAsOptional("Shavit_IsKZMap");
MarkNativeAsOptional("Shavit_IsPaused");
MarkNativeAsOptional("Shavit_IsPracticeMode");
MarkNativeAsOptional("Shavit_IsReplayDataLoaded");
MarkNativeAsOptional("Shavit_LoadSnapshot");
MarkNativeAsOptional("Shavit_MarkKZMap");
MarkNativeAsOptional("Shavit_OpenStatsMenu");
MarkNativeAsOptional("Shavit_PauseTimer");
MarkNativeAsOptional("Shavit_PrintToChat");
MarkNativeAsOptional("Shavit_Rankings_DeleteMap");
MarkNativeAsOptional("Shavit_ReloadLeaderboards");
MarkNativeAsOptional("Shavit_ReloadReplay");
MarkNativeAsOptional("Shavit_ReloadReplays");
MarkNativeAsOptional("Shavit_Replay_DeleteMap");
MarkNativeAsOptional("Shavit_RestartTimer");
MarkNativeAsOptional("Shavit_ResumeTimer");
MarkNativeAsOptional("Shavit_SaveSnapshot");
MarkNativeAsOptional("Shavit_SetPracticeMode");
MarkNativeAsOptional("Shavit_SetReplayData");
MarkNativeAsOptional("Shavit_StartTimer");
MarkNativeAsOptional("Shavit_StopChatSound");
MarkNativeAsOptional("Shavit_StopTimer");
MarkNativeAsOptional("Shavit_WR_DeleteMap");
MarkNativeAsOptional("Shavit_ZoneExists");
MarkNativeAsOptional("Shavit_Zones_DeleteMap");
MarkNativeAsOptional("Shavit_GetTotalCheckpoints");
MarkNativeAsOptional("Shavit_GetCheckpoint");
MarkNativeAsOptional("Shavit_SetCheckpoint");
MarkNativeAsOptional("Shavit_TeleportToCheckpoint");
MarkNativeAsOptional("Shavit_ClearCheckpoints");
MarkNativeAsOptional("Shavit_OpenCheckpointMenu");
MarkNativeAsOptional("Shavit_GetClientTimescale");
MarkNativeAsOptional("Shavit_SetClientTimescale");
MarkNativeAsOptional("Shavit_SaveCheckpoint");
MarkNativeAsOptional("Shavit_GetCurrentCheckpoint");
MarkNativeAsOptional("Shavit_SetCurrentCheckpoint");
MarkNativeAsOptional("Shavit_GetPlayerPreFrame");
MarkNativeAsOptional("Shavit_GetPlayerTimerframe");
MarkNativeAsOptional("Shavit_SetPlayerPreFrame");
}
#endif