From e04243592dff569421b64d480b79557fe1e89d24 Mon Sep 17 00:00:00 2001 From: shavitush Date: Mon, 7 Mar 2016 16:14:21 +0200 Subject: [PATCH] Started using Atom - let it auto indent everything. --- .gitignore | 2 +- 1.2b_todo.md | 2 +- 1.3b_todo.md | 2 +- README.md | 8 +- gamedata/shavit.games.txt | 2 +- scripting/shavit-core.sp | 74 +++++----- scripting/shavit-hud.sp | 108 +++++++-------- scripting/shavit-misc.sp | 162 +++++++++++----------- scripting/shavit-replay.sp | 252 +++++++++++++++++----------------- scripting/shavit-stats.sp | 156 ++++++++++----------- scripting/shavit-timelimit.sp | 58 ++++---- scripting/shavit-wr.sp | 108 +++++++-------- scripting/shavit-zones.sp | 18 +-- 13 files changed, 476 insertions(+), 476 deletions(-) diff --git a/.gitignore b/.gitignore index a7508a67..d9ebbd64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ # SourcePawn *.smx *.dll -*.so \ No newline at end of file +*.so diff --git a/1.2b_todo.md b/1.2b_todo.md index f97137e0..b17bf218 100644 --- a/1.2b_todo.md +++ b/1.2b_todo.md @@ -21,4 +21,4 @@ - [x] + player slaying zone - [x] + cvar "shavit_zones_style" 0 - 3d (default) -1 - 2d \ No newline at end of file +1 - 2d diff --git a/1.3b_todo.md b/1.3b_todo.md index 93cfbf08..3d21e670 100644 --- a/1.3b_todo.md +++ b/1.3b_todo.md @@ -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 \ No newline at end of file +- [x] + Handle drawing of end/freestyle zones properly diff --git a/README.md b/README.md index 7e79603e..0ffd424c 100644 --- a/README.md +++ b/README.md @@ -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: \ No newline at end of file +~ [NEW PLUGIN] shavit-ranks: diff --git a/gamedata/shavit.games.txt b/gamedata/shavit.games.txt index 127ef278..c4cc6700 100644 --- a/gamedata/shavit.games.txt +++ b/gamedata/shavit.games.txt @@ -23,4 +23,4 @@ } } } -} \ No newline at end of file +} diff --git a/scripting/shavit-core.sp b/scripting/shavit-core.sp index 61d97f6a..df73af6f 100644 --- a/scripting/shavit-core.sp +++ b/scripting/shavit-core.sp @@ -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)) { diff --git a/scripting/shavit-hud.sp b/scripting/shavit-hud.sp index cac887d3..b393f7f8 100644 --- a/scripting/shavit-hud.sp +++ b/scripting/shavit-hud.sp @@ -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, "Start Zone", gS_Start[gI_StartCycle]); - + PrintHintText(client, sHintText); } - + else if(gB_ZoneHUD[client] && gSG_Type == Game_CSGO && Shavit_InsideZone(target, Zone_End)) { FormatEx(sHintText, 256, "End Zone", 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, ""); - + 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: %s", sHintText, sColor, sTime); } - + Format(sHintText, 256, "%s\nStyle: 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: %N", sHintText, target); - + Format(sHintText, 256, "%s", 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, ""); @@ -340,14 +340,14 @@ public void UpdateHUD(int client) Format(sHintText, 256, "%s\nSpeed: %.02f", sHintText, fSpeed_New); Format(sHintText, 256, "%s", 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); } } diff --git a/scripting/shavit-misc.sp b/scripting/shavit-misc.sp index 88ae8649..eae58d4f 100644 --- a/scripting/shavit-misc.sp +++ b/scripting/shavit-misc.sp @@ -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({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; } diff --git a/scripting/shavit-replay.sp b/scripting/shavit-replay.sp index abefb717..9552c07d 100644 --- a/scripting/shavit-replay.sp +++ b/scripting/shavit-replay.sp @@ -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(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(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(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(i))) { FormatEx(gS_BotName[i], MAX_NAME_LENGTH, "%s unloaded", i == view_as(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); } diff --git a/scripting/shavit-stats.sp b/scripting/shavit-stats.sp index 5132dff3..5ca3082b 100644 --- a/scripting/shavit-stats.sp +++ b/scripting/shavit-stats.sp @@ -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); } diff --git a/scripting/shavit-timelimit.sp b/scripting/shavit-timelimit.sp index 15dc0e54..82d2e7e2 100644 --- a/scripting/shavit-timelimit.sp +++ b/scripting/shavit-timelimit.sp @@ -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; } diff --git a/scripting/shavit-wr.sp b/scripting/shavit-wr.sp index a24ee39a..ee455b25 100644 --- a/scripting/shavit-wr.sp +++ b/scripting/shavit-wr.sp @@ -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(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(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(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(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); diff --git a/scripting/shavit-zones.sp b/scripting/shavit-zones.sp index b20c9d3d..a685fd3f 100644 --- a/scripting/shavit-zones.sp +++ b/scripting/shavit-zones.sp @@ -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({0.0, 0.0, 0.0}));