diff --git a/addons/sourcemod/configs/shavit-styles.cfg b/addons/sourcemod/configs/shavit-styles.cfg index 11d2c188..894a82c6 100644 --- a/addons/sourcemod/configs/shavit-styles.cfg +++ b/addons/sourcemod/configs/shavit-styles.cfg @@ -35,6 +35,7 @@ // Physics "airaccelerate" "1000.0" // sv_airaccelerate value for the style. "runspeed" "260.00" // Running speed. Requires DHooks, shavit-misc and shavit_misc_staticprestrafe set to 1. + "maxprestrafe" "0.0" // The max prestrafe that still allows your timer to start/restart. You generally do *not* need or want to change this unless for surf things (combined with style-setting "prespeed_type" "6" or cvar "shavit_misc_prespeed 6"). Default is 0.0 (disabled). "gravity" "1.0" // Gravity setting, 1.0 for default. Standard for low gravity styles is 0.6. "speed" "1.0" // Speed multiplier, 1.0 for default. Standard for slowmo styles is 0.5. This a multiplier for m_flLaggedMovementValue. "timescale" "1.0" // Timing will scale with this setting. This is a multiplier for m_flLaggedMovementValue but also affects the timer increase speed. diff --git a/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp b/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp index b9e64ef8..0d1d9e95 100644 --- a/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp +++ b/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp @@ -53,6 +53,7 @@ enum Migration_DeprecateExactTimeInt, Migration_AddPlayertimesAuthFK, Migration_FixSQLiteMapzonesROWID, + Migration_AddUsersFirstLogin, MIGRATIONS_END }; @@ -87,6 +88,7 @@ char gS_MigrationNames[][] = { "DeprecateExactTimeInt", "AddPlayertimesAuthFK", "FixSQLiteMapzonesROWID", + "AddUsersFirstLogin", }; static Database gH_SQL; @@ -133,13 +135,13 @@ public void SQL_CreateTables(Database hSQL, const char[] prefix, int driver) if (driver == Driver_mysql) { FormatEx(sQuery, sizeof(sQuery), - "CREATE TABLE IF NOT EXISTS `%susers` (`auth` INT NOT NULL, `name` VARCHAR(32) COLLATE 'utf8mb4_general_ci', `ip` INT, `lastlogin` INT NOT NULL DEFAULT -1, `points` FLOAT NOT NULL DEFAULT 0, `playtime` FLOAT NOT NULL DEFAULT 0, PRIMARY KEY (`auth`), INDEX `points` (`points`), INDEX `lastlogin` (`lastlogin`)) ENGINE=INNODB;", + "CREATE TABLE IF NOT EXISTS `%susers` (`auth` INT NOT NULL, `name` VARCHAR(32) COLLATE 'utf8mb4_general_ci', `ip` INT, `lastlogin` INT NOT NULL DEFAULT -1, `firstlogin` INT NOT NULL DEFAULT -1, `points` FLOAT NOT NULL DEFAULT 0, `playtime` FLOAT NOT NULL DEFAULT 0, PRIMARY KEY (`auth`), INDEX `points` (`points`), INDEX `lastlogin` (`lastlogin`)) ENGINE=INNODB;", gS_SQLPrefix); } else { FormatEx(sQuery, sizeof(sQuery), - "CREATE TABLE IF NOT EXISTS `%susers` (`auth` INT NOT NULL PRIMARY KEY, `name` VARCHAR(32), `ip` INT, `lastlogin` INTEGER NOT NULL DEFAULT -1, `points` FLOAT NOT NULL DEFAULT 0, `playtime` FLOAT NOT NULL DEFAULT 0);", + "CREATE TABLE IF NOT EXISTS `%susers` (`auth` INT NOT NULL PRIMARY KEY, `name` VARCHAR(32), `ip` INT, `lastlogin` INTEGER NOT NULL DEFAULT -1, `firstlogin` INTEGER NOT NULL DEFAULT -1, `points` FLOAT NOT NULL DEFAULT 0, `playtime` FLOAT NOT NULL DEFAULT 0);", gS_SQLPrefix); } @@ -369,6 +371,7 @@ void ApplyMigration(int migration) case Migration_DeprecateExactTimeInt: ApplyMigration_DeprecateExactTimeInt(); case Migration_AddPlayertimesAuthFK: ApplyMigration_AddPlayertimesAuthFK(); case Migration_FixSQLiteMapzonesROWID: ApplyMigration_FixSQLiteMapzonesROWID(); + case Migration_AddUsersFirstLogin: ApplyMigration_AddUsersFirstLogin(); } } @@ -686,6 +689,20 @@ public void Trans_FixSQLiteMapzonesROWID_Error(Database db, any data, int numQue LogError("Timer error! SQLiteMapzonesROWID migration transaction failed. Reason: %s", error); } +void ApplyMigration_AddUsersFirstLogin() +{ + char sQuery[256]; + FormatEx(sQuery, sizeof(sQuery), "ALTER TABLE %susers ADD `firstlogin` INT NOT NULL DEFAULT -1 %s;", gS_SQLPrefix, (gI_Driver == Driver_mysql) ? "AFTER `lastlogin`" : ""); + QueryLog(gH_SQL, ApplyMigration_AddUsersFirstLogin2222222_Callback, sQuery, Migration_AddUsersFirstLogin, DBPrio_High); +} + +public void ApplyMigration_AddUsersFirstLogin2222222_Callback(Database db, DBResultSet results, const char[] error, any data) +{ + char sQuery[256]; + FormatEx(sQuery, sizeof(sQuery), "UPDATE %susers SET firstlogin = lastlogin WHERE lastlogin > 0;", gS_SQLPrefix); + QueryLog(gH_SQL, SQL_TableMigrationSingleQuery_Callback, sQuery, Migration_AddUsersFirstLogin, DBPrio_High); +} + public void SQL_TableMigrationSingleQuery_Callback(Database db, DBResultSet results, const char[] error, any data) { InsertMigration(data); diff --git a/addons/sourcemod/scripting/include/shavit/style-settings.sp b/addons/sourcemod/scripting/include/shavit/style-settings.sp index 4b3efb86..dce10a38 100644 --- a/addons/sourcemod/scripting/include/shavit/style-settings.sp +++ b/addons/sourcemod/scripting/include/shavit/style-settings.sp @@ -164,6 +164,7 @@ public SMCResult OnStyleEnterSection(SMCParser smc, const char[] name, bool opt_ SetStyleSettingFloat(gI_CurrentParserIndex, "airaccelerate", 1000.0); SetStyleSettingFloat(gI_CurrentParserIndex, "runspeed", 260.00); + SetStyleSettingFloat(gI_CurrentParserIndex, "maxprestrafe", 0.0); SetStyleSettingFloat(gI_CurrentParserIndex, "gravity", 1.0); SetStyleSettingFloat(gI_CurrentParserIndex, "speed", 1.0); SetStyleSettingInt (gI_CurrentParserIndex, "halftime", 0); diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index 0b6ccfaf..7ed07134 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -182,6 +182,7 @@ char gS_Verification[MAXPLAYERS+1][8]; bool gB_CookiesRetrieved[MAXPLAYERS+1]; float gF_ZoneAiraccelerate[MAXPLAYERS+1]; float gF_ZoneSpeedLimit[MAXPLAYERS+1]; +float gF_ZoneStartSpeedLimit[MAXPLAYERS+1]; int gI_LastPrintedSteamID[MAXPLAYERS+1]; // kz support @@ -1648,7 +1649,10 @@ void ChangeClientStyle(int client, int style, bool manual) char sStyle[4]; IntToString(style, sStyle, 4); - SetClientCookie(client, gH_StyleCookie, sStyle); + if(gB_StyleCookies) + { + SetClientCookie(client, gH_StyleCookie, sStyle); + } } public void Player_Jump(Event event, const char[] name, bool dontBroadcast) @@ -2551,7 +2555,23 @@ bool CanStartTimer(int client, int track, bool skipGroundCheck) if (curVel <= 50.0) return true; - float prestrafe = StyleMaxPrestrafe(style); + float cfgMax = GetStyleSettingFloat(style, "maxprestrafe"); + float zoneMax = gF_ZoneStartSpeedLimit[client]; + float prestrafe; + + if (zoneMax > 0.0) + { + prestrafe = zoneMax; + } + else if (cfgMax > 0.0) + { + prestrafe = cfgMax; + } + else + { + prestrafe = StyleMaxPrestrafe(style); + } + if (curVel > prestrafe) return false; @@ -2830,14 +2850,14 @@ public void OnClientAuthorized(int client, const char[] auth) if (gI_Driver == Driver_mysql) { FormatEx(sQuery, 512, - "INSERT INTO %susers (auth, name, ip, lastlogin) VALUES (%d, '%s', %d, %d) ON DUPLICATE KEY UPDATE name = '%s', ip = %d, lastlogin = %d;", - gS_MySQLPrefix, iSteamID, sEscapedName, iIPAddress, iTime, sEscapedName, iIPAddress, iTime); + "INSERT INTO %susers (auth, name, ip, lastlogin, firstlogin) VALUES (%d, '%s', %d, %d, %d) ON DUPLICATE KEY UPDATE name = '%s', ip = %d, lastlogin = %d;", + gS_MySQLPrefix, iSteamID, sEscapedName, iIPAddress, iTime, iTime, sEscapedName, iIPAddress, iTime); } else // postgresql & sqlite { FormatEx(sQuery, 512, - "INSERT INTO %susers (auth, name, ip, lastlogin) VALUES (%d, '%s', %d, %d) ON CONFLICT(auth) DO UPDATE SET name = '%s', ip = %d, lastlogin = %d;", - gS_MySQLPrefix, iSteamID, sEscapedName, iIPAddress, iTime, sEscapedName, iIPAddress, iTime); + "INSERT INTO %susers (auth, name, ip, lastlogin, firstlogin) VALUES (%d, '%s', %d, %d, %d) ON CONFLICT(auth) DO UPDATE SET name = '%s', ip = %d, lastlogin = %d;", + gS_MySQLPrefix, iSteamID, sEscapedName, iIPAddress, iTime, iTime, sEscapedName, iIPAddress, iTime); } QueryLog(gH_SQL, SQL_InsertUser_Callback, sQuery, GetClientSerial(client)); @@ -2949,7 +2969,11 @@ void SQL_DBConnect() public void Shavit_OnEnterZone(int client, int type, int track, int id, int entity, int data) { - if (type == Zone_Airaccelerate && track == gA_Timers[client].iTimerTrack) + if (type == Zone_Start && track == gA_Timers[client].iTimerTrack) + { + gF_ZoneStartSpeedLimit[client] = float(data); + } + else if (type == Zone_Airaccelerate && track == gA_Timers[client].iTimerTrack) { gF_ZoneAiraccelerate[client] = float(data); } @@ -2971,7 +2995,7 @@ public void Shavit_OnLeaveZone(int client, int type, int track, int id, int enti // Probably so very niche that it doesn't matter. if (track != gA_Timers[client].iTimerTrack) return; - if (type != Zone_Airaccelerate && type != Zone_CustomSpeedLimit && type != Zone_Autobhop) + if (type != Zone_Airaccelerate && type != Zone_CustomSpeedLimit && type != Zone_Autobhop && type != Zone_Start) return; UpdateStyleSettings(client); diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index df284257..e37e8954 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -74,6 +74,8 @@ Function gH_AfterWarningMenu[MAXPLAYERS+1]; int gI_LastWeaponTick[MAXPLAYERS+1]; int gI_LastNoclipTick[MAXPLAYERS+1]; int gI_LastStopInfo[MAXPLAYERS+1]; +int gI_LastGroundLandTick[MAXPLAYERS+1]; +float gF_ZoneStartSpeedLimit[MAXPLAYERS+1]; // cookies Handle gH_HideCookie = null; @@ -112,6 +114,7 @@ Convar gCV_StopTimerWarning = null; Convar gCV_WRMessages = null; Convar gCV_BhopSounds = null; Convar gCV_RestrictNoclip = null; +Convar gCV_UnNoclipOnRestart = null; Convar gCV_SpecScoreboardOrder = null; Convar gCV_BadSetLocalAnglesFix = null; ConVar gCV_PauseMovement = null; @@ -265,7 +268,7 @@ public void OnPluginStart() // cvars and stuff gCV_GodMode = new Convar("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.\n4 - Prevent fall/world/entity damage (all except damage from other players).", 0, true, 0.0, true, 4.0); - gCV_PreSpeed = new Convar("shavit_misc_prespeed", "2", "Stop prespeeding in the start zone?\n0 - Disabled, fully allow prespeeding.\n1 - Limit relatively to prestrafelimit.\n2 - Block bunnyhopping in startzone.\n3 - Limit to prestrafelimit and block bunnyhopping.\n4 - Limit to prestrafelimit but allow prespeeding. Combine with shavit_core_nozaxisspeed 1 for SourceCode timer's behavior.\n5 - Limit horizontal speed to prestrafe but allow prespeeding.", 0, true, 0.0, true, 5.0); + gCV_PreSpeed = new Convar("shavit_misc_prespeed", "2", "Stop prespeeding in the start zone?\n0 - Disabled, fully allow prespeeding.\n1 - Limit relatively to prestrafelimit.\n2 - Block bunnyhopping in startzone.\n3 - Limit to prestrafelimit and block bunnyhopping.\n4 - Limit to prestrafelimit but allow prespeeding. Combine with shavit_core_nozaxisspeed 1 for SourceCode timer's behavior.\n5 - Limit horizontal speed to prestrafe but allow prespeeding. \n6 - Limit horizontal speed to prestrafe and block bunnyhopping.", 0, true, 0.0, true, 5.0); gCV_HideTeamChanges = new Convar("shavit_misc_hideteamchanges", "1", "Hide team changes in chat?\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0); gCV_RespawnOnTeam = new Convar("shavit_misc_respawnonteam", "1", "Respawn whenever a player joins a team?\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0); gCV_RespawnOnRestart = new Convar("shavit_misc_respawnonrestart", "1", "Respawn a dead player if they use the timer restart command?\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0); @@ -295,6 +298,7 @@ public void OnPluginStart() gCV_WRMessages = new Convar("shavit_misc_wrmessages", "3", "How many \"NEW