System Chat Command System CCS

Prozix

New Member
Reaction score
7
Hello there, here I am again.

Since I have been unable to find a CCS that simplifies adding commands to your project I figured I had to write it myself. Here I am presenting to you: The ChatCommandSystem written by Prozix (requires vJass)

JASS:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~ Chat Command System ~~ By Prozix ~~ Version 1.03 ~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//    =What is Chat Command System=
//         - Chat Command System allows you to easily add chat commands to your map
//
//    =Pros=
//         - Easy
//         - Time saver
//         - Built in command listing
//
//    =Cons=
//         - Less efficient than doing everything manually
//         - Only one parameter handled within the system, for more parameters use the string return type
//         - If you use waits withing a command that has a return type, create a local variable and set it to the argument first
//           newly called commands could overwrite the variables!
//
//    =Functions=
//    function CCS_SetPrefixPlayer takes string s , player p returns nothing        Allows you to change the prefix for one player
//
//    function CCS_SetPrefixAll takes string s returns nothing                      Changes the prefix for all players
//
//    function CCS_GetPrefix takes nothing returns string                           Returns the prefix as a string
//
//    function CCS_SetIntegerLength takes integer i returns nothing                 Up to how many characters will be read and converted to an integer after a command
//
//    function CCS_SetRealLength takes integer i returns nothing                    Up to how many characters will be read and converted to a real after a command
//
//    function CCS_SetStringLength takes integer i returns nothing                  Up to how many characters will be read and used as a string after a command
//
//    function CCS_DisableChatCommand takes string command returns nothing          Disables a command, the function you have assigned doesn't run anymore
//
//    function CCS_EnableChatCommand takes string command returns nothing           Enables a command
//
//    function CCS_ListEnabledCommands takes player p returns nothing               Prints the enabled commands for a player
//
//    function CCS_ListAllCommands takes player p returns nothing                   Prints all commands for a player
//
//    function CCS_GetChattingPlayer takes nothing returns player                   Returns the player that entered the chat message
//
//    function CCS_GetBool takes nothing returns boolean                            If your command is a boolean command, this returns true or false
//
//    function CCS_GetInt takes nothing returns integer                             If your command is an integer command, this returns the integer after the command
//
//    function CCS_GetReal takes nothing returns real                               If your command is a real command, this returns the real after the command
//
//    function CCS_GetStr takes nothing returns string                              If your command is a string command, this returns the string after the command
//
//    function CCS_RegisterChatCommand takes string command, boolean enabled, integer commandType, code commandFunction returns nothing
//                                                                                  This function is used to register a chat command
//    =Command types=
//         - CCS_TYPE_NONE      a chat command without parameters
//         - CCS_TYPE_BOOL      a chat command with an boolean value as a parameter
//         - CCS_TYPE_INT       a chat command with an integer as a parameter
//         - CCS_TYPE_REAL      a chat command with a real as a parameter
//         - CCS_TYPE_STR       a chat command with a string as a parameter
//
//    =Customizing=
//         - If you wan't boolean equivalents of "true" other than "yes", "on" or "1" you can change them in the globals section
//
//    =How to import=
//         - Create a trigger named CCS
//         - Convert it to custom text and replace the whole trigger text with this.
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

library ChatCommandSystem initializer Init
    globals
        private constant integer CCS_MAXCOMMANDS = 2000
        private constant integer CCS_MAX_PLAYERS = 12
        //command prefix
        private constant string CCS_DEFAULT_PREFIX = "-"
        private string array CCS_CommandPrefix[CCS_MAX_PLAYERS]
        
        private player CCS_ChattingPlayer
        private boolean CCS_Bool
        private integer CCS_Int
        private real CCS_Real
        private string CCS_Str
        
        private integer CCS_Index = 0 //the index of the command struct
        
        //yes equivalents, no array because it are only 4 vars and i want to initialize them here
        constant string CCS_YES1 = "yes"
        constant string CCS_YES2 = "true"
        constant string CCS_YES3 = "on"
        constant string CCS_YES4 = "1"
        //no equivalents
        constant string CCS_NO1 = "no"
        constant string CCS_NO2 = "false"
        constant string CCS_NO3 = "off"
        constant string CCS_NO4 = "0"
        
        //type enum
        constant integer CCS_TYPE_NONE = 0
        constant integer CCS_TYPE_BOOL = 1
        constant integer CCS_TYPE_INT = 2
        constant integer CCS_TYPE_REAL = 3
        constant integer CCS_TYPE_STR = 4
        
        //type length
        private integer CCS_TYPE_NONE_LENGTH = 0
        private integer CCS_TYPE_BOOL_LENGTH = 0 //initialized at init function
        private integer CCS_TYPE_INT_LENGTH = 10 //up to how much characters
        private integer CCS_TYPE_REAL_LENGTH = 10 //we will search for the type starting from Length(prefix+command)
        private integer CCS_TYPE_STR_LENGTH = 20
    endglobals
    
    private struct ChatCommand extends array
        string command
        boolean enabled
        integer commandType
        trigger action
    endstruct
    
    //===SYSTEM FUNCTIONS================================================================
    //system variables
    function CCS_SetPrefixPlayer takes string s , player p returns nothing
        set CCS_CommandPrefix[GetPlayerId(p)] = s
    endfunction
    function CCS_SetPrefixAll takes string s returns nothing
        local integer i = 0
        loop
            set CCS_CommandPrefix<i> = s
            set i = i + 1
            exitwhen i==CCS_MAX_PLAYERS
        endloop
    endfunction
    function CCS_GetPrefix takes player p returns string
        return CCS_CommandPrefix[GetPlayerId(p)]
    endfunction
    function CCS_SetIntegerLength takes integer i returns nothing
        set  CCS_TYPE_INT_LENGTH = i
    endfunction
    function CCS_SetRealLength takes integer i returns nothing
        set  CCS_TYPE_REAL_LENGTH = i
    endfunction
    function CCS_SetStringLength takes integer i returns nothing
        set CCS_TYPE_STR_LENGTH = i
    endfunction
    
    //enable/disable (very inefficient but you don&#039;t need to keep track of command ID&#039;s this way)
    function CCS_DisableChatCommand takes string command returns nothing
        local integer i = 0
        loop
            if ChatCommand<i>.command == command and ChatCommand<i>.enabled then
                set ChatCommand<i>.enabled = false
            endif
            set i = i+1
            exitwhen i==CCS_Index
        endloop
    endfunction
    function CCS_EnableChatCommand takes string command returns nothing
        local integer i = 0
        loop
            if ChatCommand<i>.command == command and not ChatCommand<i>.enabled then
                set ChatCommand<i>.enabled = true
            endif
            set i = i+1
            exitwhen i==CCS_Index
        endloop
    endfunction
    
    //print commands for a player
    function CCS_ListEnabledCommands takes player p returns nothing
        local integer i = 0
        local string s
        loop
            if ChatCommand<i>.enabled then
                set s = &quot;(&quot;+I2S(i)+&quot;): |cffff0000&quot;+CCS_CommandPrefix[GetPlayerId(p)]+ChatCommand<i>.command+&quot;|r&quot;
                if ChatCommand<i>.commandType == CCS_TYPE_BOOL then
                    set s = s + &quot;|cff5555ff type: boolean|r&quot;
                elseif ChatCommand<i>.commandType == CCS_TYPE_INT then
                    set s = s + &quot;|cff5555ff  type: integer|r&quot;
                elseif ChatCommand<i>.commandType == CCS_TYPE_REAL then
                    set s = s + &quot;|cff5555ff  type: real|r&quot;
                elseif ChatCommand<i>.commandType == CCS_TYPE_STR then
                    set s = s + &quot;|cff5555ff  type: string|r&quot;
                endif
                call DisplayTimedTextToPlayer(p, 0, 0, 30.0, s)
            endif
            set i = i+1
            exitwhen i==CCS_Index
        endloop
    endfunction
    function CCS_ListAllCommands takes player p returns nothing
        local integer i = 0
        local string s
        loop
            set s = &quot;(&quot;+I2S(i)+&quot;): |cffff0000&quot;+CCS_CommandPrefix[GetPlayerId(p)]+ChatCommand<i>.command+&quot;|r&quot;
            if ChatCommand<i>.commandType == CCS_TYPE_BOOL then
                set s = s + &quot;|cff5555ff type: boolean|r&quot;
            elseif ChatCommand<i>.commandType == CCS_TYPE_INT then
                set s = s + &quot;|cff5555ff  type: integer|r&quot;
            elseif ChatCommand<i>.commandType == CCS_TYPE_REAL then
                set s = s + &quot;|cff5555ff  type: real|r&quot;
            elseif ChatCommand<i>.commandType == CCS_TYPE_STR then
                set s = s + &quot;|cff5555ff  type: string|r&quot;
            endif
            call DisplayTimedTextToPlayer(p, 0, 0, 30.0, s)
            set i = i+1
            exitwhen i==CCS_Index
        endloop
    endfunction
    
    //get functions for use in chat actions
    function CCS_GetChattingPlayer takes nothing returns player
        return CCS_ChattingPlayer
    endfunction
    function CCS_GetBool takes nothing returns boolean
        return CCS_Bool
    endfunction
    function CCS_GetInt takes nothing returns integer
        return CCS_Int
    endfunction
    function CCS_GetReal takes nothing returns real
        return CCS_Real
    endfunction
    function CCS_GetStr takes nothing returns string
        return CCS_Str
    endfunction
    
    function CCS_RegisterChatCommand takes string command, boolean enabled, integer commandType, code commandFunction returns nothing
        set ChatCommand[CCS_Index].command = command
        set ChatCommand[CCS_Index].enabled = enabled
        set ChatCommand[CCS_Index].commandType = commandType
        set ChatCommand[CCS_Index].action = CreateTrigger()
        call TriggerAddAction(ChatCommand[CCS_Index].action, commandFunction)
        set CCS_Index = CCS_Index+1
        if CCS_Index == CCS_MAXCOMMANDS then
            call BJDebugMsg(&quot;|cffff0000Chat Command System Warning: Too much commands registered, rendered the system unable to function properly|r&quot;)
            set CCS_Index = 0
        endif
        //call BJDebugMsg(&quot;Registered command(&quot;+I2S(CCS_Index)+&quot;): &quot;+CCS_CommandPrefix+ChatCommand[CCS_Index-1].command)
    endfunction
    
    //============================================================================================
    private function Actions takes nothing returns nothing
        local string EnteredChat = GetEventPlayerChatString()
        local string ChatSub = &quot;&quot;
        local integer SubLength = 0
        local integer i = 0
        local boolean execute
        local integer pId
        set CCS_ChattingPlayer = GetTriggerPlayer()
        set pId = GetPlayerId(CCS_ChattingPlayer)
        loop
            if ChatCommand<i>.enabled then
                set SubLength = StringLength(CCS_CommandPrefix[pId]+ChatCommand<i>.command)
                set ChatSub = SubString(EnteredChat, 0, SubLength)
                if ChatSub == CCS_CommandPrefix[pId]+ChatCommand<i>.command then
                    set execute = true
                    if ChatCommand<i>.commandType == CCS_TYPE_BOOL then
                        set ChatSub = SubString(EnteredChat, SubLength + 1, SubLength + CCS_TYPE_BOOL_LENGTH + 1) //+1 for the space
                        if ChatSub == CCS_YES1 or ChatSub == CCS_YES2 or ChatSub == CCS_YES3 or ChatSub == CCS_YES4 then //allow 1 extra space before the parameter
                            set CCS_Bool = true
                        elseif ChatSub == CCS_NO1 or ChatSub == CCS_NO2 or ChatSub == CCS_NO3 or ChatSub == CCS_NO4 then //allow 1 extra space before the parameter
                            set CCS_Bool = false
                        else
                            call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, 10, &quot;|cffff0000false parameters for &quot;+CCS_CommandPrefix[pId]+ChatCommand<i>.command+&quot;|r&quot;) //you can outcomment this
                            set execute = false
                        endif
                    elseif ChatCommand<i>.commandType == CCS_TYPE_INT then
                        set CCS_Int = S2I(SubString(EnteredChat, SubLength + 1, SubLength + CCS_TYPE_INT_LENGTH + 1))
                    elseif ChatCommand<i>.commandType == CCS_TYPE_REAL then
                        set CCS_Real = S2R(SubString(EnteredChat, SubLength + 1, SubLength + CCS_TYPE_REAL_LENGTH + 1))
                    elseif ChatCommand<i>.commandType == CCS_TYPE_STR then
                        set CCS_Str = SubString(EnteredChat, SubLength + 1, SubLength + CCS_TYPE_STR_LENGTH + 1)
                    endif
                    if execute then
                        call TriggerExecute(ChatCommand<i>.action)
                    endif
                endif
            endif
            set i = i + 1
            exitwhen i == CCS_Index
        endloop
    endfunction
    //============================================================================================
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer i = 0
        loop
            call TriggerRegisterPlayerChatEvent(t, Player(i), &quot;&quot;, false)
            set i = i+1
            exitwhen i==CCS_MAX_PLAYERS
        endloop
        
        call CCS_SetPrefixAll(CCS_DEFAULT_PREFIX)
        call TriggerAddAction(t, function Actions)
        
        set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_YES1)      
        if StringLength(CCS_YES2) &gt; CCS_TYPE_BOOL_LENGTH then //NEAT (H)
            set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_YES2)
        endif
        if StringLength(CCS_YES3) &gt; CCS_TYPE_BOOL_LENGTH then //NEAT (H)
            set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_YES3)
        endif
        if StringLength(CCS_YES4) &gt; CCS_TYPE_BOOL_LENGTH then //NEAT (H)
            set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_YES4)
        endif
        if StringLength(CCS_NO1) &gt; CCS_TYPE_BOOL_LENGTH then //NEAT (H)
            set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_NO1)
        endif
        if StringLength(CCS_NO2) &gt; CCS_TYPE_BOOL_LENGTH then //NEAT (H)
            set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_NO2)
        endif
        if StringLength(CCS_NO3) &gt; CCS_TYPE_BOOL_LENGTH then //NEAT (H)
            set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_NO3)
        endif
        if StringLength(CCS_NO4) &gt; CCS_TYPE_BOOL_LENGTH then //NEAT (H)
            set CCS_TYPE_BOOL_LENGTH = StringLength(CCS_NO4)
        endif //  /end_the_con&#039;s_of_non_array_arrays_^o^
    endfunction
endlibrary
</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>


And here is how to use it:

JASS:
scope AllPlayerChatCommands initializer Init
    //command 1
    private function HelpActions takes nothing returns nothing
        call DisplayTextToPlayer(CCS_GetChattingPlayer(), 0, 0, &quot;|cff00ff00commands: |r&quot;)
        call CCS_ListEnabledCommands(CCS_GetChattingPlayer())
        call DisplayTextToPlayer(CCS_GetChattingPlayer(), 0, 0, &quot;|cff00ff00----------|r&quot;)
    endfunction
    //command 2
    private function BoolActions takes nothing returns nothing
        if CCS_GetBool() then
            call BJDebugMsg(&quot;Yes, it&#039;s true&quot;)
        else
            call BJDebugMsg(&quot;No, it&#039;s not true&quot;)
        endif
    endfunction
    //command 3
    private function AddGold takes nothing returns nothing
        call AdjustPlayerStateBJ(CCS_GetInt(), CCS_GetChattingPlayer(), PLAYER_STATE_RESOURCE_GOLD)
    endfunction
    //command 4
    private function ShowReal takes nothing returns nothing
        call DisplayTimedTextToPlayer(CCS_GetChattingPlayer(), 0, 0, 30.0, &quot;You have entered: &quot;+R2S(CCS_GetReal()))
    endfunction
    //command 5
    private function Disabled takes nothing returns nothing
        call BJDebugMsg(&quot;This will not show <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite1" alt=":)" title="Smile    :)" loading="lazy" data-shortname=":)" />&quot;)
    endfunction
    //command 6
    private function TauntEnemies takes nothing returns nothing
        local integer i = 0
        local player p = CCS_GetChattingPlayer()
        loop
            if IsPlayerEnemy(p, Player(i)) then
                call DisplayTimedTextToPlayer(Player(i), 0, 0, 30.0, GetPlayerName(p)+&quot;: I&#039;m going to crush you MUAHAHA&quot;)
            endif
            set i = i+1
            exitwhen i==12
        endloop
    endfunction
    //command 7
    private function GoodJob takes nothing returns nothing
        local integer i = 0
        local player p = CCS_GetChattingPlayer()
        loop
            if IsPlayerAlly(p, Player(i)) then
                if p==Player(i) then //Player(i) is yourself
                    call DisplayTimedTextToPlayer(Player(i), 0, 0, 30.0, &quot;You praise everyone on your team for doing a good job. &quot;)
                else
                    call DisplayTimedTextToPlayer(Player(i), 0, 0, 30.0, GetPlayerName(p)+&quot;: Good job &quot;+GetPlayerName(Player(i)))
                endif
            endif
            set i = i+1
            exitwhen i==12
        endloop
    endfunction
    //command 8
    private function SetName takes nothing returns nothing
        call SetPlayerName(CCS_GetChattingPlayer(), CCS_GetStr())
    endfunction
    //command 9
    private function SetPrefix takes nothing returns nothing
        call CCS_SetPrefixPlayer(CCS_GetStr(), CCS_GetChattingPlayer())
    endfunction
    //command 10
    private function CommandFog takes nothing returns nothing
        if CCS_GetBool() then
            call FogEnableOn()
            call FogMaskEnableOn()
        else
            call FogEnableOff()
            call FogMaskEnableOff()
        endif
    endfunction
    
    //command registering
    private function Init takes nothing returns nothing
        call CCS_SetPrefixAll(&quot;-&quot;) //redundant, default is &quot;-&quot;, just to show you can use this
        call CCS_RegisterChatCommand(&quot;help&quot;, true, CCS_TYPE_NONE, function HelpActions)
        call CCS_RegisterChatCommand(&quot;bool&quot;, true, CCS_TYPE_BOOL, function BoolActions)
        call CCS_RegisterChatCommand(&quot;addgold&quot;, true, CCS_TYPE_INT, function AddGold)
        call CCS_RegisterChatCommand(&quot;real&quot;, true, CCS_TYPE_REAL, function ShowReal)
        call CCS_RegisterChatCommand(&quot;disabled&quot;, true, CCS_TYPE_NONE, function Disabled)
        call CCS_DisableChatCommand(&quot;disabled&quot;)
        call CCS_RegisterChatCommand(&quot;taunt&quot;, false, CCS_TYPE_NONE, function TauntEnemies)
        call CCS_EnableChatCommand(&quot;taunt&quot;)
        call CCS_RegisterChatCommand(&quot;gj&quot;, true, CCS_TYPE_NONE, function GoodJob)
        call CCS_RegisterChatCommand(&quot;setname&quot;, true, CCS_TYPE_STR, function SetName)
        call CCS_RegisterChatCommand(&quot;setprefix&quot;, true, CCS_TYPE_STR, function SetPrefix)
        call CCS_RegisterChatCommand(&quot;fog&quot;, true, CCS_TYPE_BOOL, function CommandFog)
    endfunction
endscope


Suggestions are welcome, enjoy:thup:

Update v1.01 - Added ListCommand functions. Passing invalid parameters to a boolean command now doesn't execute the function
Update v1.02 - Added player specific prefixes. Uploaded a demo map
Update v1.03 - fixed a silly silly thing regarding the boolean return type
 

Attachments

  • ChatCommandSystem1.03.w3x
    29.4 KB · Views: 255

Romek

Super Moderator
Reaction score
963
Demo map?
Example?

Post a screenshot if it shows anything. :p
 

Prozix

New Member
Reaction score
7
Read?
There is no need for a demo map, it works if you do what I tell you to (comment header of the library)
The Example is well... the part where I say "And here is how to use it"
Why don't you try it out if you have the time :p
Just create two triggers, post both pieces of code in them, start the game and type ".help". It should work ;)
 

Executor

I see you
Reaction score
57
Hm I don't like the CCS_ prefix and dislike your sys not being dynamic enough to handle more than one parameter. I mean you could fix those things, but imo the CommandParser sys seems to (for me) to handle those things better.
 

Romek

Super Moderator
Reaction score
963
A demo map for something like this is a requirement.
It makes it much more convenient for members here to test the system.

You've basically got the demo already, all that's left is to make it into a map (which you even said how to do), and upload it here.
It's easier for you to do that, and everyone else to simply download and play, than it is for everyone to have to make their own little demo maps.
 

Prozix

New Member
Reaction score
7
Hm I don't like the CCS_ prefix and dislike your sys not being dynamic enough to handle more than one parameter. I mean you could fix those things, but imo the CommandParser sys seems to (for me) to handle those things better.
The CCS_ prefix. If you really don't like it you could always do a search and replace :p
My system doesn't handle more than 1 parameter for you, that's true. However, you could set CCS_TYPE_STR as the command type and use CCS_GetStr() in your function that requires more than 1 parameter to do the job yourself. Most of the time I don't need more than one parameter but it depends on the game. If you like CommandParser better than CCS you should absolutely use that, it seems to work fine too, it even does multiple parameter handling for you! :D

A demo map for something like this is a requirement.
It makes it much more convenient for members here to test the system.

You've basically got the demo already, all that's left is to make it into a map (which you even said how to do), and upload it here.
It's easier for you to do that, and everyone else to simply download and play, than it is for everyone to have to make their own little demo maps.

Guess I'll have to create a demo map. I would consider my system being a special case because it does what it should, you can check the example code and if you like the way you should use it you will have to copy the code in to your map anyway. As I said before, there is no "playing" this map.. unless you enjoy typing words and getting more gold over and over again.

For the people that only want to see if it works and go all Woahh! but will not try it unless I provide a demo... here it comes, goodbye upload space :(
 

quraji

zap
Reaction score
144
here it comes, goodbye upload space :(

What else do you plan on using that 15kb for? ;)

I like how in the command callback you can easily get a certain type, instead of casting it yourself.

I've been wondering if I should add something like that to my system. I might have to see if I like it :p I think I'd use your definitions for bools (yes, no, 1, 0, etc.). I hope you don't mind.
 

Prozix

New Member
Reaction score
7
What else do you plan on using that 15kb for? ;)

I like how in the command callback you can easily get a certain type, instead of casting it yourself.

I've been wondering if I should add something like that to my system. I might have to see if I like it :p I think I'd use your definitions for bools (yes, no, 1, 0, etc.). I hope you don't mind.

15kb... maybe just maybe, I was just too lazy myself :p
We could work together on the ultimate command system ^^, that would be nice because I think I could learn a thing or two from you.
This voice inside of me keeps on saying: "tell him to give you credits!!!"... But the (yes/true/on/1) thing isn't so special xD so use it if you want.
 

quraji

zap
Reaction score
144
We could work together on the ultimate command system ^^, that would be nice because I think I could learn a thing or two from you.
This voice inside of me keeps on saying: "tell him to give you credits!!!"... But the (yes/true/on/1) thing isn't so special xD so use it if you want.

I thanked you in my documentation for inspiring me to add argument casting, because I wasn't originally going to do it at all (but I'm not going to let your system have more features than mine, no no!) ^.^

It actually turned out very nicely..I just have to polish a few things up and update the documentation (ugh...).
 

Prozix

New Member
Reaction score
7
I thanked you in my documentation for inspiring me to add argument casting, because I wasn't originally going to do it at all (but I'm not going to let your system have more features than mine, no no!) ^.^

It actually turned out very nicely..I just have to polish a few things up and update the documentation (ugh...).

Nice! I'm going to bed now ^^. Maybe I'll try your system out tomorrow.. I'm not feeling well... my girlfriend had "pfeifer" which means I am going to be very tired for a few weeks -_-

EDIT: Argh forgot to upload the map... AGAIN
 

Prozix

New Member
Reaction score
7
Updated the system to version 1.03, it is a crucial update. Does no one have suggestions or something?
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top