mirror of
https://github.com/shavitush/bhoptimer.git
synced 2025-12-06 18:08:26 +00:00
Started using Atom - let it auto indent everything.
This commit is contained in:
parent
da1438f379
commit
e04243592d
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
# SourcePawn
|
||||
*.smx
|
||||
*.dll
|
||||
*.so
|
||||
*.so
|
||||
|
||||
@ -21,4 +21,4 @@
|
||||
- [x] + player slaying zone
|
||||
- [x] + cvar "shavit_zones_style"
|
||||
0 - 3d (default)
|
||||
1 - 2d
|
||||
1 - 2d
|
||||
|
||||
@ -8,4 +8,4 @@
|
||||
- [x] + Allow creation of freestyle zones
|
||||
- [x] + Make multiple freestyle zones possible (damn you Aoki and badges for making stuff difficult!)
|
||||
- [x] + Handle deletion of multiple freestyle zones
|
||||
- [x] + Handle drawing of end/freestyle zones properly
|
||||
- [x] + Handle drawing of end/freestyle zones properly
|
||||
|
||||
@ -19,9 +19,9 @@ a bhop server should be simple
|
||||
"Databases"
|
||||
{
|
||||
"driver_default" "mysql"
|
||||
|
||||
|
||||
// When specifying "host", you may use an IP address, a hostname, or a socket file path
|
||||
|
||||
|
||||
"default"
|
||||
{
|
||||
"driver" "default"
|
||||
@ -32,7 +32,7 @@ a bhop server should be simple
|
||||
//"timeout" "0"
|
||||
//"port" "0"
|
||||
}
|
||||
|
||||
|
||||
"shavit"
|
||||
{
|
||||
"driver" "mysql"
|
||||
@ -62,4 +62,4 @@ shavit-zones - wouldn't really call it required but it's actually needed to get
|
||||
- [ ] Add admin interface (delete replay data)
|
||||
- [ ] Remove replay bot on deletion of the #1 record
|
||||
|
||||
~ [NEW PLUGIN] shavit-ranks:
|
||||
~ [NEW PLUGIN] shavit-ranks:
|
||||
|
||||
@ -23,4 +23,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
* 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
|
||||
@ -68,7 +68,7 @@ ConVar gCV_Leftright = null;
|
||||
ConVar gCV_Restart = null;
|
||||
ConVar gCV_Pause = null;
|
||||
|
||||
public Plugin myinfo =
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] Core",
|
||||
author = "shavit",
|
||||
@ -92,7 +92,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
|
||||
CreateNative("Shavit_GetTimer", Native_GetTimer);
|
||||
CreateNative("Shavit_PauseTimer", Native_PauseTimer);
|
||||
CreateNative("Shavit_ResumeTimer", Native_ResumeTimer);
|
||||
|
||||
|
||||
MarkNativeAsOptional("Shavit_GetGameType");
|
||||
MarkNativeAsOptional("Shavit_GetDB");
|
||||
MarkNativeAsOptional("Shavit_StartTimer");
|
||||
@ -101,13 +101,13 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
|
||||
MarkNativeAsOptional("Shavit_GetTimer");
|
||||
MarkNativeAsOptional("Shavit_PauseTimer");
|
||||
MarkNativeAsOptional("Shavit_ResumeTimer");
|
||||
|
||||
|
||||
// prevent errors from shavit-zones
|
||||
MarkNativeAsOptional("Shavit_InsideZone");
|
||||
|
||||
|
||||
// registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins
|
||||
RegPluginLibrary("shavit");
|
||||
|
||||
|
||||
gB_Late = late;
|
||||
|
||||
return APLRes_Success;
|
||||
@ -180,7 +180,7 @@ public void OnPluginStart()
|
||||
RegConsoleCmd("sm_pause", Command_TogglePause, "Toggle pause.");
|
||||
RegConsoleCmd("sm_unpause", Command_TogglePause, "Toggle pause.");
|
||||
RegConsoleCmd("sm_resume", Command_TogglePause, "Toggle pause");
|
||||
|
||||
|
||||
// autobhop toggle
|
||||
RegConsoleCmd("sm_auto", Command_AutoBhop, "Toggle autobhop.");
|
||||
RegConsoleCmd("sm_autobhop", Command_AutoBhop, "Toggle autobhop.");
|
||||
@ -189,27 +189,27 @@ public void OnPluginStart()
|
||||
#if defined DEBUG
|
||||
RegConsoleCmd("sm_finishtest", Command_FinishTest);
|
||||
#endif
|
||||
|
||||
|
||||
CreateConVar("shavit_version", SHAVIT_VERSION, "Plugin version.", FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_DONTRECORD);
|
||||
|
||||
|
||||
gCV_Autobhop = CreateConVar("shavit_core_autobhop", "1", "Enable autobhop?", FCVAR_PLUGIN|FCVAR_NOTIFY);
|
||||
gCV_Leftright = CreateConVar("shavit_core_blockleftright", "1", "Block +left/right?", FCVAR_PLUGIN|FCVAR_NOTIFY);
|
||||
gCV_Restart = CreateConVar("shavit_core_restart", "1", "Allow commands that restart the timer?", FCVAR_PLUGIN|FCVAR_NOTIFY);
|
||||
gCV_Pause = CreateConVar("shavit_core_pause", "1", "Allow pausing?", FCVAR_PLUGIN|FCVAR_NOTIFY);
|
||||
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
// late
|
||||
if(gB_Late)
|
||||
{
|
||||
OnAdminMenuReady(null);
|
||||
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
OnClientPutInServer(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gB_Zones = LibraryExists("shavit-zones");
|
||||
}
|
||||
|
||||
@ -232,7 +232,7 @@ public void OnLibraryRemoved(const char[] name)
|
||||
public void OnAdminMenuReady(Handle topmenu)
|
||||
{
|
||||
Handle hTopMenu = INVALID_HANDLE;
|
||||
|
||||
|
||||
if(LibraryExists("adminmenu") && ((hTopMenu = GetAdminTopMenu()) != INVALID_HANDLE))
|
||||
{
|
||||
AddToTopMenu(hTopMenu, "Timer Commands", TopMenuObject_Category, CategoryHandler, INVALID_TOPMENUOBJECT);
|
||||
@ -268,20 +268,20 @@ public Action Command_StartTimer(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
if(!gCV_Restart.BoolValue)
|
||||
{
|
||||
if(args != -1)
|
||||
{
|
||||
char sCommand[16];
|
||||
GetCmdArg(0, sCommand, 16);
|
||||
|
||||
|
||||
ReplyToCommand(client, "%s The command (\x03%s\x01) is disabled.", PREFIX, sCommand);
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
Call_StartForward(gH_Forwards_OnRestart);
|
||||
Call_PushCell(client);
|
||||
Call_Finish();
|
||||
@ -309,21 +309,21 @@ public Action Command_TogglePause(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
if(!gCV_Pause.BoolValue)
|
||||
{
|
||||
char sCommand[16];
|
||||
GetCmdArg(0, sCommand, 16);
|
||||
|
||||
|
||||
ReplyToCommand(client, "%s The command (\x03%s\x01) is disabled.", PREFIX, sCommand);
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
if(!(GetEntityFlags(client) & FL_ONGROUND))
|
||||
{
|
||||
ReplyToCommand(client, "%s You are not allowed to pause when not on ground.", PREFIX);
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -336,7 +336,7 @@ public Action Command_TogglePause(int client, int args)
|
||||
{
|
||||
PauseTimer(client);
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -355,11 +355,11 @@ public Action Command_AutoBhop(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
gB_Auto[client] = !gB_Auto[client];
|
||||
|
||||
|
||||
ReplyToCommand(client, "%s Autobhop %s\x01.", PREFIX, gB_Auto[client]? "\x04enabled":"\x02disabled");
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -417,9 +417,9 @@ public Action Command_Forwards(int client, int args)
|
||||
gBS_Style[client] = Style_Forwards;
|
||||
|
||||
ReplyToCommand(client, "%s You have selected to play \x03Forwards", PREFIX);
|
||||
|
||||
|
||||
StopTimer(client);
|
||||
|
||||
|
||||
Command_StartTimer(client, -1);
|
||||
|
||||
return Plugin_Handled;
|
||||
@ -431,13 +431,13 @@ public Action Command_Sideways(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
gBS_Style[client] = Style_Sideways;
|
||||
|
||||
ReplyToCommand(client, "%s You have selected to play \x03Sideways", PREFIX);
|
||||
|
||||
|
||||
StopTimer(client);
|
||||
|
||||
|
||||
Command_StartTimer(client, -1);
|
||||
|
||||
return Plugin_Handled;
|
||||
@ -502,7 +502,7 @@ public int Native_StartTimer(Handle handler, int numParams)
|
||||
if(!IsFakeClient(client))
|
||||
{
|
||||
StartTimer(client);
|
||||
|
||||
|
||||
Call_StartForward(gH_Forwards_Start);
|
||||
Call_PushCell(client);
|
||||
Call_Finish();
|
||||
@ -537,14 +537,14 @@ public int Native_FinishMap(Handle handler, int numParams)
|
||||
public int Native_PauseTimer(Handle handler, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
|
||||
PauseTimer(client);
|
||||
}
|
||||
|
||||
public int Native_ResumeTimer(Handle handler, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
|
||||
ResumeTimer(client);
|
||||
}
|
||||
|
||||
@ -610,7 +610,7 @@ public float CalculateTime(int client)
|
||||
{
|
||||
if(!gB_ClientPaused[client])
|
||||
{
|
||||
return GetEngineTime() - gF_StartTime[client] - gF_PauseTotalTime[client];
|
||||
return GetEngineTime() - gF_StartTime[client] - gF_PauseTotalTime[client];
|
||||
}
|
||||
|
||||
else
|
||||
@ -627,7 +627,7 @@ public void OnClientDisconnect(int client)
|
||||
public void OnClientPutInServer(int client)
|
||||
{
|
||||
gB_Auto[client] = true;
|
||||
|
||||
|
||||
StopTimer(client);
|
||||
|
||||
gBS_Style[client] = Style_Forwards;
|
||||
@ -743,7 +743,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3
|
||||
}
|
||||
|
||||
bool bEdit = false;
|
||||
|
||||
|
||||
// SW cheat blocking
|
||||
if(!Shavit_InsideZone(client, Zone_Freestyle) && gBS_Style[client] == Style_Sideways && !bOnLadder && (vel[1] != 0.0 || buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT))
|
||||
{
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
* 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
|
||||
@ -36,7 +36,7 @@ bool gB_HUD[MAXPLAYERS+1] = {true, ...};
|
||||
|
||||
int gI_StartCycle = 0;
|
||||
|
||||
char gS_Start[][] =
|
||||
char gS_Start[][] =
|
||||
{
|
||||
"ff0000",
|
||||
"ff4000",
|
||||
@ -52,7 +52,7 @@ char gS_Start[][] =
|
||||
|
||||
int gI_EndCycle = 0;
|
||||
|
||||
char gS_End[][] =
|
||||
char gS_End[][] =
|
||||
{
|
||||
"ff0000",
|
||||
"ff4000",
|
||||
@ -64,7 +64,7 @@ char gS_End[][] =
|
||||
"77449c"
|
||||
};
|
||||
|
||||
public Plugin myinfo =
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] HUD",
|
||||
author = "shavit",
|
||||
@ -90,12 +90,12 @@ public void OnPluginStart()
|
||||
{
|
||||
// prevent errors in case the replay bot isn't loaded
|
||||
gB_Replay = LibraryExists("shavit-replay");
|
||||
|
||||
|
||||
CreateTimer(0.1, UpdateHUD_Timer, INVALID_HANDLE, TIMER_REPEAT);
|
||||
|
||||
|
||||
RegConsoleCmd("sm_togglehud", Command_ToggleHUD, "Toggle the timer's HUD");
|
||||
RegConsoleCmd("sm_hud", Command_ToggleHUD, "Toggle the timer's HUD");
|
||||
|
||||
|
||||
RegConsoleCmd("sm_zonehud", Command_ToggleZoneHUD, "Toggle the timer's flashing zone HUD");
|
||||
}
|
||||
|
||||
@ -107,18 +107,18 @@ public void OnClientPutInServer(int client)
|
||||
public Action Command_ToggleHUD(int client, int args)
|
||||
{
|
||||
gB_HUD[client] = !gB_HUD[client];
|
||||
|
||||
|
||||
ReplyToCommand(client, "%s HUD %s\x01.", PREFIX, gB_HUD[client]? "\x04enabled":(gSG_Type == Game_CSGO? "\x02disabled":"\x05disabled"));
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action Command_ToggleZoneHUD(int client, int args)
|
||||
{
|
||||
gB_ZoneHUD[client] = !gB_ZoneHUD[client];
|
||||
|
||||
|
||||
ReplyToCommand(client, "%s Zone HUD %s\x01.", PREFIX, gB_ZoneHUD[client]? "\x04enabled":(gSG_Type == Game_CSGO? "\x02disabled":"\x05disabled"));
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -153,19 +153,19 @@ public void OnConfigsExecuted()
|
||||
public Action UpdateHUD_Timer(Handle Timer)
|
||||
{
|
||||
gI_StartCycle++;
|
||||
|
||||
|
||||
if(gI_StartCycle > 9)
|
||||
{
|
||||
gI_StartCycle = 0;
|
||||
}
|
||||
|
||||
|
||||
gI_EndCycle++;
|
||||
|
||||
|
||||
if(gI_EndCycle > 7)
|
||||
{
|
||||
gI_EndCycle = 0;
|
||||
}
|
||||
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
if(!IsValidClient(i) || !gB_HUD[i])
|
||||
@ -195,23 +195,23 @@ public void UpdateHUD(int client)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char sHintText[256];
|
||||
|
||||
|
||||
if(gB_ZoneHUD[client] && gSG_Type == Game_CSGO && Shavit_InsideZone(target, Zone_Start))
|
||||
{
|
||||
FormatEx(sHintText, 256, "<font size=\"45\" color=\"#%s\">Start Zone</font>", gS_Start[gI_StartCycle]);
|
||||
|
||||
|
||||
PrintHintText(client, sHintText);
|
||||
}
|
||||
|
||||
|
||||
else if(gB_ZoneHUD[client] && gSG_Type == Game_CSGO && Shavit_InsideZone(target, Zone_End))
|
||||
{
|
||||
FormatEx(sHintText, 256, "<font size=\"45\" color=\"#%s\">End Zone</font>", gS_End[gI_EndCycle]);
|
||||
|
||||
|
||||
PrintHintText(client, sHintText);
|
||||
}
|
||||
|
||||
|
||||
else if(!IsFakeClient(target))
|
||||
{
|
||||
float fTime;
|
||||
@ -219,119 +219,119 @@ public void UpdateHUD(int client)
|
||||
BhopStyle bsStyle;
|
||||
bool bStarted;
|
||||
Shavit_GetTimer(target, fTime, iJumps, bsStyle, bStarted);
|
||||
|
||||
|
||||
float fWR;
|
||||
Shavit_GetWRTime(bsStyle, fWR);
|
||||
|
||||
|
||||
float fSpeed[3];
|
||||
GetEntPropVector(target, Prop_Data, "m_vecVelocity", fSpeed);
|
||||
|
||||
float fSpeed_New = SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0));
|
||||
|
||||
|
||||
float fPB;
|
||||
Shavit_GetPlayerPB(target, bsStyle, fPB);
|
||||
|
||||
|
||||
char sPB[32];
|
||||
FormatSeconds(fPB, sPB, 32);
|
||||
|
||||
|
||||
char sTime[32];
|
||||
FormatSeconds(fTime, sTime, 32, false);
|
||||
|
||||
|
||||
if(gSG_Type == Game_CSGO)
|
||||
{
|
||||
FormatEx(sHintText, 256, "<font face='Stratum2'>");
|
||||
|
||||
|
||||
if(bStarted)
|
||||
{
|
||||
char sColor[8];
|
||||
|
||||
|
||||
if(fTime < fWR || fWR == 0.0)
|
||||
{
|
||||
strcopy(sColor, 8, "00FF00");
|
||||
}
|
||||
|
||||
|
||||
else if(fPB != 0.0 && fTime < fPB)
|
||||
{
|
||||
strcopy(sColor, 8, "FFA500");
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
strcopy(sColor, 8, "FF0000");
|
||||
}
|
||||
|
||||
|
||||
Format(sHintText, 256, "%sTime: <font color='#%s'>%s</font>", sHintText, sColor, sTime);
|
||||
}
|
||||
|
||||
|
||||
Format(sHintText, 256, "%s\nStyle: <font color='%s</font>", sHintText, bsStyle == Style_Forwards? "#797FD4'>Forwards":"#B54CB3'>Sideways");
|
||||
|
||||
|
||||
if(fPB > 0.00)
|
||||
{
|
||||
Format(sHintText, 256, "%s\tPB: %s", sHintText, sPB);
|
||||
}
|
||||
|
||||
|
||||
Format(sHintText, 256, "%s\nSpeed: %.02f%s", sHintText, fSpeed_New, fSpeed_New < 10? "\t":"");
|
||||
|
||||
|
||||
if(bStarted)
|
||||
{
|
||||
Format(sHintText, 256, "%s\tJumps: %d", sHintText, iJumps);
|
||||
}
|
||||
|
||||
|
||||
Format(sHintText, 256, "%s\nPlayer: <font color='#BF6821'>%N</font>", sHintText, target);
|
||||
|
||||
|
||||
Format(sHintText, 256, "%s</font>", sHintText);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
if(bStarted)
|
||||
{
|
||||
FormatEx(sHintText, 256, "Time: %s", sTime);
|
||||
|
||||
|
||||
Format(sHintText, 256, "%s\nStyle: %s", sHintText, bsStyle == Style_Forwards? "Forwards":"Sideways");
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sHintText, 256, "Style: %s", bsStyle == Style_Forwards? "Forwards":"Sideways");
|
||||
}
|
||||
|
||||
|
||||
if(fPB > 0.00)
|
||||
{
|
||||
Format(sHintText, 256, "%s\nPB: %s", sHintText, sPB);
|
||||
}
|
||||
|
||||
|
||||
Format(sHintText, 256, "%s\nSpeed: %.02f%s", sHintText, fSpeed_New, fSpeed_New < 10? "\t":"");
|
||||
|
||||
|
||||
if(bStarted)
|
||||
{
|
||||
Format(sHintText, 256, "%s\nJumps: %d", sHintText, iJumps);
|
||||
}
|
||||
|
||||
|
||||
Format(sHintText, 256, "%s\nPlayer: %N", sHintText, target);
|
||||
}
|
||||
|
||||
|
||||
PrintHintText(client, sHintText);
|
||||
}
|
||||
|
||||
|
||||
else if(gB_Replay)
|
||||
{
|
||||
BhopStyle bsStyle = (target == Shavit_GetReplayBotIndex(Style_Forwards)? Style_Forwards:Style_Sideways);
|
||||
|
||||
|
||||
/* will work on this when I find enough time
|
||||
float fBotStart;
|
||||
Shavit_GetReplayBotFirstFrame(bsStyle, fBotStart);
|
||||
|
||||
|
||||
float fTime = GetEngineTime() - fBotStart;
|
||||
|
||||
|
||||
char sTime[32];
|
||||
FormatSeconds(fTime, sTime, 32, false);*/
|
||||
|
||||
|
||||
float fSpeed[3];
|
||||
GetEntPropVector(target, Prop_Data, "m_vecVelocity", fSpeed);
|
||||
|
||||
float fSpeed_New = SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0));
|
||||
|
||||
|
||||
if(gSG_Type == Game_CSGO)
|
||||
{
|
||||
FormatEx(sHintText, 256, "<font face='Stratum2'>");
|
||||
@ -340,14 +340,14 @@ public void UpdateHUD(int client)
|
||||
Format(sHintText, 256, "%s\nSpeed: %.02f", sHintText, fSpeed_New);
|
||||
Format(sHintText, 256, "%s</font>", sHintText);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sHintText, 256, "\t- Replay Bot -", sHintText);
|
||||
Format(sHintText, 256, "%s\nStyle: %s", sHintText, bsStyle == Style_Forwards? "Forwards":"Sideways");
|
||||
Format(sHintText, 256, "%s\nSpeed: %.02f", sHintText, fSpeed_New);
|
||||
}
|
||||
|
||||
|
||||
PrintHintText(client, sHintText);
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
* 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
|
||||
@ -44,7 +44,7 @@ ConVar gCV_RespawnOnTeam = null;
|
||||
// dhooks
|
||||
Handle gH_GetMaxPlayerSpeed = null;
|
||||
|
||||
public Plugin myinfo =
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] Miscellaneous",
|
||||
author = "shavit",
|
||||
@ -63,7 +63,7 @@ public void OnPluginStart()
|
||||
// spectator list
|
||||
RegConsoleCmd("sm_specs", Command_Specs, "Show a list of spectators.");
|
||||
RegConsoleCmd("sm_spectators", Command_Specs, "Show a list of spectators.");
|
||||
|
||||
|
||||
// spec
|
||||
RegConsoleCmd("sm_spec", Command_Spec, "Moves you to the spectators' team. Usage: sm_spec [target]");
|
||||
RegConsoleCmd("sm_spectate", Command_Spec, "Moves you to the spectators' team. Usage: sm_spectate [target]");
|
||||
@ -71,61 +71,61 @@ public void OnPluginStart()
|
||||
// hide
|
||||
RegConsoleCmd("sm_hide", Command_Hide, "Toggle players' hiding.");
|
||||
RegConsoleCmd("sm_unhide", Command_Hide, "Toggle players' hiding.");
|
||||
|
||||
|
||||
// tpto
|
||||
RegConsoleCmd("sm_tpto", Command_Teleport, "Teleport to another player. Usage: sm_tpto [target]");
|
||||
RegConsoleCmd("sm_goto", Command_Teleport, "Teleport to another player. Usage: sm_goto [target]");
|
||||
|
||||
|
||||
// hook teamjoins
|
||||
AddCommandListener(Command_Jointeam, "jointeam");
|
||||
|
||||
// message
|
||||
CreateTimer(600.0, Timer_Message, INVALID_HANDLE, TIMER_REPEAT);
|
||||
|
||||
|
||||
// hooks
|
||||
HookEvent("player_spawn", Player_Spawn);
|
||||
HookEvent("player_team", Player_Team, EventHookMode_Pre);
|
||||
|
||||
// let's fix issues with phrases :D
|
||||
LoadTranslations("common.phrases");
|
||||
|
||||
|
||||
// CS:GO weapon cleanup
|
||||
if(Shavit_GetGameType() == Game_CSGO)
|
||||
{
|
||||
ConVar hDeathDropGun = FindConVar("mp_death_drop_gun");
|
||||
|
||||
|
||||
if(hDeathDropGun != null)
|
||||
{
|
||||
hDeathDropGun.SetBool(false);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
LogError("idk what's wrong but for some reason, your CS:GO server is missing the \"mp_death_drop_gun\" cvar. go find what's causing it because I dunno");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// cvars and stuff
|
||||
gCV_GodMode = CreateConVar("shavit_misc_godmode", "3", "Enable godmode for players?\n0 - Disabled\n1 - Only prevent fall/world damage.\n2 - Only prevent damage from other players.\n3 - Full godmode.");
|
||||
gCV_PreSpeed = CreateConVar("shavit_misc_prespeed", "3", "Stop prespeed in startzone?\n0 - Disabled\n1 - Limit 280 speed.\n2 - Block bhopping in startzone\n3 - Limit 280 speed and block bhopping in startzone.");
|
||||
gCV_HideTeamChanges = CreateConVar("shavit_misc_hideteamchanges", "1", "Hide team changes in chat?\n0 - Disabled\n1 - Enabled");
|
||||
gCV_RespawnOnTeam = CreateConVar("shavit_misc_respawnonteam", "1", "Respawn whenever a player joins a team?\n0 - Disabled\n1 - Enabled");
|
||||
|
||||
|
||||
AutoExecConfig();
|
||||
|
||||
|
||||
if(LibraryExists("dhooks"))
|
||||
{
|
||||
Handle hGameData = LoadGameConfigFile("shavit.games");
|
||||
|
||||
|
||||
if(hGameData != null)
|
||||
{
|
||||
int iOffset = GameConfGetOffset(hGameData, "GetMaxPlayerSpeed");
|
||||
gH_GetMaxPlayerSpeed = DHookCreate(iOffset, HookType_Entity, ReturnType_Float, ThisPointer_CBaseEntity, DHook_GetMaxPlayerSpeed);
|
||||
}
|
||||
|
||||
|
||||
CloseHandle(hGameData);
|
||||
}
|
||||
|
||||
|
||||
// late load
|
||||
if(gB_Late)
|
||||
{
|
||||
@ -143,18 +143,18 @@ public Action Command_Jointeam(int client, const char[] command, int args)
|
||||
{
|
||||
char arg1[8];
|
||||
GetCmdArg(1, arg1, 8);
|
||||
|
||||
|
||||
int iTeam = StringToInt(arg1);
|
||||
|
||||
|
||||
// client is trying to join the same team he's now.
|
||||
// i'll let the game handle it.
|
||||
if(GetClientTeam(client) == iTeam)
|
||||
{
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
bool bRespawn = false;
|
||||
|
||||
|
||||
switch(iTeam)
|
||||
{
|
||||
case CS_TEAM_T:
|
||||
@ -163,41 +163,41 @@ public Action Command_Jointeam(int client, const char[] command, int args)
|
||||
if(FindEntityByClassname(-1, "info_player_terrorist") != -1)
|
||||
{
|
||||
bRespawn = true;
|
||||
|
||||
|
||||
CS_SwitchTeam(client, CS_TEAM_T);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
case CS_TEAM_CT:
|
||||
{
|
||||
// if CT spawns are available in the map
|
||||
if(FindEntityByClassname(-1, "info_player_counterterrorist") != -1)
|
||||
{
|
||||
bRespawn = true;
|
||||
|
||||
|
||||
CS_SwitchTeam(client, CS_TEAM_CT);
|
||||
}
|
||||
}
|
||||
|
||||
// if they chose to spectate, i'll force them to join the spectators
|
||||
|
||||
// if they chose to spectate, i'll force them to join the spectators
|
||||
case CS_TEAM_SPECTATOR:
|
||||
{
|
||||
CS_SwitchTeam(client, CS_TEAM_SPECTATOR);
|
||||
}
|
||||
|
||||
|
||||
default:
|
||||
{
|
||||
return Plugin_Continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(bRespawn && gCV_RespawnOnTeam.BoolValue)
|
||||
{
|
||||
CS_RespawnPlayer(client);
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -206,10 +206,10 @@ public MRESReturn DHook_GetMaxPlayerSpeed(int pThis, Handle hReturn)
|
||||
if(IsValidClient(pThis, true))
|
||||
{
|
||||
DHookSetReturn(hReturn, 250.000);
|
||||
|
||||
|
||||
return MRES_Override;
|
||||
}
|
||||
|
||||
|
||||
return MRES_Ignored;
|
||||
}
|
||||
|
||||
@ -241,7 +241,7 @@ public Action OnPlayerRunCmd(int client, int &buttons)
|
||||
Shavit_StopTimer(client);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(Shavit_InsideZone(client, Zone_Start))
|
||||
{
|
||||
if((gCV_PreSpeed.IntValue == 2 || gCV_PreSpeed.IntValue == 3) && !(gF_LastFlags[client] & FL_ONGROUND) && (GetEntityFlags(client) & FL_ONGROUND) && buttons & IN_JUMP)
|
||||
@ -249,7 +249,7 @@ public Action OnPlayerRunCmd(int client, int &buttons)
|
||||
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, view_as<float>({0.0, 0.0, 0.0}));
|
||||
PrintToChat(client, "%s Bhopping in the start zone is not allowed.", PREFIX);
|
||||
gF_LastFlags[client] = GetEntityFlags(client);
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -260,19 +260,19 @@ public Action OnPlayerRunCmd(int client, int &buttons)
|
||||
|
||||
float fSpeed_New = SquareRoot(Pow(fSpeed[0], 2.0) + Pow(fSpeed[1], 2.0));
|
||||
float fScale = 280.0 / fSpeed_New;
|
||||
|
||||
if(fScale < 1.0) // 280 / 281 = below 1 | 280 / 279 = above 1
|
||||
|
||||
if(fScale < 1.0) // 280 / 281 = below 1 | 280 / 279 = above 1
|
||||
{
|
||||
fSpeed[0] *= fScale;
|
||||
fSpeed[1] *= fScale;
|
||||
|
||||
|
||||
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fSpeed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gF_LastFlags[client] = GetEntityFlags(client);
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -282,7 +282,7 @@ public void OnClientPutInServer(int client)
|
||||
|
||||
SDKHook(client, SDKHook_SetTransmit, OnSetTransmit);
|
||||
SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
|
||||
|
||||
|
||||
if(gH_GetMaxPlayerSpeed != null)
|
||||
{
|
||||
DHookEntity(gH_GetMaxPlayerSpeed, true, client);
|
||||
@ -297,7 +297,7 @@ public Action OnTakeDamage(int victim, int attacker)
|
||||
{
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
case 1:
|
||||
{
|
||||
// 0 - world/fall damage
|
||||
@ -306,7 +306,7 @@ public Action OnTakeDamage(int victim, int attacker)
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
case 2:
|
||||
{
|
||||
if(IsValidClient(attacker, true))
|
||||
@ -314,14 +314,14 @@ public Action OnTakeDamage(int victim, int attacker)
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// else
|
||||
default:
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -334,7 +334,7 @@ public Action OnSetTransmit(int entity, int client)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
else if(GetEntProp(client, Prop_Send, "m_iObserverMode") != 6 && GetEntPropEnt(client, Prop_Send, "m_hObserverTarget") != entity)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
@ -352,7 +352,7 @@ public Action OnClientSayCommand(int client, const char[] command, const char[]
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -364,7 +364,7 @@ public Action Command_Hide(int client, int args)
|
||||
}
|
||||
|
||||
gB_Hide[client] = !gB_Hide[client];
|
||||
|
||||
|
||||
// I use PTC instead of RTC there because I have an sm_hide bind just like many people :)
|
||||
PrintToChat(client, "%s You are now %shiding players.", PREFIX, gB_Hide[client]? "":"not ");
|
||||
|
||||
@ -377,24 +377,24 @@ public Action Command_Spec(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
ChangeClientTeam(client, CS_TEAM_SPECTATOR);
|
||||
|
||||
|
||||
if(args > 0)
|
||||
{
|
||||
char sArgs[MAX_TARGET_LENGTH];
|
||||
GetCmdArgString(sArgs, MAX_TARGET_LENGTH);
|
||||
|
||||
|
||||
int iTarget = FindTarget(client, sArgs, false, false);
|
||||
|
||||
|
||||
if(iTarget == -1)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", iTarget);
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -404,48 +404,48 @@ public Action Command_Teleport(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
if(args > 0)
|
||||
{
|
||||
char sArgs[MAX_TARGET_LENGTH];
|
||||
GetCmdArgString(sArgs, MAX_TARGET_LENGTH);
|
||||
|
||||
|
||||
int iTarget = FindTarget(client, sArgs, false, false);
|
||||
|
||||
|
||||
if(iTarget == -1)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
Teleport(client, GetClientSerial(iTarget));
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
Menu menu = CreateMenu(MenuHandler_Teleport);
|
||||
menu.SetTitle("Teleport to:");
|
||||
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
if(!IsValidClient(i, true) || i == client)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
char serial[16];
|
||||
IntToString(GetClientSerial(i), serial, 16);
|
||||
|
||||
|
||||
char sName[MAX_NAME_LENGTH];
|
||||
GetClientName(i, sName, MAX_NAME_LENGTH);
|
||||
|
||||
|
||||
menu.AddItem(serial, sName);
|
||||
}
|
||||
|
||||
|
||||
menu.ExitButton = true;
|
||||
|
||||
|
||||
menu.Display(client, 60);
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -455,13 +455,13 @@ public int MenuHandler_Teleport(Menu menu, MenuAction action, int param1, int pa
|
||||
{
|
||||
char info[16];
|
||||
menu.GetItem(param2, info, 16);
|
||||
|
||||
|
||||
if(Teleport(param1, StringToInt(info)) == -1)
|
||||
{
|
||||
Command_Teleport(param1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else if(action == MenuAction_End)
|
||||
{
|
||||
delete menu;
|
||||
@ -473,33 +473,33 @@ public int Teleport(int client, int targetserial)
|
||||
if(!IsPlayerAlive(client))
|
||||
{
|
||||
PrintToChat(client, "%s You can teleport only if you are alive.", PREFIX);
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int iTarget = GetClientFromSerial(targetserial);
|
||||
|
||||
|
||||
if(Shavit_InsideZone(client, Zone_Start) || Shavit_InsideZone(client, Zone_End))
|
||||
{
|
||||
PrintToChat(client, "%s You cannot teleport inside the start/end zones.", PREFIX);
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if(!iTarget)
|
||||
{
|
||||
PrintToChat(client, "%s Invalid target.", PREFIX);
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
float vecPosition[3];
|
||||
GetClientAbsOrigin(iTarget, vecPosition);
|
||||
|
||||
|
||||
Shavit_StopTimer(client);
|
||||
|
||||
|
||||
TeleportEntity(client, vecPosition, NULL_VECTOR, NULL_VECTOR);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -601,12 +601,12 @@ public void Shavit_OnRestart(int client)
|
||||
{
|
||||
CS_SwitchTeam(client, CS_TEAM_T);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
CS_SwitchTeam(client, CS_TEAM_CT);
|
||||
}
|
||||
|
||||
|
||||
CreateTimer(0.1, Respawn, client);
|
||||
}
|
||||
}
|
||||
@ -625,10 +625,10 @@ public Action Respawn(Handle Timer, any client)
|
||||
if(IsValidClient(client) && !IsPlayerAlive(client))
|
||||
{
|
||||
CS_RespawnPlayer(client);
|
||||
|
||||
|
||||
RestartTimer(client);
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -645,9 +645,9 @@ public Action Player_Team(Handle event, const char[] name, bool dontBroadcast)
|
||||
if(gCV_HideTeamChanges.BoolValue)
|
||||
{
|
||||
SetEventBroadcast(event, true);
|
||||
|
||||
|
||||
return Plugin_Changed;
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
* 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
|
||||
@ -47,7 +47,7 @@ char gS_Map[128];
|
||||
|
||||
ConVar bot_quota = null;
|
||||
|
||||
public Plugin myinfo =
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] Replay Bot",
|
||||
author = "shavit, ofir",
|
||||
@ -60,10 +60,10 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
|
||||
{
|
||||
CreateNative("Shavit_GetReplayBotFirstFrame", Native_GetReplayBotFirstFrame);
|
||||
CreateNative("Shavit_GetReplayBotIndex", Native_GetReplayBotIndex);
|
||||
|
||||
|
||||
MarkNativeAsOptional("Shavit_GetReplayBotFirstFrame");
|
||||
MarkNativeAsOptional("Shavit_GetReplayBotIndex");
|
||||
|
||||
|
||||
// registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins
|
||||
RegPluginLibrary("shavit-replay");
|
||||
|
||||
@ -73,30 +73,30 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
|
||||
public void OnPluginStart()
|
||||
{
|
||||
bot_quota = FindConVar("bot_quota");
|
||||
|
||||
|
||||
CreateTimer(1.0, BotCheck, INVALID_HANDLE, TIMER_REPEAT);
|
||||
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
OnClientPutInServer(i);
|
||||
}
|
||||
|
||||
|
||||
gF_Tickrate = (1.0 / GetTickInterval());
|
||||
|
||||
|
||||
// insert delete replay command here
|
||||
}
|
||||
|
||||
public int Native_GetReplayBotFirstFrame(Handle handler, int numParams)
|
||||
{
|
||||
BhopStyle style = GetNativeCell(1);
|
||||
|
||||
|
||||
SetNativeCellRef(2, gF_StartTick[style]);
|
||||
}
|
||||
|
||||
public int Native_GetReplayBotIndex(Handle handler, int numParams)
|
||||
{
|
||||
BhopStyle style = GetNativeCell(1);
|
||||
|
||||
|
||||
return gI_ReplayBotClient[style];
|
||||
}
|
||||
|
||||
@ -106,14 +106,14 @@ public Action BotCheck(Handle Timer)
|
||||
{
|
||||
bot_quota.SetInt(MAX_STYLES);
|
||||
}
|
||||
|
||||
|
||||
// resets bot
|
||||
if(gI_ReplayBotClient[Style_Forwards] == gI_ReplayBotClient[Style_Sideways])
|
||||
{
|
||||
gI_ReplayBotClient[Style_Forwards] = 0;
|
||||
gI_ReplayBotClient[Style_Sideways] = 0;
|
||||
}
|
||||
|
||||
|
||||
for(int i = 0; i < MAX_STYLES; i++)
|
||||
{
|
||||
if(gI_ReplayBotClient[i] == 0 || !IsValidClient(gI_ReplayBotClient[i]))
|
||||
@ -124,52 +124,52 @@ public Action BotCheck(Handle Timer)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
gI_ReplayBotClient[i] = j;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!IsValidClient(gI_ReplayBotClient[i]))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if(!IsPlayerAlive(gI_ReplayBotClient[i]))
|
||||
{
|
||||
CS_RespawnPlayer(gI_ReplayBotClient[i]);
|
||||
}
|
||||
|
||||
|
||||
if(GetPlayerWeaponSlot(gI_ReplayBotClient[i], CS_SLOT_KNIFE) == -1)
|
||||
{
|
||||
GivePlayerItem(gI_ReplayBotClient[i], "weapon_knife");
|
||||
}
|
||||
|
||||
|
||||
CS_SetClientContributionScore(gI_ReplayBotClient[i], 2000);
|
||||
|
||||
|
||||
char sStyle[16];
|
||||
FormatEx(sStyle, 16, "%s REPLAY", i == view_as<int>(Style_Forwards)? "NM":"SW");
|
||||
|
||||
|
||||
CS_SetClientClanTag(gI_ReplayBotClient[i], sStyle);
|
||||
|
||||
|
||||
char sName[MAX_NAME_LENGTH];
|
||||
GetClientName(gI_ReplayBotClient[i], sName, MAX_NAME_LENGTH);
|
||||
|
||||
|
||||
float fWRTime;
|
||||
Shavit_GetWRTime(view_as<BhopStyle>(i), fWRTime);
|
||||
|
||||
|
||||
if(gA_Frames[i] == null || fWRTime == 0.0)
|
||||
{
|
||||
char sCurrentName[MAX_NAME_LENGTH];
|
||||
strcopy(sCurrentName, MAX_NAME_LENGTH, sName);
|
||||
|
||||
|
||||
FormatEx(sName, MAX_NAME_LENGTH, "%s unloaded", i == view_as<int>(Style_Forwards)? "NM":"SW");
|
||||
|
||||
|
||||
if(!StrEqual(sName, sCurrentName))
|
||||
{
|
||||
SetClientName(gI_ReplayBotClient[i], sName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else if(!StrEqual(gS_BotName[i], sName))
|
||||
{
|
||||
SetClientName(gI_ReplayBotClient[i], gS_BotName[i]);
|
||||
@ -195,7 +195,7 @@ public Action HookTriggers(int entity, int other)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -203,90 +203,90 @@ public void OnMapStart()
|
||||
{
|
||||
GetCurrentMap(gS_Map, 128);
|
||||
RemoveMapPath(gS_Map, gS_Map, 128);
|
||||
|
||||
|
||||
char sTempMap[140];
|
||||
FormatEx(sTempMap, 140, "maps/%s.nav", gS_Map);
|
||||
|
||||
|
||||
if(!FileExists(sTempMap))
|
||||
{
|
||||
File_Copy("maps/base.nav", sTempMap);
|
||||
|
||||
|
||||
ForceChangeLevel(gS_Map, ".nav file generate");
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*ConVar bot_zombie = FindConVar("bot_zombie");
|
||||
|
||||
|
||||
// idk if it exists in CS:S, safety check ;p
|
||||
if(bot_zombie != null)
|
||||
{
|
||||
bot_zombie.Flags = FCVAR_GAMEDLL|FCVAR_REPLICATED;
|
||||
bot_zombie.SetBool(true);
|
||||
}*/
|
||||
|
||||
|
||||
ConVar bot_stop = FindConVar("bot_stop");
|
||||
bot_stop.SetBool(true);
|
||||
|
||||
|
||||
if(Shavit_GetGameType() == Game_CSGO)
|
||||
{
|
||||
// I have literally no idea why the fuck does this return invalid handle.
|
||||
// FindConVar("bot_controllable").SetBool(false);
|
||||
|
||||
|
||||
ConVar bot_controllable = FindConVar("bot_controllable");
|
||||
bot_controllable.SetBool(false);
|
||||
|
||||
|
||||
delete bot_controllable;
|
||||
}
|
||||
|
||||
|
||||
ConVar bot_quota_mode = FindConVar("bot_quota_mode");
|
||||
bot_quota_mode.SetString("normal");
|
||||
|
||||
|
||||
ConVar mp_autoteambalance = FindConVar("mp_autoteambalance");
|
||||
mp_autoteambalance.SetBool(false);
|
||||
|
||||
|
||||
ConVar mp_limitteams = FindConVar("mp_limitteams");
|
||||
mp_limitteams.SetInt(0);
|
||||
|
||||
|
||||
ServerCommand("bot_kick");
|
||||
|
||||
|
||||
for(int i = 1; i <= MAX_STYLES; i++)
|
||||
{
|
||||
ServerCommand("bot_add");
|
||||
}
|
||||
|
||||
|
||||
ConVar bot_join_after_player = FindConVar("bot_join_after_player");
|
||||
bot_join_after_player.SetBool(false);
|
||||
|
||||
|
||||
ConVar bot_chatter = FindConVar("bot_chatter");
|
||||
bot_chatter.SetString("off");
|
||||
|
||||
|
||||
ConVar bot_auto_vacate = FindConVar("bot_auto_vacate");
|
||||
bot_auto_vacate.SetBool(false);
|
||||
|
||||
|
||||
/*ConVar mp_ignore_round_win_conditions = FindConVar("mp_ignore_round_win_conditions");
|
||||
mp_ignore_round_win_conditions.SetBool(true);*/
|
||||
|
||||
|
||||
char sPath[PLATFORM_MAX_PATH];
|
||||
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "data/replaybot");
|
||||
|
||||
|
||||
if(!DirExists(sPath))
|
||||
{
|
||||
CreateDirectory(sPath, 511);
|
||||
}
|
||||
|
||||
|
||||
for(int i = 0; i < MAX_STYLES; i++)
|
||||
{
|
||||
gI_ReplayTick[i] = 0;
|
||||
gA_Frames[i] = new ArrayList(5);
|
||||
|
||||
|
||||
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "data/replaybot/%d", i);
|
||||
|
||||
|
||||
if(!DirExists(sPath))
|
||||
{
|
||||
CreateDirectory(sPath, 511);
|
||||
}
|
||||
|
||||
|
||||
if(!LoadReplay(view_as<BhopStyle>(i)))
|
||||
{
|
||||
FormatEx(gS_BotName[i], MAX_NAME_LENGTH, "%s unloaded", i == view_as<int>(Style_Forwards)? "NM":"SW");
|
||||
@ -302,37 +302,37 @@ public bool LoadReplay(BhopStyle style)
|
||||
if(FileExists(sPath))
|
||||
{
|
||||
Handle hFile = OpenFile(sPath, "r");
|
||||
|
||||
|
||||
ReadFileLine(hFile, gS_BotName[style], MAX_NAME_LENGTH);
|
||||
TrimString(gS_BotName[style]);
|
||||
|
||||
|
||||
char sLine[320];
|
||||
char sExplodedLine[5][64];
|
||||
|
||||
|
||||
ReadFileLine(hFile, sLine, 320);
|
||||
|
||||
|
||||
int iSize = 0;
|
||||
|
||||
|
||||
while(!IsEndOfFile(hFile))
|
||||
{
|
||||
ReadFileLine(hFile, sLine, 320);
|
||||
ExplodeString(sLine, "|", sExplodedLine, 5, 64);
|
||||
|
||||
|
||||
gA_Frames[style].Resize(++iSize);
|
||||
|
||||
|
||||
SetArrayCell(gA_Frames[style], iSize - 1, StringToFloat(sExplodedLine[0]), 0);
|
||||
SetArrayCell(gA_Frames[style], iSize - 1, StringToFloat(sExplodedLine[1]), 1);
|
||||
SetArrayCell(gA_Frames[style], iSize - 1, StringToFloat(sExplodedLine[2]), 2);
|
||||
|
||||
|
||||
SetArrayCell(gA_Frames[style], iSize - 1, StringToFloat(sExplodedLine[3]), 3);
|
||||
SetArrayCell(gA_Frames[style], iSize - 1, StringToFloat(sExplodedLine[4]), 4);
|
||||
}
|
||||
|
||||
|
||||
delete hFile;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -340,23 +340,23 @@ public void SaveReplay(BhopStyle style)
|
||||
{
|
||||
char sPath[PLATFORM_MAX_PATH];
|
||||
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "data/replaybot/%d/%s.replay", style, gS_Map);
|
||||
|
||||
|
||||
if(DirExists(sPath))
|
||||
{
|
||||
DeleteFile(sPath);
|
||||
}
|
||||
|
||||
|
||||
Handle hFile = OpenFile(sPath, "w");
|
||||
WriteFileLine(hFile, gS_BotName[style]);
|
||||
|
||||
|
||||
int iSize = gA_Frames[style].Length;
|
||||
|
||||
|
||||
char sBuffer[320];
|
||||
|
||||
|
||||
for(int i = 0; i < iSize; i++)
|
||||
{
|
||||
FormatEx(sBuffer, 320, "%f|%f|%f|%f|%f", GetArrayCell(gA_Frames[style], i, 0), GetArrayCell(gA_Frames[style], i, 1), GetArrayCell(gA_Frames[style], i, 2), GetArrayCell(gA_Frames[style], i, 3), GetArrayCell(gA_Frames[style], i, 4));
|
||||
|
||||
|
||||
WriteFileLine(hFile, sBuffer);
|
||||
}
|
||||
}
|
||||
@ -367,24 +367,24 @@ public void OnClientPutInServer(int client)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*if(IsFakeClient(client))
|
||||
{
|
||||
if(gI_ReplayBotClient[Style_Forwards] == 0)
|
||||
{
|
||||
gI_ReplayBotClient[Style_Forwards] = client;
|
||||
|
||||
|
||||
// strcopy(gS_BotName[Style_Sideways], MAX_NAME_LENGTH, "NM unloaded");
|
||||
}
|
||||
|
||||
|
||||
else if(gI_ReplayBotClient[Style_Sideways] == 0)
|
||||
{
|
||||
gI_ReplayBotClient[Style_Sideways] = client;
|
||||
|
||||
|
||||
// strcopy(gS_BotName[Style_Sideways], MAX_NAME_LENGTH, "SW unloaded");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{*/
|
||||
gA_PlayerFrames[client] = new ArrayList(5);
|
||||
@ -397,7 +397,7 @@ public void OnClientDisconnect(int client)
|
||||
{
|
||||
gI_ReplayBotClient[Style_Forwards] = 0;
|
||||
}
|
||||
|
||||
|
||||
else if(client == gI_ReplayBotClient[Style_Sideways])
|
||||
{
|
||||
gI_ReplayBotClient[Style_Sideways] = 0;
|
||||
@ -409,9 +409,9 @@ public void Shavit_OnStart(int client)
|
||||
if(!IsFakeClient(client))
|
||||
{
|
||||
gA_PlayerFrames[client].Clear();
|
||||
|
||||
|
||||
gI_PlayerFrames[client] = 0;
|
||||
|
||||
|
||||
gB_Record[client] = true;
|
||||
}
|
||||
}
|
||||
@ -424,24 +424,24 @@ public void Shavit_OnFinish(int client, BhopStyle style, float time, int jumps)
|
||||
public void Shavit_OnWorldRecord(int client, BhopStyle style, float time, int jumps)
|
||||
{
|
||||
gA_Frames[style] = gA_PlayerFrames[client].Clone();
|
||||
|
||||
|
||||
gI_ReplayTick[style] = 0;
|
||||
|
||||
|
||||
char sWRTime[16];
|
||||
FormatSeconds(time, sWRTime, 16);
|
||||
|
||||
|
||||
FormatEx(gS_BotName[style], MAX_NAME_LENGTH, "%s - %N", sWRTime, client);
|
||||
|
||||
|
||||
if(gI_ReplayBotClient[style] != 0)
|
||||
{
|
||||
// I won't be hiding this message, players can easily see the new WR like that.
|
||||
// gB_ShowNameChanges = false;
|
||||
|
||||
|
||||
SetClientName(gI_ReplayBotClient[style], gS_BotName[style]);
|
||||
}
|
||||
|
||||
|
||||
gA_PlayerFrames[client].Clear();
|
||||
|
||||
|
||||
SaveReplay(style);
|
||||
}
|
||||
|
||||
@ -459,94 +459,94 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3
|
||||
{
|
||||
float vecPosition[3];
|
||||
GetClientAbsOrigin(client, vecPosition);
|
||||
|
||||
|
||||
if(client == gI_ReplayBotClient[Style_Forwards] || client == gI_ReplayBotClient[Style_Sideways])
|
||||
{
|
||||
SetEntProp(client, Prop_Data, "m_CollisionGroup", 1);
|
||||
|
||||
|
||||
BhopStyle style = (client == gI_ReplayBotClient[Style_Forwards]? Style_Forwards:Style_Sideways);
|
||||
|
||||
|
||||
if(gA_Frames[style] == null) // if no replay is loaded
|
||||
{
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
float fWRTime;
|
||||
Shavit_GetWRTime(style, fWRTime);
|
||||
|
||||
|
||||
if(fWRTime != 0.0 && gI_ReplayTick[style] != -1)
|
||||
{
|
||||
if(gI_ReplayTick[style] >= gA_Frames[style].Length - 10)
|
||||
{
|
||||
gI_ReplayTick[style] = -1;
|
||||
|
||||
|
||||
CreateTimer(1.5, ResetReplay, style, TIMER_FLAG_NO_MAPCHANGE);
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
if(gI_ReplayTick[style] == 1)
|
||||
{
|
||||
gF_StartTick[style] = GetEngineTime();
|
||||
}
|
||||
|
||||
|
||||
gI_ReplayTick[style]++;
|
||||
|
||||
|
||||
float vecCurrentPosition[3];
|
||||
vecCurrentPosition[0] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style] - 1, 0);
|
||||
vecCurrentPosition[1] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style] - 1, 1);
|
||||
vecCurrentPosition[2] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style] - 1, 2);
|
||||
|
||||
|
||||
float vecAngles[3];
|
||||
vecAngles[0] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style] - 1, 3);
|
||||
vecAngles[1] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style] - 1, 4);
|
||||
|
||||
|
||||
float vecVelocity[3];
|
||||
|
||||
|
||||
float fDistance = 0.0;
|
||||
|
||||
|
||||
if(gA_Frames[style].Length >= gI_ReplayTick[style] + 1)
|
||||
{
|
||||
float vecNextPosition[3];
|
||||
vecNextPosition[0] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style], 0);
|
||||
vecNextPosition[1] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style], 1);
|
||||
vecNextPosition[2] = GetArrayCell(gA_Frames[style], gI_ReplayTick[style], 2);
|
||||
|
||||
|
||||
fDistance = GetVectorDistance(vecPosition, vecNextPosition);
|
||||
|
||||
|
||||
MakeVectorFromPoints(vecCurrentPosition, vecNextPosition, vecVelocity);
|
||||
|
||||
|
||||
ScaleVector(vecVelocity, gF_Tickrate);
|
||||
}
|
||||
|
||||
|
||||
if(fDistance >= 25.0)
|
||||
{
|
||||
TeleportEntity(client, vecCurrentPosition, vecAngles, vecVelocity);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
TeleportEntity(client, NULL_VECTOR, vecAngles, vecVelocity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
if(gB_Record[client] && !Shavit_InsideZone(client, Zone_Start))
|
||||
{
|
||||
gI_PlayerFrames[client]++;
|
||||
gA_PlayerFrames[client].Resize(gI_PlayerFrames[client]);
|
||||
|
||||
|
||||
SetArrayCell(gA_PlayerFrames[client], gI_PlayerFrames[client] - 1, vecPosition[0], 0);
|
||||
SetArrayCell(gA_PlayerFrames[client], gI_PlayerFrames[client] - 1, vecPosition[1], 1);
|
||||
SetArrayCell(gA_PlayerFrames[client], gI_PlayerFrames[client] - 1, vecPosition[2], 2);
|
||||
|
||||
|
||||
SetArrayCell(gA_PlayerFrames[client], gI_PlayerFrames[client] - 1, angles[0], 3);
|
||||
SetArrayCell(gA_PlayerFrames[client], gI_PlayerFrames[client] - 1, angles[1], 4);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
@ -558,13 +558,13 @@ public Action ResetReplay(Handle Timer, any data)
|
||||
// https://forums.alliedmods.net/showthread.php?p=2307350
|
||||
/**
|
||||
* Copy a substring from source to destination
|
||||
*
|
||||
*
|
||||
* @param source String to copy from
|
||||
* @param start position to start at, 0 numbered. Negative means to start that many characters from the end.
|
||||
* @param len number of characters to copy. Negative means to not copy that many characters from the end.
|
||||
* @param destination String to copy to
|
||||
* @param maxlen Length of destination string. Must be 1 or greater.
|
||||
*
|
||||
*
|
||||
* @return True on success, false if number of characters copied would be negative.
|
||||
* NOTE: There is no mechanism to get the remaining characters of a string.
|
||||
* Instead, use strcopy with source[start] for that.
|
||||
@ -575,38 +575,38 @@ stock bool SubString(const char[] source, int start, int len, char[] destination
|
||||
{
|
||||
ThrowError("Destination size must be 1 or greater, but was %d", maxlen);
|
||||
}
|
||||
|
||||
|
||||
if(len == 0)
|
||||
{
|
||||
destination[0] = '\0';
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if(start < 0)
|
||||
{
|
||||
start = strlen(source) + start;
|
||||
|
||||
|
||||
if(start < 0)
|
||||
{
|
||||
start = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(len < 0)
|
||||
{
|
||||
len = strlen(source) + len - start;
|
||||
|
||||
|
||||
if(len < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int realLength = len + 1 < maxlen? len + 1:maxlen;
|
||||
|
||||
|
||||
strcopy(destination, realLength, source[start]);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -614,11 +614,11 @@ stock bool SubString(const char[] source, int start, int len, char[] destination
|
||||
* Remove the path from the map name
|
||||
* This was intended to remove workshop paths.
|
||||
* Used internally by MapEqual and FindMapStringInArray.
|
||||
*
|
||||
*
|
||||
* @param map Map name
|
||||
* @param destination String to copy map name to
|
||||
* @param maxlen Length of destination string
|
||||
*
|
||||
*
|
||||
* @return True if path was removed, false if map and destination are the same
|
||||
*/
|
||||
stock bool RemoveMapPath(const char[] map, char[] destination, int maxlen)
|
||||
@ -627,13 +627,13 @@ stock bool RemoveMapPath(const char[] map, char[] destination, int maxlen)
|
||||
{
|
||||
ThrowError("Bad map name: %s", map);
|
||||
}
|
||||
|
||||
|
||||
int pos = FindCharInString(map, '/', true);
|
||||
|
||||
|
||||
if(pos == -1)
|
||||
{
|
||||
pos = FindCharInString(map, '\\', true);
|
||||
|
||||
|
||||
if(pos == -1)
|
||||
{
|
||||
strcopy(destination, maxlen, map);
|
||||
@ -642,9 +642,9 @@ stock bool RemoveMapPath(const char[] map, char[] destination, int maxlen)
|
||||
}
|
||||
|
||||
int len = strlen(map) - 1 - pos;
|
||||
|
||||
|
||||
SubString(map, pos + 1, len, destination, maxlen);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -670,7 +670,7 @@ stock bool File_Copy(const char[] source, const char[] destination)
|
||||
if(file_destination == null)
|
||||
{
|
||||
delete file_source;
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -680,7 +680,7 @@ stock bool File_Copy(const char[] source, const char[] destination)
|
||||
while(!IsEndOfFile(file_source))
|
||||
{
|
||||
cache = ReadFile(file_source, buffer, 32, 1);
|
||||
|
||||
|
||||
WriteFile(file_destination, buffer, cache, 1);
|
||||
}
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
* 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
|
||||
@ -28,7 +28,7 @@
|
||||
// database handle
|
||||
Database gH_SQL = null;
|
||||
|
||||
public Plugin myinfo =
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] Player Stats",
|
||||
author = "shavit",
|
||||
@ -43,7 +43,7 @@ public void OnAllPluginsLoaded()
|
||||
{
|
||||
SetFailState("shavit-wr is required for the plugin to work.");
|
||||
}
|
||||
|
||||
|
||||
// database shit
|
||||
Shavit_GetDB(gH_SQL);
|
||||
}
|
||||
@ -52,13 +52,13 @@ public void OnPluginStart()
|
||||
{
|
||||
RegConsoleCmd("sm_profile", Command_Profile, "Show the player's profile. Usage: sm_profile [target]");
|
||||
RegConsoleCmd("sm_stats", Command_Profile, "Show the player's profile. Usage: sm_profile [target]");
|
||||
|
||||
|
||||
RegConsoleCmd("sm_mapsdone", Command_Mapsdone, "Show maps that the player have done already. Usage: sm_mapsdone [target]");
|
||||
RegConsoleCmd("sm_mapsleft", Command_Mapsleft, "Show maps that the player doesn't have them cleared yet. Usage: sm_mapsleft [target]");
|
||||
|
||||
|
||||
RegConsoleCmd("sm_mapsdonesw", Command_MapsdoneSW, "[SW] Show maps done. Usage: sm_mapsdonesw [target]");
|
||||
RegConsoleCmd("sm_mapsleftsw", Command_MapsleftSW, "[SW] Show maps that the player doesn't have them cleared yet. Usage: sm_mapsleftsw [target]");
|
||||
|
||||
|
||||
LoadTranslations("common.phrases");
|
||||
}
|
||||
|
||||
@ -68,24 +68,24 @@ public Action Command_Mapsdone(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
int target = client;
|
||||
|
||||
|
||||
if(args > 0)
|
||||
{
|
||||
char sArgs[64];
|
||||
GetCmdArgString(sArgs, 64);
|
||||
|
||||
|
||||
target = FindTarget(client, sArgs, true, false);
|
||||
|
||||
|
||||
if(target == -1)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ShowMaps(client, target, "mapsdone");
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -95,24 +95,24 @@ public Action Command_Mapsleft(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
int target = client;
|
||||
|
||||
|
||||
if(args > 0)
|
||||
{
|
||||
char sArgs[64];
|
||||
GetCmdArgString(sArgs, 64);
|
||||
|
||||
|
||||
target = FindTarget(client, sArgs, true, false);
|
||||
|
||||
|
||||
if(target == -1)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ShowMaps(client, target, "mapsleft");
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -122,24 +122,24 @@ public Action Command_MapsdoneSW(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
int target = client;
|
||||
|
||||
|
||||
if(args > 0)
|
||||
{
|
||||
char sArgs[64];
|
||||
GetCmdArgString(sArgs, 64);
|
||||
|
||||
|
||||
target = FindTarget(client, sArgs, true, false);
|
||||
|
||||
|
||||
if(target == -1)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ShowMaps(client, target, "mapsdonesw");
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -149,24 +149,24 @@ public Action Command_MapsleftSW(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
int target = client;
|
||||
|
||||
|
||||
if(args > 0)
|
||||
{
|
||||
char sArgs[64];
|
||||
GetCmdArgString(sArgs, 64);
|
||||
|
||||
|
||||
target = FindTarget(client, sArgs, true, false);
|
||||
|
||||
|
||||
if(target == -1)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ShowMaps(client, target, "mapsleftsw");
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -176,42 +176,42 @@ public Action Command_Profile(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
int target = client;
|
||||
|
||||
|
||||
if(args > 0)
|
||||
{
|
||||
char sArgs[64];
|
||||
GetCmdArgString(sArgs, 64);
|
||||
|
||||
|
||||
target = FindTarget(client, sArgs, true, false);
|
||||
|
||||
|
||||
if(target == -1)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char sAuthID[32];
|
||||
GetClientAuthId(target, AuthId_Steam3, sAuthID, 32);
|
||||
|
||||
|
||||
Menu menu = CreateMenu(MenuHandler_Profile);
|
||||
menu.SetTitle("%N's profile.\nSteamID3: %s", target, sAuthID);
|
||||
|
||||
|
||||
menu.AddItem("mapsdone", "Maps done (Forwards)");
|
||||
menu.AddItem("mapsleft", "Maps left (Forwards)");
|
||||
menu.AddItem("mapsdonesw", "Maps done (Sideways)");
|
||||
menu.AddItem("mapsleftsw", "Maps left (Sideways)");
|
||||
|
||||
|
||||
char sTarget[8];
|
||||
IntToString(target, sTarget, 8);
|
||||
|
||||
|
||||
AddMenuItem(menu, "id", sTarget, ITEMDRAW_IGNORE);
|
||||
|
||||
|
||||
SetMenuExitButton(menu, true);
|
||||
|
||||
|
||||
DisplayMenu(menu, client, 20);
|
||||
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -220,27 +220,27 @@ public int MenuHandler_Profile(Menu menu, MenuAction action, int param1, int par
|
||||
if(action == MenuAction_Select)
|
||||
{
|
||||
char info[16];
|
||||
|
||||
|
||||
int target;
|
||||
|
||||
|
||||
for(int i = 0; i < menu.ItemCount; i++)
|
||||
{
|
||||
char data[8];
|
||||
menu.GetItem(i, info, 16, _, data, 8);
|
||||
|
||||
|
||||
if(StrEqual(info, "id"))
|
||||
{
|
||||
target = StringToInt(data);
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
menu.GetItem(param2, info, 16);
|
||||
|
||||
|
||||
ShowMaps(param1, target, info);
|
||||
}
|
||||
|
||||
|
||||
else if(action == MenuAction_End)
|
||||
{
|
||||
CloseHandle(menu);
|
||||
@ -252,25 +252,25 @@ public void ShowMaps(int client, int target, const char[] category)
|
||||
{
|
||||
char sAuth[32];
|
||||
GetClientAuthId(target, AuthId_Steam3, sAuth, 32);
|
||||
|
||||
|
||||
char sQuery[256];
|
||||
|
||||
|
||||
if(StrContains(category, "done") != -1)
|
||||
{
|
||||
FormatEx(sQuery, 256, "SELECT map, time, jumps FROM playertimes WHERE auth = '%s' AND style = %d ORDER BY map;", sAuth, StrEqual(category, "mapsdone")? 0:1);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sQuery, 256, "SELECT DISTINCT m.map FROM mapzones m LEFT JOIN playertimes r ON r.map = m.map AND r.auth = '%s' AND r.style = %d WHERE r.map IS NULL ORDER BY m.map;", sAuth, StrEqual(category, "mapsleft")? 0:1);
|
||||
// PrintToConsole(client, sQuery);
|
||||
}
|
||||
|
||||
|
||||
DataPack datapack = CreateDataPack();
|
||||
datapack.WriteCell(GetClientSerial(client));
|
||||
datapack.WriteCell(GetClientSerial(target));
|
||||
datapack.WriteString(category);
|
||||
|
||||
|
||||
SQL_TQuery(gH_SQL, ShowMapsCallback, sQuery, datapack, DBPrio_High);
|
||||
}
|
||||
|
||||
@ -279,97 +279,97 @@ public void ShowMapsCallback(Handle owner, Handle hndl, const char[] error, any
|
||||
if(hndl == null)
|
||||
{
|
||||
CloseHandle(data);
|
||||
|
||||
|
||||
LogError("Timer (ShowMaps SELECT) SQL query failed. Reason: %s", error);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ResetPack(data);
|
||||
|
||||
|
||||
int clientserial = ReadPackCell(data);
|
||||
int targetserial = ReadPackCell(data);
|
||||
|
||||
|
||||
char sCategory[16];
|
||||
ReadPackString(data, sCategory, 16);
|
||||
|
||||
|
||||
CloseHandle(data);
|
||||
|
||||
|
||||
int client = GetClientFromSerial(clientserial);
|
||||
|
||||
if(!IsValidClient(client))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int target = GetClientFromSerial(targetserial);
|
||||
|
||||
if(!IsValidClient(client))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int rows = SQL_GetRowCount(hndl);
|
||||
|
||||
|
||||
char sTitle[64];
|
||||
|
||||
|
||||
if(StrEqual(sCategory, "mapsdone"))
|
||||
{
|
||||
FormatEx(sTitle, 32, "Maps done for %N: (%d)", target, rows);
|
||||
}
|
||||
|
||||
|
||||
else if(StrEqual(sCategory, "mapsleft"))
|
||||
{
|
||||
FormatEx(sTitle, 32, "Maps left for %N: (%d)", target, rows);
|
||||
}
|
||||
|
||||
|
||||
else if(StrEqual(sCategory, "mapsdonesw"))
|
||||
{
|
||||
FormatEx(sTitle, 32, "[SW] Maps done for %N: (%d)", target, rows);
|
||||
}
|
||||
|
||||
|
||||
else if(StrEqual(sCategory, "mapsleftsw"))
|
||||
{
|
||||
FormatEx(sTitle, 32, "[SW] Maps left for %N: (%d)", target, rows);
|
||||
}
|
||||
|
||||
|
||||
Menu menu = CreateMenu(MenuHandler_ShowMaps);
|
||||
menu.SetTitle(sTitle);
|
||||
|
||||
|
||||
while(SQL_FetchRow(hndl))
|
||||
{
|
||||
char sMap[128];
|
||||
SQL_FetchString(hndl, 0, sMap, 128);
|
||||
|
||||
|
||||
char sDisplay[192];
|
||||
|
||||
|
||||
if(StrContains(sCategory, "done") != -1)
|
||||
{
|
||||
float time = SQL_FetchFloat(hndl, 1);
|
||||
int jumps = SQL_FetchInt(hndl, 2);
|
||||
|
||||
|
||||
char sTime[32];
|
||||
FormatSeconds(time, sTime, 32);
|
||||
|
||||
|
||||
FormatEx(sDisplay, 192, "%s - %s (%d jumps)", sMap, sTime, jumps);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sDisplay, 192, "%s", sMap);
|
||||
}
|
||||
|
||||
|
||||
// adding map as info, may be used in the future
|
||||
menu.AddItem(sMap, sDisplay);
|
||||
}
|
||||
|
||||
|
||||
if(!GetMenuItemCount(menu))
|
||||
{
|
||||
AddMenuItem(menu, "nope", "No results.");
|
||||
}
|
||||
|
||||
|
||||
menu.ExitButton = true;
|
||||
|
||||
|
||||
menu.Display(client, 60);
|
||||
}
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
* 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
|
||||
@ -43,7 +43,7 @@ ConVar gCV_MinimumTimes = null;
|
||||
ConVar gCV_PlayerAmount = null;
|
||||
ConVar gCV_Style = null;
|
||||
|
||||
public Plugin myinfo =
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] Dynamic Timelimits",
|
||||
author = "shavit",
|
||||
@ -58,7 +58,7 @@ public void OnAllPluginsLoaded()
|
||||
{
|
||||
SetFailState("shavit-wr is required for the plugin to work.");
|
||||
}
|
||||
|
||||
|
||||
// database shit
|
||||
Shavit_GetDB(gH_SQL);
|
||||
}
|
||||
@ -66,17 +66,17 @@ public void OnAllPluginsLoaded()
|
||||
public void OnPluginStart()
|
||||
{
|
||||
gCV_TimeLimit = FindConVar("mp_timelimit");
|
||||
|
||||
|
||||
gCV_RoundTime = FindConVar("mp_roundtime");
|
||||
gCV_RoundTime.SetBounds(ConVarBound_Upper, false);
|
||||
|
||||
|
||||
gCV_RestartGame = FindConVar("mp_restartgame");
|
||||
|
||||
|
||||
gCV_DefaultLimit = CreateConVar("shavit_timelimit_default", "60.0", "Default timelimit to use in case there isn't an average.", FCVAR_PLUGIN, true, 10.0);
|
||||
gCV_MinimumTimes = CreateConVar("shavit_timelimit_minimumtimes", "5", "Minimum amount of times required to calculate an average.", FCVAR_PLUGIN, true, 5.0);
|
||||
gCV_PlayerAmount = CreateConVar("shavit_timelimit_playertime", "25", "Limited amount of times to grab from the database to calculate an average.\nSet to 0 to have it \"unlimited\".", FCVAR_PLUGIN);
|
||||
gCV_Style = CreateConVar("shavit_timelimit_style", "1", "If set to 1, calculate an average only from times that the \"forwards\" style was used to set.", FCVAR_PLUGIN, true, 0.0, true, 1.0);
|
||||
|
||||
|
||||
AutoExecConfig();
|
||||
}
|
||||
|
||||
@ -86,14 +86,14 @@ public void OnMapStart()
|
||||
{
|
||||
char sMap[128];
|
||||
GetCurrentMap(sMap, 128);
|
||||
|
||||
|
||||
char sQuery[256];
|
||||
FormatEx(sQuery, 256, "SELECT time FROM playertimes WHERE map = '%s' %sLIMIT %d;", sMap, gCV_Style.BoolValue? "AND style = 0 ":"", gCV_PlayerAmount.IntValue);
|
||||
|
||||
|
||||
#if defined DEBUG
|
||||
PrintToServer(sQuery);
|
||||
#endif
|
||||
|
||||
|
||||
SQL_TQuery(gH_SQL, SQL_GetMapTimes, sQuery, 0, DBPrio_High);
|
||||
}
|
||||
}
|
||||
@ -106,80 +106,80 @@ public void SQL_GetMapTimes(Handle owner, Handle hndl, const char[] error, any d
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int iRows = SQL_GetRowCount(hndl);
|
||||
|
||||
if(iRows >= gCV_MinimumTimes.IntValue)
|
||||
{
|
||||
float fTotal = 0.0;
|
||||
|
||||
|
||||
while(SQL_FetchRow(hndl))
|
||||
{
|
||||
fTotal += SQL_FetchFloat(hndl, 0);
|
||||
|
||||
|
||||
#if defined DEBUG
|
||||
PrintToServer("total: %.02f", fTotal);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
float fAverage = (fTotal / 60 / iRows);
|
||||
|
||||
|
||||
#if defined DEBUG
|
||||
PrintToServer("fAverage 1: %.02f", fAverage);
|
||||
#endif
|
||||
|
||||
|
||||
if(fAverage <= 1)
|
||||
{
|
||||
fAverage *= 10;
|
||||
}
|
||||
|
||||
|
||||
else if(fAverage <= 2)
|
||||
{
|
||||
fAverage *= 9;
|
||||
}
|
||||
|
||||
|
||||
else if(fAverage <= 4)
|
||||
{
|
||||
fAverage *= 8;
|
||||
}
|
||||
|
||||
|
||||
else if(fAverage <= 8)
|
||||
{
|
||||
fAverage *= 7;
|
||||
}
|
||||
|
||||
|
||||
else if(fAverage <= 10)
|
||||
{
|
||||
fAverage *= 6;
|
||||
}
|
||||
|
||||
|
||||
#if defined DEBUG
|
||||
PrintToServer("fAverage 2: %.02f", fAverage);
|
||||
#endif
|
||||
|
||||
|
||||
fAverage += 5; // I give extra 5 minutes, so players can actually retry the map until they get a good time.
|
||||
|
||||
|
||||
#if defined DEBUG
|
||||
PrintToServer("fAverage 3: %.02f", fAverage);
|
||||
#endif
|
||||
|
||||
|
||||
if(fAverage < 20)
|
||||
{
|
||||
fAverage = 20.0;
|
||||
}
|
||||
|
||||
|
||||
else if(fAverage > 120)
|
||||
{
|
||||
fAverage = 120.0;
|
||||
}
|
||||
|
||||
|
||||
#if defined DEBUG
|
||||
PrintToServer("fAverage 4: %.02f", fAverage);
|
||||
#endif
|
||||
|
||||
|
||||
SetLimit(RoundToNearest(fAverage));
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
SetLimit(RoundToNearest(gCV_DefaultLimit.FloatValue));
|
||||
@ -190,6 +190,6 @@ public void SetLimit(int time)
|
||||
{
|
||||
gCV_TimeLimit.SetInt(time);
|
||||
gCV_RoundTime.SetInt(time);
|
||||
|
||||
|
||||
gCV_RestartGame.IntValue = 1;
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
* 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
|
||||
@ -51,7 +51,7 @@ float gF_PlayerRecord[MAXPLAYERS+1][MAX_STYLES];
|
||||
// admin menu
|
||||
Handle gH_AdminMenu = null;
|
||||
|
||||
public Plugin myinfo =
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[shavit] World Records",
|
||||
author = "shavit",
|
||||
@ -68,7 +68,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
|
||||
|
||||
// get pb
|
||||
CreateNative("Shavit_GetPlayerPB", Native_GetPlayerPB);
|
||||
|
||||
|
||||
MarkNativeAsOptional("Shavit_GetWRTime");
|
||||
MarkNativeAsOptional("Shavit_GetWRName");
|
||||
MarkNativeAsOptional("Shavit_GetPlayerPB");
|
||||
@ -117,7 +117,7 @@ public void OnAdminMenuReady(Handle topmenu)
|
||||
if(LibraryExists("adminmenu") && ((gH_AdminMenu = GetAdminTopMenu()) != null))
|
||||
{
|
||||
TopMenuObject tmoTimer = FindTopMenuCategory(gH_AdminMenu, "Timer Commands");
|
||||
|
||||
|
||||
if(tmoTimer != INVALID_TOPMENUOBJECT)
|
||||
{
|
||||
AddToTopMenu(gH_AdminMenu, "sm_deleteall", TopMenuObject_Item, AdminMenu_DeleteAll, tmoTimer, "sm_deleteall", ADMFLAG_RCON);
|
||||
@ -361,7 +361,7 @@ public Action Command_DeleteAll(int client, int args)
|
||||
}
|
||||
|
||||
AddMenuItem(menu, "yes", "YES!!! DELETE ALL THE RECORDS!!! THIS ACTION CANNOT BE REVERTED!!!");
|
||||
|
||||
|
||||
for(int i = 1; i <= GetRandomInt(1, 3); i++)
|
||||
{
|
||||
AddMenuItem(menu, "-1", "NO!");
|
||||
@ -387,7 +387,7 @@ public int MenuHandler_DeleteAll(Handle menu, MenuAction action, int param1, int
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
char sQuery[256];
|
||||
FormatEx(sQuery, 256, "DELETE FROM playertimes WHERE map = '%s';", gS_Map);
|
||||
|
||||
@ -502,7 +502,7 @@ public int OpenDelete_Handler(Handle menu, MenuAction action, int param1, int pa
|
||||
{
|
||||
char info[16];
|
||||
GetMenuItem(menu, param2, info, 16);
|
||||
|
||||
|
||||
if(StringToInt(info) == -1)
|
||||
{
|
||||
return;
|
||||
@ -517,7 +517,7 @@ public int OpenDelete_Handler(Handle menu, MenuAction action, int param1, int pa
|
||||
}
|
||||
|
||||
AddMenuItem(hMenu, info, "YES!!! DELETE THE RECORD!!!");
|
||||
|
||||
|
||||
for(int i = 1; i <= GetRandomInt(1, 3); i++)
|
||||
{
|
||||
AddMenuItem(hMenu, "-1", "NO!");
|
||||
@ -547,7 +547,7 @@ public int DeleteConfirm_Handler(Handle menu, MenuAction action, int param1, int
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
char sQuery[256];
|
||||
FormatEx(sQuery, 256, "DELETE FROM playertimes WHERE id = '%s';", info);
|
||||
|
||||
@ -568,7 +568,7 @@ public void DeleteConfirm_Callback(Handle owner, Handle hndl, const char[] error
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
UpdateWRCache();
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
@ -594,7 +594,7 @@ public void DeleteAll_Callback(Handle owner, Handle hndl, const char[] error, an
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
UpdateWRCache();
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
@ -618,19 +618,19 @@ public Action Command_WR(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
char sMap[128];
|
||||
|
||||
|
||||
if(!args)
|
||||
{
|
||||
strcopy(sMap, 128, gS_Map);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
GetCmdArgString(sMap, 128);
|
||||
}
|
||||
|
||||
|
||||
StartWRMenu(client, sMap, view_as<int>(Style_Forwards));
|
||||
|
||||
return Plugin_Handled;
|
||||
@ -642,19 +642,19 @@ public Action Command_WRSW(int client, int args)
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
char sMap[128];
|
||||
|
||||
|
||||
if(!args)
|
||||
{
|
||||
strcopy(sMap, 128, gS_Map);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
GetCmdArgString(sMap, 128);
|
||||
}
|
||||
|
||||
|
||||
StartWRMenu(client, sMap, view_as<int>(Style_Sideways));
|
||||
|
||||
return Plugin_Handled;
|
||||
@ -663,30 +663,30 @@ public Action Command_WRSW(int client, int args)
|
||||
public void StartWRMenu(int client, const char[] map, int style)
|
||||
{
|
||||
gBS_LastWR[client] = view_as<BhopStyle>(style);
|
||||
|
||||
|
||||
DataPack dp = CreateDataPack();
|
||||
dp.WriteCell(GetClientSerial(client));
|
||||
dp.WriteString(map);
|
||||
|
||||
|
||||
char sQuery[512];
|
||||
FormatEx(sQuery, 512, "SELECT p.id, u.name, p.time, p.jumps, p.auth, (SELECT COUNT(*) FROM playertimes WHERE map = '%s' AND style = %d) AS records FROM playertimes p JOIN users u ON p.auth = u.auth WHERE map = '%s' AND style = %d ORDER BY time ASC LIMIT 50;", map, style, map, style);
|
||||
|
||||
|
||||
SQL_TQuery(gH_SQL, SQL_WR_Callback, sQuery, dp, DBPrio_High);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void SQL_WR_Callback(Handle owner, Handle hndl, const char[] error, any data)
|
||||
{
|
||||
ResetPack(data);
|
||||
|
||||
|
||||
int serial = ReadPackCell(data);
|
||||
|
||||
|
||||
char sMap[128];
|
||||
ReadPackString(data, sMap, 128);
|
||||
|
||||
|
||||
CloseHandle(data);
|
||||
|
||||
|
||||
if(hndl == null)
|
||||
{
|
||||
LogError("Timer (WR SELECT) SQL query failed. Reason: %s", error);
|
||||
@ -700,7 +700,7 @@ public void SQL_WR_Callback(Handle owner, Handle hndl, const char[] error, any d
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
char sAuth[32];
|
||||
GetClientAuthId(client, AuthId_Steam3, sAuth, 32);
|
||||
|
||||
@ -708,13 +708,13 @@ public void SQL_WR_Callback(Handle owner, Handle hndl, const char[] error, any d
|
||||
|
||||
int iCount = 0;
|
||||
int iMyRank = 0;
|
||||
|
||||
|
||||
int iRecords = 0;
|
||||
|
||||
while(SQL_FetchRow(hndl))
|
||||
{
|
||||
iCount++;
|
||||
|
||||
|
||||
// 0 - record id, for statistic purposes.
|
||||
int id = SQL_FetchInt(hndl, 0);
|
||||
char sID[8];
|
||||
@ -731,21 +731,21 @@ public void SQL_WR_Callback(Handle owner, Handle hndl, const char[] error, any d
|
||||
|
||||
// 3 - jumps
|
||||
int iJumps = SQL_FetchInt(hndl, 3);
|
||||
|
||||
|
||||
// add item to menu
|
||||
char sDisplay[128];
|
||||
FormatEx(sDisplay, 128, "#%d - %s - %s (%d Jumps)", iCount, sName, sTime, iJumps);
|
||||
AddMenuItem(menu, sID, sDisplay);
|
||||
|
||||
|
||||
// check if record exists in the map's top X
|
||||
char sQueryAuth[32];
|
||||
SQL_FetchString(hndl, 4, sQueryAuth, 32);
|
||||
|
||||
|
||||
if(StrEqual(sQueryAuth, sAuth))
|
||||
{
|
||||
iMyRank = iCount;
|
||||
}
|
||||
|
||||
|
||||
// fetch amount of records
|
||||
if(iRecords == 0)
|
||||
{
|
||||
@ -756,25 +756,25 @@ public void SQL_WR_Callback(Handle owner, Handle hndl, const char[] error, any d
|
||||
if(!GetMenuItemCount(menu))
|
||||
{
|
||||
SetMenuTitle(menu, "Records for %s", sMap);
|
||||
|
||||
|
||||
AddMenuItem(menu, "-1", "No records found.");
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
// [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]] == 0.0)
|
||||
{
|
||||
FormatEx(sRanks, 32, "(%d record%s)", iRecords, iRecords == 1? "":"s");
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
FormatEx(sRanks, 32, "(#%d/%d)", iMyRank, iRecords);
|
||||
}
|
||||
|
||||
|
||||
SetMenuTitle(menu, "Records for %s:\n%s", sMap, sRanks);
|
||||
}
|
||||
|
||||
@ -931,14 +931,14 @@ public void SQL_CreateTable_Callback(Handle owner, Handle hndl, const char[] err
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(gB_Late)
|
||||
{
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
OnClientPutInServer(i);
|
||||
}
|
||||
|
||||
|
||||
gB_Late = false;
|
||||
}
|
||||
}
|
||||
@ -950,14 +950,14 @@ public void SQL_CreateTable_Callback(Handle owner, Handle hndl, const char[] err
|
||||
{
|
||||
return thing * -1;
|
||||
}
|
||||
|
||||
|
||||
return thing;
|
||||
}*/
|
||||
|
||||
public void Shavit_OnFinish(int client, BhopStyle style, float time, int jumps)
|
||||
{
|
||||
BhopStyle bsStyle = view_as<BhopStyle>(style);
|
||||
|
||||
|
||||
char sTime[32];
|
||||
FormatSeconds(time, sTime, 32);
|
||||
|
||||
@ -973,7 +973,7 @@ public void Shavit_OnFinish(int client, BhopStyle style, float time, int jumps)
|
||||
|
||||
UpdateWRCache();
|
||||
}
|
||||
|
||||
|
||||
// 0 - no query
|
||||
// 1 - insert
|
||||
// 2 - update
|
||||
@ -988,40 +988,40 @@ public void Shavit_OnFinish(int client, BhopStyle style, float time, int jumps)
|
||||
{
|
||||
overwrite = 2;
|
||||
}
|
||||
|
||||
|
||||
float fDifference = (gF_PlayerRecord[client][style] - time) * -1.0;
|
||||
|
||||
|
||||
char sDifference[16];
|
||||
FormatSeconds(fDifference, sDifference, 16, true);
|
||||
|
||||
|
||||
if(overwrite > 0)
|
||||
{
|
||||
char sAuthID[32];
|
||||
GetClientAuthId(client, AuthId_Steam3, sAuthID, 32);
|
||||
|
||||
|
||||
char sQuery[512];
|
||||
|
||||
if(overwrite == 1) // insert
|
||||
{
|
||||
PrintToChatAll("%s \x03%N\x01 finished (%s) on \x07%s\x01 with %d jumps.", PREFIX, client, bsStyle == Style_Forwards? "Forwards":"Sideways", sTime, jumps);
|
||||
|
||||
|
||||
// prevent duplicate records in case there's a long enough lag for the mysql server between two map finishes
|
||||
// TODO: work on a solution that can function the same while not causing lost records
|
||||
// TODO: work on a solution that can function the same while not causing lost records
|
||||
if(gH_SQL == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
FormatEx(sQuery, 512, "INSERT INTO playertimes (auth, map, time, jumps, date, style) VALUES ('%s', '%s', %.03f, %d, CURRENT_TIMESTAMP(), '%d');", sAuthID, gS_Map, time, jumps, style);
|
||||
}
|
||||
|
||||
else // update
|
||||
{
|
||||
PrintToChatAll("%s \x03%N\x01 finished (%s) on \x07%s\x01 with %d jumps. \x0C(%s)", PREFIX, client, bsStyle == Style_Forwards? "Forwards":"Sideways", sTime, jumps, sDifference);
|
||||
|
||||
|
||||
FormatEx(sQuery, 512, "UPDATE playertimes SET time = '%.03f', jumps = '%d', date = CURRENT_TIMESTAMP() WHERE map = '%s' AND auth = '%s' AND style = '%d';", time, jumps, gS_Map, sAuthID, style);
|
||||
}
|
||||
|
||||
|
||||
SQL_TQuery(gH_SQL, SQL_OnFinish_Callback, sQuery, GetClientSerial(client), DBPrio_High);
|
||||
}
|
||||
|
||||
@ -1031,7 +1031,7 @@ public void Shavit_OnFinish(int client, BhopStyle style, float time, int jumps)
|
||||
{
|
||||
PrintToChat(client, "%s You have finished (%s) on \x07%s\x01 with %d jumps. \x08(+%s)", PREFIX, bsStyle == Style_Forwards? "Forwards":"Sideways", sTime, jumps, sDifference);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
PrintToChat(client, "%s You have finished (%s) on \x07%s\x01 with %d jumps.", PREFIX, bsStyle == Style_Forwards? "Forwards":"Sideways", sTime, jumps);
|
||||
|
||||
@ -40,7 +40,7 @@ char gS_ZoneNames[MAX_ZONES][] =
|
||||
"End Zone", // stops timer
|
||||
"Glitch Zone (Respawn Player)", // respawns the player
|
||||
"Glitch Zone (Stop Timer)", // stops the player's timer
|
||||
"Slay Player", // slays (kills) players which come to this zone
|
||||
"Slay Player", // slays (kills) players which come to this zone
|
||||
"Freestyle Zone" // ignores style physics when at this zone. e.g. WASD when SWing
|
||||
};
|
||||
|
||||
@ -112,7 +112,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
|
||||
// zone natives
|
||||
CreateNative("Shavit_ZoneExists", Native_ZoneExists);
|
||||
CreateNative("Shavit_InsideZone", Native_InsideZone);
|
||||
|
||||
|
||||
MarkNativeAsOptional("Shavit_ZoneExists");
|
||||
// MarkNativeAsOptional("Shavit_InsideZone"); // called in shavit-core
|
||||
|
||||
@ -741,7 +741,7 @@ public Action OnPlayerRunCmd(int client, int &buttons)
|
||||
if(gI_MapStep[client] == 1)
|
||||
{
|
||||
gV_Point1[client] = vOrigin;
|
||||
|
||||
|
||||
// not gonna use gCV_Interval.FloatValue here as we need percision when setting up zones
|
||||
CreateTimer(0.1, Timer_Draw, client, TIMER_REPEAT);
|
||||
|
||||
@ -1385,7 +1385,7 @@ public Action Timer_Draw(Handle Timer, any data)
|
||||
vPoints[7] = vOrigin;
|
||||
|
||||
CreateZonePoints(vPoints, gF_RotateAngle[data], gV_Fix1[data], gV_Fix2[data], 1337, false);
|
||||
|
||||
|
||||
DrawZone(0, vPoints, gI_BeamSprite, 0, gI_Colors[gMZ_Type[data]], 0.1);
|
||||
|
||||
return Plugin_Continue;
|
||||
@ -1704,7 +1704,7 @@ public void SQL_CreateTable_Callback(Handle owner, Handle hndl, const char[] err
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
SQL_TQuery(gH_SQL, SQL_CheckRotation_Callback, "SELECT rot_ang FROM mapzones");
|
||||
}
|
||||
|
||||
@ -1732,23 +1732,23 @@ public void Shavit_OnRestart(int client)
|
||||
{
|
||||
float vCenter[3];
|
||||
MakeVectorFromPoints(gV_MapZones[0][0], gV_MapZones[0][1], vCenter);
|
||||
|
||||
|
||||
// calculate center
|
||||
vCenter[0] /= 2;
|
||||
vCenter[1] /= 2;
|
||||
// i could also use ScaleVector() by 0.5f I guess? dunno which is more resource intensive, so i'll do it manually.
|
||||
|
||||
|
||||
// old method of calculating Z axis
|
||||
// vCenter[2] /= 2;
|
||||
// vCenter[2] -= 20;
|
||||
|
||||
|
||||
// spawn at the same Z axis the start zone is at
|
||||
// this may break some spawns, where there's a displacement instead of a flat surface at the spawn point, for example; bhop_monster_jam ~ recompile with this commented and the old method uncommented if it's an issue!
|
||||
// vCenter[2] = gV_MapZones[0][0] + 84.0;
|
||||
// ^ didn't work
|
||||
|
||||
AddVectors(gV_MapZones[0][0], vCenter, vCenter);
|
||||
|
||||
|
||||
vCenter[2] = gV_MapZones[0][0][2];
|
||||
|
||||
TeleportEntity(client, vCenter, NULL_VECTOR, view_as<float>({0.0, 0.0, 0.0}));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user