|
-
Respekt!
Da steht ja jetzt viel zur Verfügung, was ich in Gothic immer vermisst habe.
Mann, ich bin echt versucht mal wieder das MDK zu installieren...!
-
Was mir gerade so einfällt:
Wäre es nicht super, die notwendigen Adressen für alle möglichen Funktion, die jemand schon einmal für Hooks rausgesucht hat, zu sammeln und allen zur Verfügung zu stellen?
-
Großes Lob
Das sieht wirklich unheimlich nützlich aus, macht sofort Lust das Gothic MDK anzuschmeißen und zu Modden
Wenn ich endlich mal die Zeit finde, werd ich mich mal intensiv damit befassen(genauso wie mit Ikarus).
Vielen Dank für eure Arbeit!
MfG Ulukai
"In 20 Jahren wirst Du dich mehr ärgern über die Dinge, die du nicht getan hast, als über die, die du getan hast. Also wirf die Leinen und segle fort aus deinem sicheren Hafen. Fange den Wind in deinen Segeln. Forsche. Träume. Entdecke." (Mark Twain)
-
Zitat von Milky-Way
Was mir gerade so einfällt:
Wäre es nicht super, die notwendigen Adressen für alle möglichen Funktion, die jemand schon einmal für Hooks rausgesucht hat, zu sammeln und allen zur Verfügung zu stellen?
Tabellen mit Engine-Funktionen + Adressen fliegen im Forum rum (2 mal), das Problem ist momentan noch der Parameter "OldInstruction", für den IDA benutzt werden muss (Was aber auch kein Aufwand ist - wenn gewollt, kann ich dafür 'ne kleine Anleitung schreiben, geht eigentlich ganz fix). Solange nur der Anfang einer Funktion gehookt wird, kann man das scriptseitig auch so umbauen, dass der Parameter wegfällt - dafür war ich bisher bloß viel zu faul, weil's halt noch mal ein Stück Arbeit ist (Aber zu bewältigen), IDA tut's eben auch (Sind 60MB oder so... Und ich benutze es sowieso irgendwie am laufenden Band zum Debuggen).
Wer eine Adresse wissen möchte und sich IDA nicht herunterladen mag, soll lieber hier im Forum oder meinethalber auch bei mir per PN fragen, sollte es in meinen Möglichkeiten stehen, suche ich sie dann raus... Aber erstmal die Funktionen in IDA:
Zitat von Lehona
Ich habe die IDA-Funktionen übrigens mal hochgeladen, formatiert wie folgt:
name adresse länge (Alles in hex)
IDA-Funktionen
sub_xxx und unknown_libname_xxxx habe ich rausgeschnitten, wer damit was anfangen kann, hat eh gerade IDA zur Hand.
Ist übrigens nicht sauber analysiert sondern in ein paar Minuten entstanden - vielleicht hätte man noch mehr/bessere Funktionsnamen rausholen können.
Durch meine grobe Methode (Suchen & Ersetzen) zur Verkleinerung der Daten sind teilweise Adresse und Funktionsname verschmolzen, die Adressen beginnen aber immer mit 00.
-
Zitat von Lehona
Tabellen mit Engine-Funktionen + Adressen fliegen im Forum rum (2 mal),
Ich habe diese Liste und Nicos Erklärungen zum Einrichten von IDA mal bei den FAQ zu den nützlichen Threads geschrieben:
http://forum.worldofplayers.de/forum...&#post15755256
Zitat von Lehona
das Problem ist momentan noch der Parameter "OldInstruction", für den IDA benutzt werden muss (Was aber auch kein Aufwand ist - wenn gewollt, kann ich dafür 'ne kleine Anleitung schreiben, geht eigentlich ganz fix). Solange nur der Anfang einer Funktion gehookt wird, kann man das scriptseitig auch so umbauen, dass der Parameter wegfällt - dafür war ich bisher bloß viel zu faul, weil's halt noch mal ein Stück Arbeit ist (Aber zu bewältigen), IDA tut's eben auch (Sind 60MB oder so...
Wäre beides sehr nett
(IDA 5.0-Download sind sogar nur 15 MB)
Ein weiteres "typisches" Problem ist, aus der Liste noch die richtige Funktion rauszusuchen.
Zitat von Lehona
Wer eine Adresse wissen möchte und sich IDA nicht herunterladen mag, soll lieber hier im Forum oder meinethalber auch bei mir per PN fragen, sollte es in meinen Möglichkeiten stehen, suche ich sie dann raus...
Das ist natürlich schön, dann fange ich mal an. Ich würde gerne einen Hook beim Fallenlassen eines Items (durch den Spieler) haben.
In der Liste habe ich jetzt diese Einträge gefunden, die sich interessant anhören:
Code:
oCAIDrop::oCAIDrop(void)006A1EA0 D3
oCAIDrop::~oCAIDrop(void) 006A2010 11A
oCNpc::DropInventory(void) 00737350 01
ist da schon das richtige bei?
Wenn man die bekannten irgendwo sammeln würde, dann hätten alle einfachen Zugriff drauf und kämen womöglich noch auf gute Ideen
-
Zitat von Milky-Way
Dann fange ich mal an
Die Position des Cursors ist dem Spiel also eigentlich bekannt (wird aber nicht verwendet)?
Code:
func void _Cursor_Pos(var int ptr) {
CALL_PtrParam(ptr);
CALL__stdcall(8079628);
};
und ihr lest diese Position nur noch aus und schreibt an entsprechender Stelle ein X auf den Bildschirm?
An solchen Schnipseln sieht man recht deutlich dass der Code ursprünglich nicht für die Öffentlichkeit gedacht war
Der Call führt zu einer Funktion aus der WinAPI, nämlich GetCursorPos. Dort wird als Parameter ein LPPoint erwartet, netterweise ist das, wie Lehona bereits erwähnt hat, eine 8-Byte große struktur die X und Y-Koordinaten enthält.
Cursor_X und Cursor_Y legen einfach eine solche Struktur an, lassen sie befüllen und lesen dann entweder an der Addresse (X) oder an der Addresse+4 (Y) das Ergebnis aus.
Zitat von Milky-Way
In der Liste habe ich jetzt diese Einträge gefunden, die sich interessant anhören:
Code:
oCAIDrop::oCAIDrop(void)006A1EA0 D3
oCAIDrop::~oCAIDrop(void) 006A2010 11A
oCNpc::DropInventory(void) 00737350 01
ist da schon das richtige bei?
Es kann sein dass oCAIDrop auch funktioniert, aber ich glaube dass man beim Npc besser beraten ist. (Schon deshalb weil man direkt an Item und Npc herankommen kann)
Ich habe oCNpc::DoDropVob(zCVob*) gefunden. Der Name verwirrt erstmal, aber ein oCItem ist ja nichts weiter als ein erweitertes zCVob. Es lässt sich auch ohne Probleme als solches verwenden:
Code:
func void Hook_oCNpc__DoDropVob() {
const int oCNpc__DoDropVob = 7622096; //0x744DD0
HookEngine(oCNpc__DoDropVob, 6, "EVT_NPCDROPVOB");
};
func void EVT_NpcDropVob() {
var c_npc slf; slf = MEM_PtrToInst(ECX);
var c_item itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 4));
PrintS(cs4(slf.name, " ließ '", itm.name, "' fallen"));
};
Wenn ich als Held einen Apfel ablege bekomme ich folgendes auf den Bildschirm:
Ich ließ 'Apfel' fallen
Scheint also zu klappen
MfG Gottfried
-
Danke!
Um anderen noch ein paar Anregungen und Beispiele zu geben:
Damit (in Verbindung mit Sektenspinners Broadcasts) könnte man nun den Spieler Monster, NPC weglocken lassen, die sich natürlich nicht das hingelegte Stück Fleisch entgehen lassen wollen
-
Richtig, richtig hammergeil!
-
Zitat von Gottfried
Code:
const int oCNpc__DoDropVob = 7622096; //0x744DD0
HookEngine(oCNpc__DoDropVob, 6, "EVT_NPCDROPVOB");
MfG Gottfried
Die 6 ist ja die Länge in Bytes der Anweisung die an 'address' (also oCNpc__DoDropVob) zu finden ist, mindestens 5 Bytes. Kann zB. in IDA nachgesehen werden.
Kann ich diese '6' auch aus dieser Liste hier rauslesen? http://upload.worldofplayers.de/file...A_gekuerzt.txt
Oder muss ich mit IDA arbeiten?
Code:
oCNpc::DoDropVob(zCVob *) 00744DD0 2D8
Also 00744DD0 wird ja aus dem Hexadezimal ins Dezimalsystem umgewandelt zu -> 7622096
Was ist mit '2D8' ?
Mfg Umfi
-
Zitat von Umfi
Nein, das geht wohl nicht.
Zitat von Umfi
Was ist mit '2D8' ?
Das müsste die Länge der kompletten Funktion sein.
Eine interessante erleichterte Anwendung könnte es sein, statt der mind. 5 einfach die komplette Länge anzugeben. Dann würde zwar überflüssig viel kopiert, aber es könnte trotzdem gehen. Oder gibt es Probleme, wenn dann beim Zurückspringen (falls das überhaupt erreicht wird -> return) ans Ende der Funktion gesprungen wird und nichts mehr kommt?
-
Zitat von Milky-Way
Eine interessante erleichterte Anwendung könnte es sein, statt der mind. 5 einfach die komplette Länge anzugeben. Dann würde zwar überflüssig viel kopiert, aber es könnte trotzdem gehen. Oder gibt es Probleme, wenn dann beim Zurückspringen (falls das überhaupt erreicht wird -> return) ans Ende der Funktion gesprungen wird und nichts mehr kommt?
Das ist sehr gefährlich, da zB. calls relative Addressen verwenden die dabei kaputt gehen würden..
Mal schaun ob Lehona seine Methode komplett ohne Instruction noch fertigstellt
MfG Gottfried
-
Kann man damit auch Items farblich kennzeichnen? Zum Beispiel, dass Nahkampfwaffen zum Beispiel eine andere Farbe haben als die Fernkampfwaffen oder Spruchrollen die ne andere Farben als die ITems, für die man keine Verwendung eig hat.?
-
Ja, das müsste gehen, wenn du die Item-Kategorien überprüfst. Es sähe dann dem Einfärben der NPC-Namen sehr ähnlich, daran könntest du dich orientieren.
-
Angenommen man wollte aber auch innerhalb einer Item-Kategorie Farbunterschiede haben... ginge das auch? ^^
Risenmodkit
"Du sagst mir jetzt, was du weißt, oder es gibt ein paar auf's Maul, Paul!"
-
Zitat von Simon
Angenommen man wollte aber auch innerhalb einer Item-Kategorie Farbunterschiede haben... ginge das auch? ^^
Solange du irgendeine Möglichkeit hast, die Items skripttechnisch zu unterscheiden: ja. Zur Not müsstest du eben mit Hlp_IsItem jedes Item abfragen.
-
Nur um es nochmal zu verdeutlichen: Milky meinte diesen Block in der Focusnames.d:
Code:
if(Hlp_Is_oCNpc(her.focus_vob)) {
var c_npc oth; oth = MEM_PtrToInst(her.focus_vob);
var int att; att = Npc_GetPermAttitude(hero, oth);
if (att == ATT_FRIENDLY) { col = Focusnames_Color_Friendly(); }
else if(att == ATT_NEUTRAL) { col = Focusnames_Color_Neutral(); }
else if(att == ATT_ANGRY) { col = Focusnames_Color_Angry(); }
else if(att == ATT_HOSTILE) { col = Focusnames_Color_Hostile(); };
}
else if(Hlp_Is_oCItem(her.focus_vob)) {
var c_item itm; itm = MEM_PtrToInst(her.focus_vob);
// Setze col = RGBA(.., .., .., ..); um die Farbe einzustellen
}
else {
col = Focusnames_Color_Neutral();
};
Dort kannst du beliebig viele Abfragen einbauen. RGBA ist in der Interface.d dokumentiert.
MfG Gottfried
-
Apprentice
This package is very good But I've got one question how to turn off(close) an texture. I try with Print_CloseView but nothing happened.
-
Zitat von edeksumo
This package is very good But I've got one question how to turn off(close) an texture. I try with Print_CloseView but nothing happened.
Have you downloaded the newest package? Gottfried fixed a bug within Print_CloseView() (Although I don't think this bug made the function not working at all).
And show your script, please. Are you sure Print_CloseView() is called?
-
Apprentice
Code:
var int _SkillWindow;
func void Skill_Window_on (){
Print_OpenView (_SkillWindow);
Print ("Window On"); // for test
};
func void Skill_Window_off (){
Print_CloseView (_SkillWindow);
Print ("Window off"); // for test
};
func void Inicjalize_Window(){
var int Slash_key;
Slash_key = MEM_KeyState (KEY_SLASH);
_SkillWindow = Print_CreateView (1000, 1000, 7000, 7000);
Print_SetViewTexture (_SkillWindow, "kartka_menu.tga");
if (Slash_key == KEY_PRESSED)
&& (Window_on == FALSE){
Skill_Window_on ();
Window_on = true;
}
else if (Window_on == true)
&& (Slash_key == KEY_PRESSED){
Skill_Window_off();
Window_on = false;
};
};
Yes I've download the newest package. I initializes in init_global by FF_APPLY.
-
I did not read the documentation of the package but, you seem to create a new view every time your Inicjalize_Window function is called. You open some of those views, and you close some of them, but you never act on the same view. A view that is opened will never be closed. Try something like this:
Code:
func void Inicjalize_Window(){
var int Slash_key;
if (MEM_KeyState (KEY_SLASH) != KEY_PRESSED) {
return;
};
if (Window_on == FALSE){
_SkillWindow = Print_CreateView (1000, 1000, 7000, 7000);
Print_SetViewTexture (_SkillWindow, "kartka_menu.tga");
Skill_Window_on ();
Window_on = true;
} else {
Skill_Window_off();
Window_on = false;
};
};
I would expect this code to crash when opening the view, saving, restarting Gothic and pressing Shift. This has to be fixed somehow, for example via an INIT_* function.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|