[C++] Metin2 Klasse

02/27/2010 18:26 xWaffeleisen#1
HeyHo,

ich hab hier mal eine bis jetzt noch sehr kurze, aber trotzdem sehr sinnvolle Metin2 Klasse für C++ gemacht.
Mithilfe dieser Klasse kann man einfach Items "benutzen" d.h. z.B ein Schwert anzuziehen oder einen Trank zu trinken. Außerdem kann man einfach Items fallen lassen und den Druck der Leertaste simulieren um z.B. zu schlagen oder die Angel hinein zuwerfen oder heraus zuziehen.
Weitere Funktionen folgen noch.

Metin2.h:
Metin2.cpp:


Und hier noch ein kleines Beispiel (main.cpp):

Erstellt und getestet mit Visual Studio 2008.
Projekttyp: Win32 Projekt / DLL
Sollte auch mit VC++ Express gehen. Bei anderen Compilern muss man evtl. paar Sachen umschreiben.

Die DLL muss dann in den Metin2 Prozess injected werden (z.B mit Winject, PerX, OSI)

Wer Fragen hat, kann die gerne hier posten ;)

Have fun :)

PS: Um die Adressen zu finden (für andere Versionen oder neuere) schaut euch mein Video Tutorial an ([Only registered and activated users can see links. Click Here To Register...])

EDIT: Neue Funktionen hinzugefügt
03/01/2010 21:45 Tohu#2
nicht schlecht, ist für anfänger (wie mich) schon eine große hilfe bzw. erleichterung^^
03/02/2010 01:24 schlurmann#3
Lies 'mal was über Klassendesign. Ist ja grauenhaft.
03/02/2010 07:13 flo8464#4
Functionpointer > inline ASM ;)

Und Addressen lagert man besser in ein enum aus, warum den Speicher dafür vollmüllen?
03/02/2010 17:23 xWaffeleisen#5
Quote:
Originally Posted by schlurmann View Post
Lies 'mal was über Klassendesign. Ist ja grauenhaft.
Joa ist meine 1. Klasse^^ Ich mach C++ auch noch nicht so lange, aber was meinste mit Design? Die Anordnung oder wie?

Quote:
Originally Posted by flo8464 View Post
Functionpointer > inline ASM ;)

Und Addressen lagert man besser in ein enum aus, warum den Speicher dafür vollmüllen?

Joa siehe oben, muss ich mich mal besser darin einarbeiten ^^
03/02/2010 17:29 Xereon#6
Quote:
Originally Posted by xWaffeleisen View Post
Joa ist meine 1. Klasse^^
Ist das dein Ernst? o.O
03/02/2010 17:31 xWaffeleisen#7
Ähm ja
Hab erst jetzt angefangen mich mit Klassen zu beschäftigen. Ich hab vor nichtmal einem halben Jahr angefangen und hab noch nicht besonders viel gemacht (Grundlagen von C eben).
03/02/2010 17:50 MrSm!th#8
Ähm...nimm doch gleich ne struct, wenn du eh alles public machst.
Und wie schlurmann schon sagte, lies mal erst was übers design nach ;)
Eine klasse versteckt ihre Implementation.
So ist das wie gesagt nur ne struct und structs nutzt man eher für datensätze.

Wenn du noch nie eine klasse geschrieben hast, dann lern es doch erst richtig, bevor du eine released.
Das ist ein Vorteil von Büchern, gegenüber Tutorials: Sie vermitteln normalerweise einen guten Stil

edit: mit Design ist der Aufbau gemeint.
Bei einer Klasse macht man wie gesagt nicht alles public!

normalerweise gibts Methoden, mit denen man Werte setzt oder ausgibt:

Code:
class foo
{
int x;
};

foo f;
f.x = 1;
schlechte klasse

bessere:

Code:
class foo
{
int x;

int getX();
void setX(int i);
};

foo f;
f.setX(1);
}
natürlich müssten die methoden erst implementiert werden ;)
03/02/2010 18:14 xWaffeleisen#9
Quote:
Originally Posted by MrSm!th View Post
Ähm...nimm doch gleich ne struct, wenn du eh alles public machst.
Und wie schlurmann schon sagte, lies mal erst was übers design nach ;)
Eine klasse versteckt ihre Implementation.
So ist das wie gesagt nur ne struct und structs nutzt man eher für datensätze.

Wenn du noch nie eine klasse geschrieben hast, dann lern es doch erst richtig, bevor du eine released.
Das ist ein Vorteil von Büchern, gegenüber Tutorials: Sie vermitteln normalerweise einen guten Stil

edit: mit Design ist der Aufbau gemeint.
Bei einer Klasse macht man wie gesagt nicht alles public!

normalerweise gibts Methoden, mit denen man Werte setzt oder ausgibt:

Code:
class foo
{
int x;
};

foo f;
f.x = 1;
schlechte klasse

bessere:

Code:
class foo
{
int x;

int getX();
void setX(int i);
};

foo f;
f.setX(1);
}
natürlich müssten die methoden erst implementiert werden ;)
Achso ja daran hab ich auch schon gedacht. Hab jetzt eben erstmal alles public gemacht aber besser wäre ja dann hier ne Funktion z.B SetUseItemAddr(Addr1, Addr2, Addr3) oder?

Muss ich alles mal noch überarbeiten, wenn ich Zeit habe^^
03/02/2010 19:22 MrSm!th#10
Quote:
Originally Posted by xWaffeleisen View Post
Achso ja daran hab ich auch schon gedacht. Hab jetzt eben erstmal alles public gemacht aber besser wäre ja dann hier ne Funktion z.B SetUseItemAddr(Addr1, Addr2, Addr3) oder?

Muss ich alles mal noch überarbeiten, wenn ich Zeit habe^^
wie gesagt, für adressen eine enum

ich würde für die paar funktionen gar keine klasse nehmen
lieber typdefs für funktionspointer und dann ruft man die funktion so auf^^
03/02/2010 21:34 flo8464#11
Also statt

Code:
void Metin2::PickUp(void)
{
	DWORD Addr1 = this->dwPickUpAddr1;
	DWORD Addr2 = this->dwPickUpAddr2;

	__asm
	{
		MOV EAX, Addr2
		MOV ECX,DWORD PTR DS:[EAX]
		CALL Addr1
	}
}
Einfach ein (Ich gehe mal davon aus, dass das ein Fastcall ist, sieht so aus)

Code:
enum MetinStaticAddresses
{
    METIN_PICKUP1 = 0xDEADBEEF,
    METIN_PICKUP2 = 0xDEADBEEF
};

void PickUp()
{
    typedef void (__fastcall *PickUpPtr)(DWORD arg);
    PickUpPtr fPickUp = reinterpret_cast<PickUpPtr>(METIN_PICKUP1);

    fPickUp(*reinterpret_cast<DWORD*>(METIN_PICKUP2));
}
Voila, das Ganze ist deutlich sicherer.
03/04/2010 19:48 XxxXHakanXxxX#12
lol verstehe nicht was das genau sein soll
03/04/2010 23:14 flo8464#13
Quote:
Originally Posted by XxxXHakanXxxX View Post
lol verstehe nicht was das genau sein soll
Mein Code?
03/16/2010 15:51 .Kartoffel#14
wo kommt das rein?^^
03/16/2010 17:35 MrSm!th#15
Quote:
Originally Posted by 05JUMPER09 View Post
wo kommt das rein?^^
wenn du das nicht weißt, kannst dus eh nicht nutzen