Skip to content
  • 0 Unread 0
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse

Plutonium

  1. Home
  2. BO1 Modding Releases & Resources
  3. [ZM] B01 High Round Lock

[ZM] B01 High Round Lock

Scheduled Pinned Locked Moved BO1 Modding Releases & Resources
1 Posts 1 Posters 907 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • CUKServersundefined Offline
    CUKServersundefined Offline
    CUKServers
    wrote on last edited by CUKServers
    #1

    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", "" );
    }
    
    
    1 Reply Last reply
    1

    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
    Reply
    • Reply as topic
    Log in to reply
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes


    • Login

    • Don't have an account? Register

    • Login or register to search.
    • First post
      Last post
    0
    • Unread 0
    • Recent
    • Tags
    • Popular
    • Users
    • Groups