System Cmd

Status
Not open for further replies.

Immolation

Member
Reaction score
20
CMD
Because Berp is a lazy bummer.

This system was not made by me, but by Uberplayer, that is too lazy to submit his awesome stuff. Go thank him in the chat if you want.
That also means that you should +rep him, not ME!


JASS:
//! zinc

library cmd requires Table
{

    constant string  COMMAND_PREFIX      = "/";
    constant string  PARAMETER_SEPARATOR = " ";
    constant string  ARGUMENT_MERGER     = "+";
    constant string  ARGUMENT_IGNORE     = "/";
    
    //===========================================================================

    integer PrefixLength = StringLength(COMMAND_PREFIX);
    
    type cmdFunc extends function();
    
    public struct cmd[]
    {
    
        private static StringTable CommandTable;
        
        //===========================================================================
        
        private static string ro_args[];
        private static integer ro_argc;
        
        static method args(integer index) -> string
        {
            if ((index > cmd.ro_argc) || (index < 0)) { return null; } else { return cmd.ro_args[index]; }
        }
        
        static method operator argc() -> integer { return cmd.ro_argc; }
        
        //===========================================================================
    
        private static method parse() -> boolean
        {
            string s = GetEventPlayerChatString();
            string c;
            integer l = StringLength(s);
            integer i, j, k;
            string a;
            
            /* Resets argument count. */
            cmd.ro_argc = 0;

            /* Validates command. */
            if (SubString(s, 0, PrefixLength) != COMMAND_PREFIX) { return false; }
            for(i = PrefixLength; i < l && SubString(s, i, i + 1) != " "; i += 1) {}
            c = SubString(s, PrefixLength, i);
            if (!cmd.CommandTable.exists(c)) { return false; }
    
            /* Parses arguments. */
            i += 1;
            while (i < l)
            {
                for (j = i; ((SubString(s, j, j + 1) != PARAMETER_SEPARATOR) && (j < l)); j += 1 ) {}
                a = SubString(s, i, j);
                if ((a != "") && (a != null))
                {
                    for (k = 0; k < StringLength(a); k += 1)
                    {
                        if (SubString(a, k, k + 1) == ARGUMENT_MERGER)
                        {
                            if (SubString(a, k - 1, k) == ARGUMENT_IGNORE) 
                            {
                                a = SubString(a, 0, k - 1) + SubString(a, k, StringLength(a));
                                k -= 1;
                            }
                            else
                            {
                                a = SubString(a, 0, k) + " " + SubString(a, k + 1, StringLength(a));
                            }
                        }
                    }
                    cmd.ro_args[cmd.ro_argc] = a;
                    cmd.ro_argc = cmd.ro_argc + 1;
                }
                i = j + 1;
            }
        
            cmdFunc(cmd.CommandTable[c]).execute();
                
            return false;
        }
    
        private static method onInit()
        {
            integer i;
            for (i = 0; i < bj_MAX_PLAYERS; i += 1) { TriggerRegisterPlayerChatEvent(cmd.CommandTrigger, Player(i), COMMAND_PREFIX, false); }
            TriggerAddCondition(cmd.CommandTrigger, function cmd.parse);
            cmd.CommandTable = StringTable.create();
        }
        
        //===========================================================================
        
        static method register(string c, cmdFunc f) 
        {
            cmd.CommandTable[c] = integer(f);
        }
        
        static method unregister(string c)
        {
            cmd.CommandTable.flush(c);
        }
        
        //===========================================================================
    
        private static trigger CommandTrigger = CreateTrigger();
    
        static method enable() { EnableTrigger(cmd.CommandTrigger); }
        static method disable() { DisableTrigger(cmd.CommandTrigger); }
    
    }

}

//! endzinc


Examples:

JASS:
//! zinc

library Example requires cmd
{

    function Command_slap()
    {
        if (cmd.argc == 1)
        {
            BJDebugMsg(GetPlayerName(GetTriggerPlayer()) + " slaps " + cmd.args(0) + " around a bit with a large trout.");
        }
        else if (cmd.argc == 2)
        {
            BJDebugMsg(GetPlayerName(GetTriggerPlayer()) + " slaps " + cmd.args(0) + " with " + cmd.args(1) + ".");
        }
    }

    function onInit()
    {
        cmd.register("slap", Command_slap);
    }

}

//! endzinc


With the above code:

Code:
/slap Uberplayer
Prints "Immolation slaps Uberplayer around a bit with a large trout."

Code:
/slap Uberplayer a+500kg+C/+/++manual
Prints "Immolation slaps Uberplayer with a 500kg C++ manual."

Code:
/slap Uberplayer a+pig
Prints "Immolation slaps Uberplayer with a pig."

Basically, what this does is registering a command with cmd.register(whichCommand, function)
Upon writing /whichCommand, the function set with that command runs.
Have fun :rolleyes:
 

Joker(Div)

Always Here..
Reaction score
86
Submission Rules said:
You can only submit resources you made yourself. The only exception to this are resources which somebody else made and you modified in which case you must clearly state the original author, what you changed in the original work and a link to the original, if available. If the modifications you made are too minor however, the resource will not be approved.
And this lacks a documentation.
 

Romek

Super Moderator
Reaction score
963
He can submit it himself when he's ready.
It's not like he's dead or anything.

You can always make the thread for him; as long as he submits it.

Closed.
 
Status
Not open for further replies.
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top