[Mini-Guide]C++ neue Chat-Commands

04/28/2015 09:43 Dyshaxo#1
Da grade so viele nützliche Guides und Releases gemacht werden will ich mich an der Welle der "So beschissen schrecklichen" Metin2-Community beteiligen :)

Hier erkläre ich euch, wie ihr neue Chat-Commands (Wie man's kennt, z.B. /kill) für euren Core bastelt.

Kurzes Vorwort: Nach kurzer recherche hab' ich kein HowTo dazu gefunden. Es gibt in 'nem anderen Forum 'n Guide zur Client/Core - Core/Client-Kommunikation mittels Packets, der Vorteil an Commands ist - dass die Implementierung bei weitem einfacher ist, und man für die Client-Server-Kommunikation nurnoch via Aufruf der Python-Function net.SendChatCommand("/command") das gewünschte... wasauchimmer ausführen kann :D

Im Beispiel werd' ich 'nen Command schreiben, mit dem man ein gewünschtes Pet mittels Vnum als Argument spawnen kann.

Fangen wir an:

Ihr öffnet "cmd.cpp" - dort seht ihr sehr viele Functions wie "ACMD(do_warp)" - sucht euch eine Stelle irgendwo zwischen den ganzen Functions, wo ihr das gefühl habt, dass es dort richtig ist, und fügt hinzu:
Code:
ACMD(do_pet_summon);
Scrollt weiter zu:
"struct command_info cmd_info[] ="

Dort sind die ganzen im Core implementierten Chatcommands aufgelistet.
Hier wird auch festgelegt, wann ein solcher Befehl verwendet werden kann, und welche Rechte ein Spieler benötigt, um diesen zu verwenden.

Wo's gerade Sinn macht fügt ihr ein:
Code:
{ "pet_summon",			do_pet_summon,			0,	POS_DEAD,	GM_IMPLEMENTOR	},
Bei mir steht das ganze unter "ride" und sieht so aus:

"POS_DEAD" weil - ich hab' ganz offen keine Ahnung, muss ich mir mal genauer anschauen. "GM_IMPLEMENTOR" weil - nur GM's mit IMPLEMENTOR-Rechten (Wird in der Datenbank von euch selbst bestimmt) den Befehl nutzen können sollen. Wenn ihr wollt, dass jeder normale Player den Befehl auch nutzen kann - schreibt ihr stattdessen "GM_PLAYER".

Und damit steht soweit auch das gerüst, jetzt müssen wir noch bestimmen, was der Command denn genau machen soll :)
Dazu öffnen wir "cmd_general.cpp", hier findet die eigentliche Implementierung statt.

Da wir mit dem PetSystem arbeiten - macht es Sinn, die Funktionen des PetSystems auch aufrufen zu können, dazu gehen wir bei der Datei ganz nach oben und fügen bei den Includes hinzu:
Code:
#include "PetSystem.h"
Dort seht ihr dann wieder die ganzen Functions wie "ACMD(do_pvp)". an einer Stelle wo's grade passt fügen wir hinzu:

Code:
ACMD(do_pet_summon)
{
	if (ch->IsDead())
		return;
	
	char arg1[256];
	one_argument(argument, arg1, sizeof(arg1));
	
	if (!*arg1)
	{
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("do_pet_summon: not enough Argument"));
		return;
	}
	
	int vnum = 0;
	str_to_number(vnum, arg1);

	CPetSystem* petSys = ch->GetPetSystem();

	if (!petSystem)
		return;
	
	CPetActor* pet = petSys->Summon(vnum, NULL, NULL, false);
	
	if (!pet)
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Could not summon pet");
}
Sooo... :) wollte das ganze eigentlich noch testen bevor ich jetzt in die Schule muss, da ich mir bei den Argumenten für den Summon-Befehl nicht ganz sicher war, aber verdammt mein Bus fährt in 5 Minuten >_<

Jedenfalls - solltet ihr jetzt mit "/pet_summon 101" <- 'nen Wildhund als Pet rufen können =) Viel Spaß!

ACH VERDAMMT MAN VÖLLIG FALSCHE SECTION WAS SOLL DAS WIESO PASSIERT MIR DAS ahhh >_<

#moverequest
04/28/2015 10:17 i[Remix]#2
Ist schon public so weit ich weiß.
04/28/2015 15:10 Dyshaxo#3
Quote:
Originally Posted by i[Remix] View Post
Ist schon public so weit ich weiß.
Hab' sowieso total verkackt man so verpeilt aufgewacht und was soll's, vergessen wir einfach dass ich das gepostet habe. :D
04/29/2015 20:40 .aNNdii##4
#moved
05/07/2015 17:04 galetlefrancais#5
Thanks ! :)

PS : In game if I type /pet_summon 101, the wild dog disappears
05/08/2015 11:51 Benhero#6
yeah^^ because the Pet's need an "Summon Item" and with a command you don't have one :) so every Pet will disapear.
You can try to use horse book to summon your horse and after this i think you can summon a pet with the command to.

Greatz
05/08/2015 13:07 Dyshaxo#7
Quote:
Originally Posted by Benhero View Post
yeah^^ because the Pet's need an "Summon Item" and with a command you don't have one :) so every Pet will disapear.
You can try to use horse bug du summon your horse and after this i think you can summon a pet with the command to.

Greatz
Ich wusste ich hab' irgendetwas wichtiges vergessen!
05/09/2015 12:23 galetlefrancais#8
But if "!PetSystem" stays, it returns me an error, because it is "not declared in this scope" :x