|
-
Na im Skript oben wird soweit ich sehe auf beide Fälle verwiesen, aber in deinem Skript scheint ja einer der Fälle offensichtlich nicht zu greifen.
Also hast du vielleicht was vergessen in den MDS-Dateien oder so.
-
Ich habe hier mal einen Enginehook für Gothic 2:
Der Spieler kann bei einem NPC der nicht sterben kann NICHT den Finishingmove auslösen.
Die beiden Hooks gehen direkt in die Engine an die Stellen im oCAIHuman für die Spieler Steuerung.
Sie werden auch *nur* dann aufgerufen, wenn der Spieler einen am Boden liegenden "finishen" will.
Die Variable für den erfolgreichen Finishingmove ist hierbei im Register "EDI" und wird, falls es ein funktionierender Finishing-Move war, einfach auf "0" gesetzt.
Dadurch greift der Spieler einfach nur weiter ins Leere an.
Code:
func void _AlternativeUnsterblichkeit_Hook() {
const int oCAIHuman__offsetNpc = 300;
if (EDI == TRUE) {
var oCNpc her; her = _^(MEM_ReadInt(ESI + oCAIHuman__offsetNpc)); // oCAIHuman->npc
var C_NPC focus_Npc; focus_Npc = _^(her.focus_vob);
if (!Npc_CanDie(focus_Npc)) {
EDI = 0; // No Killing Blow
};
};
};
func void AlternativeUnsterblichkeit_Init() {
const int oCAIHuman__FightMelee_doFinish_G2Controls = 6912896; // 00697b80
const int oCAIHuman__FightMelee_doFinish_G1Controls = 6910260; // 00697134
HookEngineF(oCAIHuman__FightMelee_doFinish_G2Controls, 6, _AlternativeUnsterblichkeit_Hook); // G2 Steuerung
HookEngineF(oCAIHuman__FightMelee_doFinish_G1Controls, 8, _AlternativeUnsterblichkeit_Hook); // G1 Steuerung
};
Geändert von Kirides (13.11.2020 um 14:54 Uhr)
-
Sehr schöne Ergänzung!
Eine kleine Anmerkung dazu: Ich würde vorschlagen, "Magic Numbers" möglichst immer zu vermeiden. Auch wenn du im Kommentar darüber die Hex-Zahlen erwähnst, ist aus dem Code nicht mehr ohne weiteres ersichtlich, was hier gehookt wird. Kommentare verschwinden natürlich auch beim Skripte-Parsen und sind daher nicht mehr in einem Dekompilat enthalten. Aus diesen Gründen hat es sich seit Ikarus etabliert, immer den extra Schritt zu machen und diese als Konstanten mit beschreibenden Namen zu definieren. Vor allem ist das natürlich sinnvoll, wenn man Skripte im Forum teilt :)
EDIT: Danke fürs Anpassen!
Geändert von mud-freak (13.11.2020 um 15:04 Uhr)
-
Zitat von mud-freak
Sehr schöne Ergänzung!
Eine kleine Anmerkung dazu: Ich würde vorschlagen, "Magic Numbers" möglichst immer zu vermeiden. Auch wenn du im Kommentar darüber die Hex-Zahlen erwähnst, ist aus dem Code nicht mehr ohne weiteres ersichtlich, was hier gehookt wird. Kommentare verschwinden natürlich auch beim Skripte-Parsen und sind daher nicht mehr in einem Dekompilat enthalten. Aus diesen Gründen hat es sich seit Ikarus etabliert, immer den extra Schritt zu machen und diese als Konstanten mit beschreibenden Namen zu definieren. Vor allem ist das natürlich sinnvoll, wenn man Skripte im Forum teilt
gesagt - getan
Ich muss echt sagen, mit Ghidra lässt sich super sowas finden.
Geändert von Kirides (13.11.2020 um 14:57 Uhr)
-
Zitat von Kirides
Ich habe hier mal einen Enginehook für Gothic 2:
Der Spieler kann bei einem NPC der nicht sterben kann NICHT den Finishingmove auslösen.
Die beiden Hooks gehen direkt in die Engine an die Stellen im oCAIHuman für die Spieler Steuerung.
Sie werden auch *nur* dann aufgerufen, wenn der Spieler einen am Boden liegenden "finishen" will.
Die Variable für den erfolgreichen Finishingmove ist hierbei im Register "EDI" und wird, falls es ein funktionierender Finishing-Move war, einfach auf "0" gesetzt.
Dadurch greift der Spieler einfach nur weiter ins Leere an.
Code:
func void _AlternativeUnsterblichkeit_Hook() {
const int oCAIHuman__offsetNpc = 300;
if (EDI == TRUE) {
var oCNpc her; her = _^(MEM_ReadInt(ESI + oCAIHuman__offsetNpc)); // oCAIHuman->npc
var C_NPC focus_Npc; focus_Npc = _^(her.focus_vob);
if (!Npc_CanDie(focus_Npc)) {
EDI = 0; // No Killing Blow
};
};
};
func void AlternativeUnsterblichkeit_Init() {
const int oCAIHuman__FightMelee_doFinish_G2Controls = 6912896; // 00697b80
const int oCAIHuman__FightMelee_doFinish_G1Controls = 6910260; // 00697134
HookEngineF(oCAIHuman__FightMelee_doFinish_G2Controls, 6, _AlternativeUnsterblichkeit_Hook); // G2 Steuerung
HookEngineF(oCAIHuman__FightMelee_doFinish_G1Controls, 8, _AlternativeUnsterblichkeit_Hook); // G1 Steuerung
};
Mega, danke dir! Nie wieder abgehackte Todesschreie von alternativ-unsterblichen Npcs! Welch Segen =)
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|