WoWExt - XYZ Hack mit Teleport Features

03/28/2011 07:32 AmosisKha#271
Oh mein Gott o.O Gatherplugin xD Ihr seid meine Helden! Kanns kaum erwarten das zu testen :) Alchi skillen suckt... hust*

Dickes dankeschön :)
03/28/2011 08:31 Cencil#272
Bin mir aber noch nicht wirklich sicher wie komplex die Plugin Schnittstelle wird. Funktionen wie CreateTeleportJob(), RegisterChatCommand... werden vermutlich exportiert, um die ganzen Objekt/Interact Funktionen wirst du dich hingegen selbst kümmern müssen :p
03/28/2011 09:06 Rauloco#273
Cencil, first geat work!
Is possible to get the rotation of the targeted char? So when you teleport, you would appear at the same rotation of targeted char. ??
03/28/2011 09:12 Cencil#274
Quote:
Originally Posted by Rauloco View Post
Cencil, first geat work!
Is possible to get the rotation of the targeted char? So when you teleport, you would appear at the same rotation of targeted char. ??
I'll fix this in the next release, thanks for the info.
03/28/2011 11:58 Rauloco#275
Quote:
Originally Posted by Cencil View Post
I'll fix this in the next release, thanks for the info.
You're welcome, good job.
It'd be awesome if we could make a fake shadow step =D
03/28/2011 15:49 Cencil#276
Mal ein kleines Update um Plugins zu testen. Wenn ihr nicht gerade vorhabt Plugins zu entwickeln, ladet diese Version nicht herunter.

Funktionen welche von einem Plugin später zwingend exportiert werden sollten, andernfalls wird es in späteren Versionen ignoriert.

Die Aufruf Konversation für jede Funktion ist stdcall

Initialize Deklaration, danke an Ende!
Code:
BOOL Initialize(char *szModuleVer,     // Schreibt das Modul seine Versions-Nr als Sting rein
                                     int nModuleVerLen,     // Maximale Länge für szModuleVer
                                     DWORD *pdwModuleBuild, // Schreibt das Module seine Build-Ver rein
                                     char *szHackVer,       // Wird vom Hack die Version als String übergeben
                                     DWORD dwHackBuild) ;   // Selbsterklärend ^^
Tamia übergibt bei szHackVer den String "Revision" mit der anschließenden Nummer. z.B. "Revision 9". Bei dwHackBuild wird nur 9 übergeben. War die Initialisierung eures Plugins erfolgreich solltet ihr TRUE zurückgeben, andernfalls wird das Plugin sofort wieder entladen.

void Unitinialize()
Wird z.Z. niemals aufgerufen, da Plugins noch nicht sauber entladen werden. Nutzt diese Funktion in eurem Plugin um z.B. registrierte Chat Befehle wieder zu entfernen oder erstellte Teleport Jobs sauber zu löschen.

void RenderCallback(void* pDevice)
Wird jeden Frame aufgerufen. Tamia übergibt einen DX9 Device Pointer welcher z.Z. NULL ist. Die meisten Tamia Funktionen sollten innerhalb dieser Funktion aufgerufen werden

char* GetPluginName()
Wird vom Loader aufgerufen um den Namen zu erhalten.

char* GetPluginDeveloper()
Die Credits des Plugins eben

OPTIONALE Funktionen

BOOL SCMCallback(char* szMessage)

Tamia ruft sofern vorhanden diese Funktion bei einem . Befehl auf, ihr könnt den Befehl dann selbst verarbeiten, ohne auf die Tamia Funktionen (siehe unten) zurückgreifen zu müssen. Wurde die Eingabe durch euch verarbeitet gebt TRUE zurück, ansonsten FALSE.

Funktionen welche von Tamia exportiert werden:

BOOL RegisterChatCommand(char* szCommand, void* pCallback, char* szHelp, BOOL bHiddenInHelp)

Registriert einen neuen . Befehl. szHelp ist der Help String welcher bei .help euerBefehl erscheint. bHiddenInHelp bestimmt ob der Befehl unter .help unsichtbar ist. Leerzeichen sollten bei einem Befehl vermieden werden. Gibt die Funktion FALSE zurück, konnte der Befehl nicht registriert werden, da er möglicherwiese bereits existiert.

Eine Callback Funktion sollte folgendermaßen aussehen:
void MyCallback(char* szParameter)

BOOL UnregisterChatCommand(char* szCommand)
Löscht den übergebenen Befehl. Gibt die Funktion FALSE zurück ist der Vorgang gescheitert, der Befehl existiert dann möglicherweise nicht.

BOOL CreateTeleportJob(float x, float y, float z, float facing, BOOL bHideMessages)
Erstellt einen neuen Teleport Job. bHideMessages bestimmt ob Nachrichten im Chat für diesen Job vermieden werden. Gibt die Funktion FALSE zurück konnte der Job nicht erstellt werden.

void DeleteTeleportJob()
Na, was wohl?

void AddChatMessage(char* szMessage, char* szColor)
Fügt dem Chat eine neue Nachricht hinzu (nur für den lokalen Spieler sichtbar). szColor bestimmt dabei den Farbcode, weiß wäre z.B. "|cffffffff"

void* GetPlayerPoiner()
Sollte klar sein

[Only registered and activated users can see links. Click Here To Register...]

edit: Es werden natürlich noch mehr Exports hinzugefügt, was hier zu sehen ist, ist nur als kleiner Test gedacht. Eventuell wird es noch einige Plugin Beispiele in verschiedenen Sprachen geben.
03/28/2011 21:46 Ende!#277
Sehr schön :) Allerdings hast du in deiner Dokumentation bei Uninitialize und RenderCallback den Returntype vergessen :b

Ich hab jetzt mal mein Test-Plugin auf RegisterChatCommand umrüsten wollen (super Idee btw), was allerdings einige Probleme aufwarf. Meine Befehle wurden zwar registriert (bei .help angezeigt), allerdings bekam ich nichts zu sehen, als ich meinen Befehl dann benutzen wollte. Da hab ich kurzentschlossen mal dein WinAMP Plugin reversed und festgestellt, dass die Callback Funktionen keine stdcall, sondern vielmehr eine Delphi-Register/Fastcall Konvention zu benutzen scheinen (Register werden benutzt ohne von der Funktion selbst initialisiert zu werden, Funktion räumt am Ende nicht den Stack auf).

Wenn man das erstmal weiß, ist das (sofern man in ASM schreibt) kein Problem damit umzugehen, aber da ich für meinen Chat vorraussichtlich C++ usen werde, wäre es gut, wenn die Callback Funktionen ebenfalls stdcall wären, da es mit C++ sonst recht umständlich wäre deinen Register-Call zu handeln ;)
03/28/2011 22:19 Cencil#278
Quote:
Originally Posted by Ende! View Post
Sehr schön :) Allerdings hast du in deiner Dokumentation bei Uninitialize und RenderCallback den Returntype vergessen :b

Ich hab jetzt mal mein Test-Plugin auf RegisterChatCommand umrüsten wollen (super Idee btw), was allerdings einige Probleme aufwarf. Meine Befehle wurden zwar registriert (bei .help angezeigt), allerdings bekam ich nichts zu sehen, als ich meinen Befehl dann benutzen wollte. Da hab ich kurzentschlossen mal dein WinAMP Plugin reversed und festgestellt, dass die Callback Funktionen keine stdcall, sondern vielmehr eine Delphi-Register/Fastcall Konvention zu benutzen scheinen (Register werden benutzt ohne von der Funktion selbst initialisiert zu werden, Funktion räumt am Ende nicht den Stack auf).

Wenn man das erstmal weiß, ist das (sofern man in ASM schreibt) kein Problem damit umzugehen, aber da ich für meinen Chat vorraussichtlich C++ usen werde, wäre es gut, wenn die Callback Funktionen ebenfalls stdcall wären, da es mit C++ sonst recht umständlich wäre deinen Register-Call zu handeln ;)
Die Funktions Definition welche für die Aufrufe der Callbacks zuständig ist, ist bereits als stdcall deklariert. Sicher das deine Funktion wirklich nie aufgerufen wurde? Wie ich das sehe sollte es "nur" Probleme bei der Umwandlung des Parameter-Typs gegeben haben.

Bei dem Winamp Plugin fehlte hingegen tatsächlich ein kleines stdcall. Der Callback Handler hat den Parameter korrekt auf den Stack gepusht. Das Winamp Plugin kam mit dem unsauberen Shit scheinbar dennoch klar.

edit: Ich habe das Archiv oben neu hochgeladen, der Fehler sollte nun fixed sein. Das IDA beim Winamp Callback noch immer etwas anderes anzeigt ist ein purer Analyse Fail.
03/29/2011 19:54 Ende!#279
Problem gelöst. Meine Function wurde sogar called, nur scheint deine AddChatMessage Funktion es aus irgendeinem Grund nicht zu mögen aus meiner Callback aufgerufen zu werden, daher dachte ich auch, dass meine Function nie aufgerufen wurde, was ein paar Minuten OllyDBG allerdings dann aufdeckten. Wie auch immer, dann eben erstmal die gute, alte MessageBox =D

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Werde mich heute mal an eine C++ Implementierung machen und dann hier vorraussichtlich eine kleine Base für Plugins posten ;)

Edit:
So, fertig :) Also wenn damit nicht jeder Volltrottel Plugins schreiben kann, weiß ich auch nicht =D

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Für alle DLL-Funktionen Wrapper Funcs in die Singleton-Klasse CTamia (g_Tamia = CTamia::Get()) geaddet + eine Funktion zum Aufsplitten der Parameter der Callback Function in eine std::list<std::string> + eine Funktion zum Unregistrieren aller vom Plugin registrierten Chat-Commands.

Beispiel:
Code:
g_Tamia.AddChatMessage("miaaaaaaaaaau") ;
Für Genaueres einfach mal das Beispiel-Projekt anschauen ;)
03/30/2011 07:05 halloman#280
sollte es auch mit C# möglich sein?
Weiß nicht in wie fern das damit kompatibel ist.
03/30/2011 07:12 Ende!#281
Nope, C# ist managed Code und afaik ist es nicht möglich Funktionen so zu exportieren, wie der Hack es braucht.
03/30/2011 10:41 Cencil#282
Danke für deine Mühe und Zeit die du in dem Beispiel reingesteckt hast. Du hast aber hoffentlich bedacht das sich der Name des Hacks nach der Beta Phase vermutlich noch ändern wird, sowie einige Callbacks geändert werden. Die Command Callback Funktion wird z.B. um einen Parameter erweitert wo zusätzlich noch der Befehl zum Parameter übergeben wird, um mehrere Funktionen bequem in einen Callback packen zu können (z.B. .ironforge, .stormwind) :)
03/30/2011 13:36 Ende!#283
Natürlich, werde das dann immer alles entsprechend anpassen (natürlich nur, wenn du nichts dagegen hast), ist ja keine Arbeit ;) Ich hab nur halt so die Angewohntheit mir für alles erstmal ne Base zu schreiben :p
03/30/2011 13:57 Wurzelhüpfer#284
Wer so eine Arbeit und die Idee nicht respektiert ist ... keine Ahnung, aufjedenfall top Arbeit, ist man gewohnt von euch, weiter so ;)

MfG
03/30/2011 14:21 Cencil#285
Quote:
Originally Posted by Ende! View Post
Natürlich, werde das dann immer alles entsprechend anpassen (natürlich nur, wenn du nichts dagegen hast), ist ja keine Arbeit ;) Ich hab nur halt so die Angewohntheit mir für alles erstmal ne Base zu schreiben :p
Nö, habe nichts dagegen, dafür ist die Schnittstelle ja gedacht. :p