Started using Atom - let it auto indent everything.

This commit is contained in:
shavitush 2016-03-07 16:14:21 +02:00
parent da1438f379
commit e04243592d
13 changed files with 476 additions and 476 deletions

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
# SourcePawn
*.smx
*.dll
*.so
*.so

View File

@ -21,4 +21,4 @@
- [x] + player slaying zone
- [x] + cvar "shavit_zones_style"
0 - 3d (default)
1 - 2d
1 - 2d

View File

@ -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

View File

@ -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:

View File

@ -23,4 +23,4 @@
}
}
}
}
}

View File

@ -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))
{

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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}));