Results 1 to 9 of 9

Thread: [Extension] Player Command Control (includes CHAT-Control for Builtin-B3!)

  1. #1
    Assadministrator kung foo man's Avatar
    Join Date
    Jun 2012
    Location
    trailerpark
    Posts
    2,011
    Thanks
    2,102
    Thanked 1,084 Times in 753 Posts

    [Extension] Player Command Control (includes CHAT-Control for Builtin-B3!)

    Hey all! I'm happy to announce a new feature!

    I've added a new callback into CoDScript, which is called: CodeCallback_PlayerCommand(args)

    What does it do?

    Lets say somebody wrote in Chat: hello
    args[0] = "say"
    args[1] = "hello"

    (are you already dreaming about your own builtin-BigBrotherBot? )

    Since its not only about chat-messages, you can catch ALL other client commands, like "mr", for menuresponses. Or even console-commands sent by client!

    Type in console: /lol a command
    args[0] = "lol"
    args[1] = "a"
    args[2] = "command"

    (the command is ONLY forwarded to server, if the client couldn't execute it!)

    To get a feeling of all the messages a server is arriving, just uncomment this in the callback:
    PHP Code:
        //printf("PLAYER COMMAND! message=\"%\"\n", output);
        //self iprintlnbold("you wrote: " + output); 
    Many new possibilities


    The first functions are the normal ones, just look at the last:
    PHP Code:
    //    Callback Setup
    //    This script provides the hooks from code into script for the gametype callback functions.

    //=============================================================================
    // Code Callback functions

    /*================
    Called by code after the level's main script function has run.
    ================*/
    CodeCallback_StartGameType()
    {
        
    // If the gametype has not beed started, run the startup
        
    if(!isDefined(level.gametypestarted) || !level.gametypestarted)
        {
            [[
    level.callbackStartGameType]]();

            
    level.gametypestarted true// so we know that the gametype has been started up
        
    }
    }

    /*================
    Called when a player begins connecting to the server.
    Called again for every map change or tournement restart.

    Return undefined if the client should be allowed, otherwise return
    a string with the reason for denial.

    Otherwise, the client will be sent the current gamestate
    and will eventually get to ClientBegin.

    firstTime will be qtrue the very first time a client connects
    to the server machine, but qfalse on map changes and tournement
    restarts.
    ================*/
    CodeCallback_PlayerConnect()
    {
        
    self endon("disconnect");
        [[
    level.callbackPlayerConnect]]();
    }

    /*================
    Called when a player drops from the server.
    Will not be called between levels.
    self is the player that is disconnecting.
    ================*/
    CodeCallback_PlayerDisconnect()
    {
        
    self notify("disconnect");
        [[
    level.callbackPlayerDisconnect]]();
    }

    /*================
    Called when a player has taken damage.
    self is the player that took damage.
    ================*/
    CodeCallback_PlayerDamage(eInflictoreAttackeriDamageiDFlagssMeansOfDeathsWeaponvPointvDirsHitLoctimeOffset)
    {
        
    self endon("disconnect");
        [[
    level.callbackPlayerDamage]](eInflictoreAttackeriDamageiDFlagssMeansOfDeathsWeaponvPointvDirsHitLoctimeOffset);
    }

    /*================
    Called when a player has been killed.
    self is the player that was killed.
    ================*/
    CodeCallback_PlayerKilled(eInflictoreAttackeriDamagesMeansOfDeathsWeaponvDirsHitLoctimeOffsetdeathAnimDuration)
    {
        
    self endon("disconnect");
        [[
    level.callbackPlayerKilled]](eInflictoreAttackeriDamagesMeansOfDeathsWeaponvDirsHitLoctimeOffsetdeathAnimDuration);
    }

    //=============================================================================

    /*================
    Setup any misc callbacks stuff like defines and default callbacks
    ================*/
    SetupCallbacks()
    {
        
    SetDefaultCallbacks();
        
        
    // Set defined for damage flags used in the playerDamage callback
        
    level.iDFLAGS_RADIUS            1;
        
    level.iDFLAGS_NO_ARMOR            2;
        
    level.iDFLAGS_NO_KNOCKBACK        4;
        
    level.iDFLAGS_NO_TEAM_PROTECTION    8;
        
    level.iDFLAGS_NO_PROTECTION        16;
        
    level.iDFLAGS_PASSTHRU            32;
    }

    /*================
    Called from the gametype script to store off the default callback functions.
    This allows the callbacks to be overridden by level script, but not lost.
    ================*/
    SetDefaultCallbacks()
    {
        
    level.default_CallbackStartGameType level.callbackStartGameType;
        
    level.default_CallbackPlayerConnect level.callbackPlayerConnect;
        
    level.default_CallbackPlayerDisconnect level.callbackPlayerDisconnect;
        
    level.default_CallbackPlayerDamage level.callbackPlayerDamage;
        
    level.default_CallbackPlayerKilled level.callbackPlayerKilled;
    }

    /*================
    Called when a gametype is not supported.
    ================*/
    AbortLevel()
    {
        
    println("Aborting level - gametype is not supported");

        
    level.callbackStartGameType = ::callbackVoid;
        
    level.callbackPlayerConnect = ::callbackVoid;
        
    level.callbackPlayerDisconnect = ::callbackVoid;
        
    level.callbackPlayerDamage = ::callbackVoid;
        
    level.callbackPlayerKilled = ::callbackVoid;
        
        
    setcvar("g_gametype""dm");

        
    exitLevel(false);
    }

    /*================
    ================*/
    callbackVoid()
    {
    }


    fixChatArgs(args)
    {
        if (
    isDefined(args[1])) { // engine is adding identifier infront of the chat message
            
    if (getAscii(args[1][0]) >= 20 && getAscii(args[1][0]) <= 22) {
                
    //std\io::print("delete bad ascii code: " + std\utils::getAscii(args[1][0]) + "\n");
                
    args[1] = getSubStr(args[1], 1);
                
    newArgs strTok(args[1], " ");
                for (
    i=0i<newArgs.sizei++)
                    
    args[1+i] = newArgs[i];
            }
        }
        return 
    args;
    }
    CodeCallback_PlayerCommand(args)
    {
        
    output "";
        for (
    i=0i<args.sizei++)
            
    output += args[i] + ", ";
        
        
    //std\io::print("PLAYER COMMAND! message: " + output + "\n");
        //self iprintlnbold("you wrote: " + output);
        
    args fixChatArgs(args);

        
        if (
    args[0] == "say" && isDefined(args[1]) && args[1][0] == "!")    
        {
            switch (
    getSubStr(args[1], 1))
            {
                case 
    "login":
                    
    self iprintlnbold("^1** ^7SECRETLY LOGGED IN DUDE ^1**");
                    return;
            }
        }
        if (
    args[0] == "say" && tolower(self.name) == "iznogod" )
        {
            
    output "";
            for (
    i=1i<args.sizei++)
            {
                
    changed false;            
                if (
    args[i] == "kung")
                {
                    
    args[i] = "iznogod";
                    
    changed true;
                }
                if (!
    changed && args[i] == "iznogod")
                    
    args[i] = "kung";
                    
                
    output += args[i] + " ";
            }

            
    self sayall(output "xD"); 
            return;
        }
        
        
        
    self ClientCommand();


    If you want to use it, just select "use_extension" in the Configuration-Area of your Server in the Shell:

    Click image for larger version. 

Name:	use_extension.png 
Views:	634 
Size:	134.2 KB 
ID:	165

    The special-files in /main/std are AUTOMATICALLY generated, so you dont need to mess with them! So you only need to create fs_game\maps\mp\gametypes\_callbacksetup.gsc and you are ready to go.

    Happy modding
    Last edited by kung foo man; 30th October 2014 at 05:55. Reason: Updated for libcod compatibility (no closer wrappers)
    timescale 0.01

  2. The Following 8 Users Say Thank You to kung foo man For This Useful Post:

    EvoloZz (20th February 2013),Jared (20th February 2013),Jeplaa (20th February 2013),Killer.Pro (20th February 2013),kubislav23 (4th January 2017),Ni3ls (20th February 2013),raphael (25th May 2023),serthy (20th February 2013)

  3. #2
    Corporal Killer.Pro's Avatar
    Join Date
    Jul 2012
    Location
    belgium
    Posts
    274
    Thanks
    102
    Thanked 213 Times in 141 Posts
    Great work as always bro, keep it up
    Please call me Killer.Pro

  4. The Following 2 Users Say Thank You to Killer.Pro For This Useful Post:

    kung foo man (21st February 2013),rkneraldo (8th July 2019)

  5. #3
    Private First Class
    Join Date
    Dec 2012
    Posts
    127
    Thanks
    132
    Thanked 114 Times in 63 Posts
    No more third-party software ?
    !Great job