[ZM] B01 High Round Lock
-
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", "" ); }
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login