1 (edited by SEG4 2015-10-21 19:42:41)

Topic: [Coding-Tutorial](RUS)#2 System Command

Sorry that is not in English!!!:(
Всем привет, это второй урок по кодингу в Teeworlds и так давайте сегодня сделаем систему команд.

Цель:
1. Научиться создавать систему команд
2. Сделать свою команду по примеру урока

Что нам для этого нужно?
1. Исходники Teeworlds (Уже с bam'ом и Compiling.bat. Вот мой урок о том где их взять: *Klick*)
2. Текстовый редактор
    Советую Sublime Text: Download
    Или можно пользоваться: Обычным, Notepad++, CodeBox
3. Знания о том как запустить сервер (Если нужно кому, пишите комментарий сделаю урок!)

И так если всё у вас есть приступим, те у кого нет скачайте.

Для начала зайдём в папку с исходниками, потом /src/game/server/gamecontext.cpp,
и потом ищем такой код (Ctrl+F - поиск):

SendChat(ClientID, Team, pMsg->m_pMessage);

Вот скрин:
http://5.firepic.org/5/images/2015-10/19/e34h8y9yqgw5.png

Теперь сотрём эти две строки:

pPlayer->m_LastChat = Server()->Tick();

SendChat(ClientID, Team, pMsg->m_pMessage);

И в место них напишем такой код:

if(!strncmp(pMsg->m_pMessage,"/",1)) //Если сообщение игрока начинается с "/"
{
    pPlayer->m_LastChat = Server()->Tick(); // Перехватывавем его

    int myID = pPlayer->GetCID(); // Задаём переменную кторая будет означать ID игрока
}
else
    SendChat(ClientID, Team, pMsg->m_pMessage); //иначе просто игрок отправит сообщение

Вот что получилось:
http://5.firepic.org/5/images/2015-10/19/c3tzkho09w7o.png

Теперь создадим команду "/cmdlist", которая будет показывать список команд на сервере.
Для начала после:

int myID=pPlayer->GetCID();

Напишем такой код:

if(!strcmp(pMsg->m_pMessage,"/cmdlist")) //если игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"---------Commands---------");                //Выводит сообщение
    SendChatTarget(myID,"/cmdlist");                                            //Выводит сообщение
    SendChatTarget(myID,"-----------------------------------");            //Выводит сообщение
}

Вот что получилось:
http://5.firepic.org/5/images/2015-10/19/r2lrlf6kigcx.png

В принципе и всё, теперь можно побаловаться и добавить команду "/hello", или какую-то другую
я сделаю "/hello" для начала после

if(!strcmp(pMsg->m_pMessage,"/cmdlist")) //если игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"---------Commands---------");                //Выводит сообщение
    SendChatTarget(myID,"/cmdlist");                                            //Выводит сообщение
    SendChatTarget(myID,"-----------------------------------");            //Выводит сообщение
}

добавим такой код

else if(!strcmp(pMsg->m_pMessage,"/hello")) //или(else) если(if) игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"Server: Hi big_smile"); //Выводит сообщение "Server: Hi big_smile" извеняюсь форум заменил двоеточие+D на смайлики))
}

Вот что получилось:
http://5.firepic.org/5/images/2015-10/19/7pg7l1j570a3.png

И добавим команду в список всех команд.

Для завершения сделаем проверку на не существующую команду
После кода:

else if(!strcmp(pMsg->m_pMessage,"/hello")) //или(else) если(if) игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"Server: Hi big_smile"); //Выводит сообщение "Server: Hi big_smile"
}

Добавим такой код:

else if(!strncmp(pMsg->m_pMessage, "/", 1))
{
    SendChatTarget(myID, "Wrong CMD, see /cmdlist");
}

Думаю скрин не нужно...

Теперь протестим:
1. Запускаем Compiling.bat (Компилируем - дальше буду использовать это выражение.)
2. В папке с исходниками должен появиться "teeworlds_srv.exe", это наш сервер!
3. Запускаем сервер и тестим!!

Вот скрины:
/cmdlist
http://5.firepic.org/5/images/2015-10/19/i3qa4qtrxmwr.png

/hello
http://6.firepic.org/6/images/2015-10/19/f5sf062ahpjz.png

На этом пока-что всё надеюсь вам это было полезно.
Попробуйте как ДЗ сделать команду /help. И поэкспериментировать с ней.
Отвисывайтесь в комменты, кому- что не понятно, объясню!

Автор: SEG4
Contacts:
Skype: Thehacer007
VK: *Klick*

РЕБЯТА!!! Следующий туториал будет о том как сделать что-то в character.cpp и character.h. Например команду "/xxl" или "/aip", бесконечные жизни, бесконечные патроны. Всё это в следующем уроке!!! Ждите:D

2

Re: [Coding-Tutorial](RUS)#2 System Command

For forum admins: Is hard remove topics like this eh? xDD

Seems nice but i don't understand nothing big_smile

3

Re: [Coding-Tutorial](RUS)#2 System Command

Code does not look too clean, not sure if someone should learn from this, I would rather learn C++ (the casual way: With a book) instead of learning specific things for teeworlds.
You will have a much easier time, trust me.

Real programmers don't comment their code - it was hard to write, it should be hard to understand.
Proudly verkeckt since 2010.

4

Re: [Coding-Tutorial](RUS)#2 System Command

xush wrote:

Code does not look too clean, not sure if someone should learn from this, I would rather learn C++ (the casual way: With a book) instead of learning specific things for teeworlds.
You will have a much easier time, trust me.

xush, here ppl like do stuff for teeworlds.. not learn C++ tongue you can tell, read the source of jQuery for know how to work with it... but i prefer read a API reference and snippets...

And yes.. the source presents here isn't good... fpr example you can see that he like strncmp with "/" but not with "/hello"... but this is a discussion and the author can improve it xD

5

Re: [Coding-Tutorial](RUS)#2 System Command

Here is a Google Translation of his post. Hopefully this helps out.

SEG4 wrote:

Sorry that is not in English !!! sad
Hello, this is the second lesson in coding Teeworlds and so today, let's make the system commands.
Goal:
1. Learn how to create a system of commands
2. Make your team the example of lesson
What we need to do?
1. Sources Teeworlds (Already bam'om and Compiling.bat. Here's my lesson about where to get them: * Klick *)
2. Text Editor
    I advise Sublime Text: Download
    Or you can use: Usually, Notepad ++, CodeBox
3. Knowledge of how to start the server (If you need someone, write a comment to make lessons!)
So if all you have start, those who do not download.
To start zaydёm in a folder with the source, and then /src/game/server/gamecontext.cpp,
and then look for the following code (Ctrl + F - search):

SendChat(ClientID, Team, pMsg->m_pMessage);

Here's a screen:
http://5.firepic.org/5/images/2015-10/19/e34h8y9yqgw5.png

Now sotrёm these two lines:

pPlayer->m_LastChat = Server()->Tick();

SendChat(ClientID, Team, pMsg->m_pMessage);

And instead they write the following code:

if(!strncmp(pMsg->m_pMessage,"/",1)) //Если сообщение игрока начинается с "/"
{
    pPlayer->m_LastChat = Server()->Tick(); // Перехватывавем его

    int myID = pPlayer->GetCID(); // Задаём переменную кторая будет означать ID игрока
}
else
    SendChat(ClientID, Team, pMsg->m_pMessage); //иначе просто игрок отправит сообщение

Here's what happened:
http://5.firepic.org/5/images/2015-10/19/c3tzkho09w7o.png

Now create the command "/ cmd list", which will display a list of commands on the server.
To begin after:

int myID=pPlayer->GetCID();

We write the following code:

if(!strcmp(pMsg->m_pMessage,"/cmdlist")) //если игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"---------Commands---------");                //Выводит сообщение
    SendChatTarget(myID,"/cmdlist");                                            //Выводит сообщение
    SendChatTarget(myID,"-----------------------------------");            //Выводит сообщение
}

Here's what happened:
http://5.firepic.org/5/images/2015-10/19/r2lrlf6kigcx.png

In principle, everything is now possible to treat yourself and add the command "/ hello", or some other
I will "/ hello" to start after

if(!strcmp(pMsg->m_pMessage,"/cmdlist")) //если игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"---------Commands---------");                //Выводит сообщение
    SendChatTarget(myID,"/cmdlist");                                            //Выводит сообщение
    SendChatTarget(myID,"-----------------------------------");            //Выводит сообщение
}

add the following code

else if(!strcmp(pMsg->m_pMessage,"/hello")) //или(else) если(if) игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"Server: Hi big_smile"); //Выводит сообщение "Server: Hi big_smile" извеняюсь форум заменил двоеточие+D на смайлики))
}

Here's what happened:
http://5.firepic.org/5/images/2015-10/19/7pg7l1j570a3.png

And add commands to the list of all teams.
To finish do not check for an existing team
After the code:

else if(!strcmp(pMsg->m_pMessage,"/hello")) //или(else) если(if) игрок ввёл "/cmdlist"
{
    SendChatTarget(myID,"Server: Hi big_smile"); //Выводит сообщение "Server: Hi big_smile"
}

Add the following code:

else if(!strncmp(pMsg->m_pMessage, "/", 1))
{
    SendChatTarget(myID, "Wrong CMD, see /cmdlist");
}

I do not need a screen ...

Now the caveat:
1. Start Compiling.bat ([color = red] Compile - I will continue to use this expression. [/ Color])
2. In the folder of the source should appear "teeworlds_srv.exe", this is our server!
3. Start the server and the test !!

Here are the screenshots:
/ cmdlist
http://5.firepic.org/5/images/2015-10/19/i3qa4qtrxmwr.png

/hello
http://6.firepic.org/6/images/2015-10/19/f5sf062ahpjz.png

This is all the things you hope this was helpful.
Try to make the team as the RS / help. And experiment with it.
Otvisyvaytes in the comments, it is not clear to someone, I explain!

Автор: SEG4
Contacts:
Skype: Thehacer007
VK: *Click*

CHILDREN!!! The next tutorial will be on how to do something in character.cpp and character.h. For example the command "/ xxl" or "/ aip", infinite lives, infinite ammo. All this in the next lesson !!! Wait: D

Jesus is my Lord and Savior. Praise be unto God for giving us a way to live with him.

Check out my DeviantArt for all my TeeWorlds art and ideas for Teeoworlds

6

Re: [Coding-Tutorial](RUS)#2 System Command

Removed troll comment // heinrich5991

I will be banned if I troll again ...

7 (edited by xush 2015-10-20 07:30:01)

Re: [Coding-Tutorial](RUS)#2 System Command

@Deepfinder: Removed comment about troll comment, don't worry, you did nothing wrong. // heinrich5991

@unsigner char*: Well, that was not what I meant to say, I wanted to say that someone should rather learn C++ instead learning how to do every tiny thing in teeworlds.


Some improvements to your code:

// use
aBuffer[0] == '/'
// instead of
!strncmp(pMsg->m_pMessage, "/", 1)

// and
str_comp_nocase(...) // teeworlds function, case insensitve
// instead of
strncmp(...)

There is more, but I guess this were the easiest things to fix, as far as I can tell you even got some code duplication where you check for the message to start with "/".

Real programmers don't comment their code - it was hard to write, it should be hard to understand.
Proudly verkeckt since 2010.