Immolation
Member
- Reaction score
- 20
CMD
Because Berp is a lazy bummer.
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
Code:
/slap Uberplayer a+500kg+C/+/++manual
Code:
/slap Uberplayer 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