I think the chatbot tutorial should be refreshed
Making Chatbots
You've probably seen somebody in a server automatically say hi when somebody joins, or somebody just says "get server ip" in the chat, and they automatically talk back with their sentence being the ip of the server. You've probably wondered what that is, and I will explain to you about these mods called Chatbots, and how to make them.
Chatbots are very simple to make, we will first make a chatbot that will make you say "Hey dude!" after you say "Hi Chatbot". The easiest to way to make this is by packaging.
Packaging
Packaging is a very useful thing in Blockland. With packaging, you can re-modify / add on to existing functions without having to re-write all the previous data again. Packages are very simple and creating one starts like this:
package PACKAGENAME
{
//code stuff here
};
You now see that creating packages are similar to creating functions in Blockland. But there are a few differences. Packages do not need () to surround the name of the package (as far as I know), all you need to do is type package and then a space with the name of your package after it. Also at the end of the package, is required: a semi-colon. Semi-colons are always needed to end packages. They are not used for functions, only packages and other things that other people might explain.
Modifying a function
The whole reason we want to create a package, is to modify the chat function so we can make ourselves say
"Hey Dude!" after we've said "Hi Chatbot". To do this, we just define the function we want to modify in the package. What we want to modify is clientCmdChatMessage.
That function is the function that is called after we've typed all of our stuff and press ENTER. The clientCmdChatMessage function has quite a few arguments, some of which even I am not familiar with, but all you need to be familiar with is 2 arguments. Here is the function labeled below:
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
//code here
}
What we need to memorize is %name and %msg. If you already know what a variable is, then it should be obvious to you. clientCmdChatMessage is called everytime someone chats. Each variable is always changed every time someone chats. %name is the name of the user who just sent a message, and %msg is the message that they typed. To implement the function into our package, refer to the code down here:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
//code here
}
};
Parenting
Packages do not only exist for re-modifying functions. They also exist so that we can turn them on and off anytime we like. Packages are useful for torque programmers because whenever we wish to remodify a function, some might not use packages, and once they remodify that function, all the previous data is lost unless they enter it back in. If clientCmdChatMessage was modified without packages, then your chatting system would be broken and you would have to restart Blockland.
The code we have right now is in a package thankfully to me, and we are telling Blockland to remodify the function clientCmdChatMessage. But no, that is not all. We have not entered any code in there yet, so Blockland thinks we want clientCmdChatMessage to do practically nothing. So we have to type in a special little command that will enter all the previous data we've had. That command is called: Parent. And this is how we use it:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
}
};
Using that command will re-enter all the previous data that already existed in our function back in. Now we can apply any changes to this function after the Parent command.
If Statements
If statements exist to execute code when a certain thing happens. If statements are only executed once, but now that we can remodify the clientCmdChatMessage function, any if statement in there will be checked everytime somebody chats.
So guess what we will need to put in the if statement? Come on just guess and come back when you think you've got it.
Have you got it? If not then :[. The answer is we will need our if statement to check if our player is saying "Hi Chatbot". If you've got it then high-five. Unfortunately, we cannot just enter it in like that on our code, we need to enter it in by Torque's laws of syntax.
A way to use if statements to see if the player is saying "Hi Chatbot", is by this:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(%msg $= "Hey Chatbot!")
{
//code here
}
}
};
Much is to be explained here. Every if statement needs an operator of some sort. the operator I used was $=. I will present a list of operators below, and what they do:
- == if Value Variable is equal to
- != if Value Variable is NOT equal to
- $= if String Variable is equal to
- && Used to connect 2 operators together. The if statement will run if both of them return true
- || Used to connect 2 operators together. The if statement will run if 1 or the other returns true
There are probably more operators out there but i'm tired so I'll stop it here for tonight.
The reason I used $= in our code, is because %msg always returns a string, and $= is used for connecting strings. Only use == when you are connecting values.
So basically, when Blockland looks over the code, it sees our package, then makes our package, then it sees that we want to re-define the function clientCmdChatMessage, so it does that for us, and then it sees the parent command, so we just told it to write in all the previous data that was in it before we defined it, then it sees the if statement, and understands to execute any code when a message that any player sent is equal to "Hey Chatbot!".
Don't you feel pretty accomplished for getting this far? So do I. But there is 1 slight problem. If a message that ANY player sent is equal to "Hey Chatbot!". We probably don't want that, and we only want the if statement to run if WE said that line. So all we need to do is add in another operator in our if statement and add a little command:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(%msg $= "Hey Chatbot!" && %name $= $Pref::Player::Netname)
{
//code here
}
}
};
As explained before, the && is used to connect 2 operators. So when the console looks at the if statement, it will check if the message that a player sent is equal to "Hey Chatbot", and it will check to see if the name of the player who sent that message is also equal to the name of $Pref::Player::Netname. $Pref::Player::Netname is the same as the username you set on Blockland when you first registered. Everytime you change your username, $Pref::Player::Netname is changed with it also.
Making our player talk
Yes, not much more to do now! All we need to do now is call a function to make a player talk! As you've (hopefully), read in Pacnet's tutorial, we need to send a message to the server to make us talk. Here is the command we need to send:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(%msg $= "Hey Chatbot!" && %name $= $Pref::Player::Netname)
{
commandToServer('messageSent',"Hey dude!");
}
}
};
And yes, that is basically it. messageSent is a command we have to put in commandToServer to tell the server we want our player to talk. So basically, all you have to do is execute this little code through the means of a small script, or a plain add-on, and then, most importantly, you must type in the console:
activatePackage(packagename);
deactivatePackage(packagename);
ActivatePackage turns your mod on, like i've said before: Packages can be enabled or disabled. DeactivatePackage turns your mod off, so the command wont work anymore.
Up next: Advanced Chatbot Tutorial
Advanced Chatbot Tutorial
So making your chatbot say something when you say a specific thing wasn't enough for you? Well, don't worry my friend! I will hope that you have read my previous Chatbot tutorial and hope you are ready for this new challenge.
I will explain before-hand what we will be covering in our tutorial. A chatbot that just says something is highly boring, to you, and to me. We need our chatbot to actually be useful for something. And for our chatbots to be useful, we will need to use input.
Input
Input is a very special thing. Input is like taking things that the user (you) enters. If you've previously read ¥ola's tutorial, then you would understand that input can be used for many things. Input is used in a function to make functions useful for working. Functions with input take the input you entered, and work some things with the input you've entered. After it's done, it usually returns a different value or string, or something different.
Input can also be used in chatbots. Which is why, today we will be making a chatbot that takes 2 numbers we've entered, and add them both, and repeat the answer back in our chat! Sounds pretty cool right? First we will need to write down a default code template for our chatbot:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
}
};
Then we will add an if statement. But in this if statement, we can't just use "%msg $=". Since we are going to make our chatbot receive input from the user, we are going to have to be a little more advanced here.
getWord() Function
getWord() is a special function, as this pre-defined function has 2 arguments: the source, and the word number. The source is like the word we want the function to examine. Lets say we want our function to examine: "Hello World". For that, we would define the following string:
%word = "Hello World!";
Then we add in a getWord function
%word = "Hello World!";
getWord(%word,0);
Hm, weird. There is a second argument in the getWord function. That is the word number. The word number is typically the number of the word we want to return. if we said "getWord(%word,0);", it would return the "Hello" part of %word. That is because the word number always starts at 0, being the first word in the string/value. Saying "getWord(%word,1);", would return "World!". Why did it put the "!" you ask? Well that's because words in the getWord() function are generally scanned when they are spaced out by spaces.
Creating our Advanced Chatbot
Now that we have an OK idea on what getWord() is, we can implement it into our chatbot. We want our Chatbot to add 2 numbers from input after we've said "add (NUMBER1) and (NUMBER2)". To do that, we must first use getWord() to check if the first word we've said in our message is, "add":
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(getWord(%msg,0) $= "add")
{
//code here
}
}
};
The current cake we have now is saying, if the first word in our message is "add", execute the code below. We also need to see if the THIRD word in our sentence is "and". We don't really have a way to check for input now. We will check for input later, but now, lets focus on the exact words. Add this:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(getWord(%msg,0) $= "add" && getWord(%msg,2) $= "and")
{
//code here
}
}
};
If we used "getWord(%msg,1)" in our sentence, it would check for the 2nd word. We are saving the second word for our input, and the fourth word for our input also.
Now that we have all the data in our if statement, we can move on to the easy part. We are going to set 3 variables. The first two variables will be our input variables, because with variables, we can use getWord() in them to receive input from our message. Add this:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(getWord(%msg,0) $= "add" && getWord(%msg,2) $= "and")
{
%number1 = getWord(%msg,1);
%number2 = getWord(%msg,3);
}
}
};
Yes, we are getting closer to the end. %number1 is now defined as the 2nd word in our message, and %number is defined as the 4th. Also, remember getWord() always starts at 0, 0 being the first word in the sentence. It's something with the engine, don't ask me :/.
Now we will create a variable that is the total of adding both of those variables together. Very simple:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(getWord(%msg,0) $= "add" && getWord(%msg,2) $= "and")
{
%number1 = getWord(%msg,1);
%number2 = getWord(%msg,3);
%total = %number1 + %number2;
}
}
};
%total is now the added total of %number1 and %number2. Now that we have a variable, everything else can be so simple. All we have to do is call a command to the server to make us say that variable. Also, a thing to remember. If you want to display variables in a string, then you have 2 ways: If you are trying to say just a variable and only a variable: use this:
commandToServer('messageSent',%total);
Otherwise, if you wish to display some words in your text, you can switch between displaying variable mode and string mode by using "@ to enter variable mode, and @" to exit back into word mode. An example below is this:
commandToServer('messageSent',"Your answer is "@%total@"");
If the variable %total is defined, It will make your character say:
"Your answer is (totalhere)"
So, you can just add any of those at the bottom of where we defined the %total, and it will work successfully. I personally am going to go with the other version, where it displays string. I just like it because it looks more advanced. This is our final code:
package Chatbot
{
function clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
{
parent::clientCmdChatMessage(%a, %b, %c, %fmsg, %cp, %name, %cs, %msg)
if(getWord(%msg,0) $= "add" && getWord(%msg,2) $= "and")
{
%number1 = getWord(%msg,1);
%number2 = getWord(%msg,3);
%total = %number1 + %number2;
commandToServer('messageSent',"Your answer is "@%total@"");
}
}
};
Well, that's the end of our chatbot. That was really simple, right? Yes, hopefully. Now that you now how to receive input from a chatbot, you can make a chatbot that does games, such as "Guess The Number" games, or to make a chatbot subtract, MULTIPLY, or even DIVIDE your inputs! Yes, with chatbots, you can do so many things..
Up next, Creating a Chatbot Game which will never happen haha