[ZM] B01 High Round Lock
BO1 Modding Releases & Resources
1
Posts
1
Posters
645
Views
1
Watching
-
Updated Script that locks a server on a specified round (20), A password is generated to allow friends to join in progress. Password is then removed on game death or when .unlock is used
https://github.com/CoreyUK/T5-scripts/blob/main/Roundlock.gsc
#include common_scripts\utility; #include maps\_utility; main() { // Config level.min_lock_round = 20; // State level.locked = false; level.pin = ""; level.lock_initialized = false; // Ensure server starts unlocked setDvar( "password", "" ); setDvar( "g_password", "" ); // Threads level thread onPlayerConnect(); level thread roundMonitor(); // Level-scope chat listeners (T5 signature: text, player) level thread listenForChatCommands(); // "say" level thread listenForTeamChatCommands(); // "say_team" // Clear password at end of game level thread resetPasswordOnEnd(); } onPlayerConnect() { for ( ;; ) { level waittill( "connected", player ); if ( !isDefined( player ) ) continue; // ADS + 2 input toggle player thread monitorUnlockInput(); } } // Round transitions -> announce state (kill feed) roundMonitor() { level endon( "disconnect" ); for ( ;; ) { level waittill( "between_round_over" ); // First time we reach threshold -> auto-lock (silent action line) if ( isRoundLockActive() && !level.lock_initialized ) { level.lock_initialized = true; level.locked = true; level.pin = generatePin(); setDvar( "g_password", level.pin ); setDvar( "password", level.pin ); } if ( !level.lock_initialized ) continue; if ( level.locked ) { if ( !isDefined( level.pin ) || level.pin == "" ) level.pin = generatePin(); setDvar( "g_password", level.pin ); setDvar( "password", level.pin ); announceAll( getLockedMessage() ); } else { setDvar( "g_password", "" ); setDvar( "password", "" ); announceAll( getUnlockedMessage() ); } } } // ADS + 2 to toggle monitorUnlockInput() { self endon( "disconnect" ); for ( ;; ) { if ( self adsbuttonpressed() && self ActionSlotTwoButtonPressed() ) { setLocked( !level.locked, self ); wait( 0.4 ); // debounce } wait( 0.05 ); } } // Global chat (T5 signature: text, player) listenForChatCommands() { level endon( "disconnect" ); for ( ;; ) { level waittill( "say", text, player ); if ( !isDefined( text ) || !isDefined( player ) ) continue; // Exact matches if ( text == ".unlock" ) { setLocked( false, player ); } else if ( text == ".lock" ) { setLocked( true, player ); } } } // Team chat (T5 signature: text, player) listenForTeamChatCommands() { level endon( "disconnect" ); for ( ;; ) { level waittill( "say_team", text, player ); if ( !isDefined( text ) || !isDefined( player ) ) continue; if ( text == ".unlock" ) { setLocked( false, player ); } else if ( text == ".lock" ) { setLocked( true, player ); } } } // Set lock state and announce via kill feed. // actor: optional player who triggered the change. setLocked( shouldLock, actor ) { actorName = getActorName( actor ); // Block locking until the minimum round is reached if ( shouldLock && !isRoundLockActive() ) { if ( isDefined( actor ) ) actor iPrintLn( "^3Locking is disabled until round ^5" + level.min_lock_round ); return; } if ( shouldLock ) { level.lock_initialized = true; level.locked = true; level.pin = generatePin(); setDvar( "g_password", level.pin ); setDvar( "password", level.pin ); announceAll( actorName + " ^7locked the server. Password ^5" + level.pin ); } else { level.locked = false; setDvar( "g_password", "" ); setDvar( "password", "" ); announceAll( actorName + " ^7unlocked the server." ); } } // Helpers isRoundLockActive() { return isDefined( level.round_number ) && level.round_number >= level.min_lock_round; } getLockedMessage() { return "Server is now ^1LOCKED^7. Use password ^5" + level.pin + " ^7to rejoin. Unlock with ^5ADS + 2^7 or type ^5.unlock^7"; } getUnlockedMessage() { return "Server remains ^2unlocked^7 - to lock again do ^5.lock^7 (or press ^5ADS + 2^7)"; } // Kill feed broadcast announceAll( message ) { players = getPlayersSafe(); for ( i = 0; i < players.size; i++ ) players[i] iPrintLn( message ); } // Safe actor name getActorName( actor ) { if ( isDefined( actor ) && isDefined( actor.name ) ) return actor.name; return "Someone"; } // 4-digit PIN generatePin() { str = ""; for ( i = 0; i < 4; i++ ) str = str + randomInt( 10 ); return str; } // Safe players array getter getPlayersSafe() { if ( isDefined( level.players ) ) return level.players; return getEntArray( "player", "classname" ); } // Clear password on game end resetPasswordOnEnd() { level endon( "disconnect" ); level waittill( "end_game" ); setDvar( "g_password", "" ); setDvar( "password", "" ); }