|
You last visited: Today at 21:08
Advertisement
[C++] Metin2 Klasse
Discussion on [C++] Metin2 Klasse within the C/C++ forum part of the Coders Den category.
02/27/2010, 18:26
|
#1
|
elite*gold: 320
Join Date: Oct 2009
Posts: 697
Received Thanks: 1,643
|
[C++] Metin2 Klasse
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:
Code:
#include <Windows.h>
#pragma once
class Metin2
{
public:
Metin2(void);
~Metin2(void);
void UseItem(int Slot);
DWORD dwUseItemAddr1;
DWORD dwUseItemAddr2;
DWORD dwUseItemAddr3;
void DropItem(int Slot, int Anzahl);
DWORD dwDropItemAddr1;
DWORD dwDropItemAddr2;
DWORD dwDropItemAddr3;
void DropYang(int Yang);
DWORD dwDropYangAddr1;
DWORD dwDropYangAddr2;
DWORD dwDropYangAddr3;
void AttackKeyPressed(int ispressed);
DWORD dwAttackKeyPressedAddr1;
DWORD dwAttackKeyPressedAddr2;
DWORD dwAttackKeyPressedAddr3;
void PickUp(void);
DWORD dwPickUpAddr1;
DWORD dwPickUpAddr2;
void QuickSlot(int Slot);
DWORD dwQuickSlotAddr1;
DWORD dwQuickSlotAddr2;
DWORD dwQuickSlotAddr3;
void SendChat(char* Text, int Chattyp);
DWORD dwSendChatAddr1;
DWORD dwSendChatAddr2;
DWORD dwSendChatAddr3;
};
Metin2.cpp:
Code:
#include "Metin2.h"
Metin2::Metin2(void)
: dwUseItemAddr1(0)
, dwUseItemAddr2(0)
, dwUseItemAddr3(0)
, dwDropItemAddr1(0)
, dwDropItemAddr2(0)
, dwDropItemAddr3(0)
, dwAttackKeyPressedAddr1(0)
, dwAttackKeyPressedAddr2(0)
, dwAttackKeyPressedAddr3(0)
, dwPickUpAddr1(0)
, dwPickUpAddr2(0)
, dwDropYangAddr1(0)
, dwDropYangAddr2(0)
, dwDropYangAddr3(0)
, dwQuickSlotAddr1(0)
, dwQuickSlotAddr2(0)
, dwQuickSlotAddr3(0)
, dwSendChatAddr1(0)
, dwSendChatAddr2(0)
, dwSendChatAddr3(0)
{
}
Metin2::~Metin2(void)
{
}
void Metin2::UseItem(int Slot)
{
DWORD Addr1 = this->dwUseItemAddr1;
DWORD Addr2 = this->dwUseItemAddr2;
DWORD Addr3 = this->dwUseItemAddr3;
__asm
{
MOV EAX, Addr3
MOV ECX,DWORD PTR DS:[EAX]
PUSH Slot
CALL Addr1
CALL Addr2
}
}
void Metin2::DropItem(int Slot, int Anzahl)
{
DWORD Addr1 = this->dwDropItemAddr1;
DWORD Addr2 = this->dwDropItemAddr2;
DWORD Addr3 = this->dwDropItemAddr3;
__asm
{
MOV EAX, Addr3
MOV ECX,DWORD PTR DS:[EAX]
PUSH Anzahl
PUSH 0
PUSH Slot
CALL Addr1
CALL Addr2
}
}
void Metin2::DropYang(int Yang)
{
DWORD Addr1 = this->dwDropYangAddr1;
DWORD Addr2 = this->dwDropYangAddr2;
DWORD Addr3 = this->dwDropYangAddr3;
__asm
{
MOV EAX, Addr3
MOV ECX,DWORD PTR DS:[EAX]
PUSH Yang
PUSH 0
CALL Addr1
CALL Addr2
}
}
void Metin2::AttackKeyPressed(int ispressed)
{
DWORD Addr1 = this->dwAttackKeyPressedAddr1;
DWORD Addr2 = this->dwAttackKeyPressedAddr2;
DWORD Addr3 = this->dwAttackKeyPressedAddr3;
__asm
{
MOV EAX, Addr3
MOV ECX,DWORD PTR DS:[EAX]
SETNE DL
PUSH ispressed
CALL Addr1
CALL Addr2
}
}
void Metin2::PickUp(void)
{
DWORD Addr1 = this->dwPickUpAddr1;
DWORD Addr2 = this->dwPickUpAddr2;
__asm
{
MOV EAX, Addr2
MOV ECX,DWORD PTR DS:[EAX]
CALL Addr1
}
}
void Metin2::QuickSlot(int Slot)
{
DWORD Addr1 = this->dwQuickSlotAddr1;
DWORD Addr2 = this->dwQuickSlotAddr2;
DWORD Addr3 = this->dwQuickSlotAddr3;
__asm
{
MOV EAX, Addr3
MOV ECX,DWORD PTR DS:[EAX]
PUSH Slot
CALL Addr1
CALL Addr2
}
}
void Metin2::SendChat(char* Text, int Chattyp)
{
DWORD Addr1 = this->dwSendChatAddr1;
DWORD Addr2 = this->dwSendChatAddr2;
DWORD Addr3 = this->dwSendChatAddr3;
__asm
{
MOV EAX, Addr3
MOV ECX,DWORD PTR DS:[EAX]
PUSH Chattyp
PUSH Text
CALL Addr1
CALL Addr2
}
}
Und hier noch ein kleines Beispiel (main.cpp):
Code:
#include <Windows.h>
#include "Metin2.h"
DWORD APIENTRY OnInjection()
{
Metin2 M2; // Erstellen einer Klasseninstanz
// Festlegen der Funktionsadressen (Stand 27. Feb 2010)
M2.dwUseItemAddr1 = 0x0041ED60;
M2.dwUseItemAddr2 = 0x0053FCE0;
M2.dwUseItemAddr3 = 0x005F4FC8;
M2.dwDropItemAddr1 = 0x0041DFC0;
M2.dwDropItemAddr2 = 0x0053FCE0;
M2.dwDropItemAddr3 = 0x005F4FC8;
M2.dwAttackKeyPressedAddr1 = 0x0043D530;
M2.dwAttackKeyPressedAddr2 = 0x0053FCE0;
M2.dwAttackKeyPressedAddr3 = 0x005F29B8;
M2.dwPickUpAddr1 = 0x0043C970;
M2.dwPickUpAddr2 = 0x005F29B8;
M2.dwDropYangAddr1 = 0x0041DFC0;
M2.dwDropYangAddr2 = 0x0053FCE0;
M2.dwDropYangAddr3 = 0x005F4FC8;
M2.dwQuickSlotAddr1 = 0x00439D20;
M2.dwQuickSlotAddr2 = 0x0053FCE0;
M2.dwQuickSlotAddr3 = 0x005F29B8;
M2.dwSendChatAddr1 = 0x0041A640;
M2.dwSendChatAddr2 = 0x0053FCE0;
M2.dwSendChatAddr3 = 0x005F4FC8;
M2.UseItem(0); // Item auf Slot 0 (Im Spiel der 1.) benutzen
M2.DropItem(1,1); // Item auf Slot 1 (Im Spiel der 2.) fallen lassen (Anzahl 1)
M2.AttackKeyPressed(1); // Den AttackKey (Space) für 1 Sekunde gedrückt halten)
Sleep(1000);
M2.AttackKeyPressed(0);
M2.PickUp(); // Item aufheben
M2.DropYang(3); // 3 Yang fallen lassen
M2.QuickSlot(0); // Quickslot 0 (1) benutzen
M2.SendChat("test", 0); // "test" in normalen Chat
return 0;
}
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)OnInjection, NULL, 0, NULL);
}
return true;
}
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 (  )
EDIT: Neue Funktionen hinzugefügt
|
|
|
03/01/2010, 21:45
|
#2
|
elite*gold: 0
Join Date: Nov 2009
Posts: 1,107
Received Thanks: 522
|
nicht schlecht, ist für anfänger (wie mich) schon eine große hilfe bzw. erleichterung^^
|
|
|
03/02/2010, 01:24
|
#3
|
elite*gold: 0
Join Date: May 2008
Posts: 489
Received Thanks: 210
|
Lies 'mal was über Klassendesign. Ist ja grauenhaft.
|
|
|
03/02/2010, 07:13
|
#4
|
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
|
Functionpointer > inline ASM
Und Addressen lagert man besser in ein enum aus, warum den Speicher dafür vollmüllen?
|
|
|
03/02/2010, 17:23
|
#5
|
elite*gold: 320
Join Date: Oct 2009
Posts: 697
Received Thanks: 1,643
|
Quote:
Originally Posted by schlurmann
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
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
|
#6
|
elite*gold: 0
Join Date: Apr 2009
Posts: 793
Received Thanks: 366
|
Quote:
Originally Posted by xWaffeleisen
Joa ist meine 1. Klasse^^
|
Ist das dein Ernst? o.O
|
|
|
03/02/2010, 17:31
|
#7
|
elite*gold: 320
Join Date: Oct 2009
Posts: 697
Received Thanks: 1,643
|
Ä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
|
#8
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Ä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
|
#9
|
elite*gold: 320
Join Date: Oct 2009
Posts: 697
Received Thanks: 1,643
|
Quote:
Originally Posted by MrSm!th
Ä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
|
#10
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
Originally Posted by xWaffeleisen
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
|
#11
|
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
|
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
|
#12
|
elite*gold: 18
Join Date: Dec 2009
Posts: 3,016
Received Thanks: 404
|
lol verstehe nicht was das genau sein soll
|
|
|
03/04/2010, 23:14
|
#13
|
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
|
Quote:
Originally Posted by XxxXHakanXxxX
lol verstehe nicht was das genau sein soll
|
Mein Code?
|
|
|
03/16/2010, 15:51
|
#14
|
elite*gold: 0
Join Date: Mar 2010
Posts: 365
Received Thanks: 40
|
wo kommt das rein?^^
|
|
|
03/16/2010, 17:35
|
#15
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
Originally Posted by 05JUMPER09
wo kommt das rein?^^
|
wenn du das nicht weißt, kannst dus eh nicht nutzen
|
|
|
 |
|
Similar Threads
|
[C++]Funktion einer Klasse in einer anderen Funktion der Klasse verwenden, aber wie?
07/25/2010 - C/C++ - 3 Replies
Mein Problem ist eigentlich recht simpel und die Lösung wahrscheinlich auch.
Da ich bisher fast 0 mit Klassen am Hut hatte, wollte ich mich doch mit dem Thema anfreunden und hatte gleich angefangen:
int test::Funktion2()
{
int temp;
cin>>temp;
return temp;
}
|
Welche Klasse ist die Beste Klasse
07/06/2010 - Metin2 - 6 Replies
Hallo ich habe heute mal angefangen Metin 2 angefangen und wollte fragen welche klasse ist die beste meine Vorstellung Menge Deff
Wird Mich freuen auf Antwort
|
[Metin2.de]Klasse
06/13/2010 - Metin2 Private Server - 7 Replies
Hallo,
ich wollte gerne erfahren,
welche der 4 Klassen die beste im,:
Leveln und im PvP sind..
Also ich denke an Ninja oder Krieger..
Heil Schamanen sind natürlich auch PvP bomben..
Was denkt ihr wenn ich alleine oder mit einem Freund spiele?..
Thanks 100% Garantiert
|
LVL/Name/Klasse in Metin2
04/01/2010 - Metin2 - 6 Replies
Mein Char:
LvL:14
Name:xProBuffx
Klasse:Schamane
Schreibt doch euren sachen auch rein..:)
|
All times are GMT +1. The time now is 21:08.
|
|