-
[Skript] Fokus von toten NPCs mit leerem Inventar deaktiverien
EDIT: Seit v1.7 im System Pack auch für Gothic 2 enthalten. Das Skript hier erübrigt sich.
Im System Pack gibt es für Gothic 1 die nette Änderung, dass tote NPCs deren Inventar leer ist, nicht mehr vom Fokus erfasst werden. Nach einem Kampf mit einigen Goblins ist das sehr praktisch, wenn man alle looten will, aber ständig einen bereits "leeren" Goblin anklickt.
Warum dieses Feature im System Pack für Gothic 2 nicht enthalten ist, weiss ich nicht.
Ich habe das mal für Gothic 2 nachgeholt. Dafür habe ich einen extra Thread aufgemacht (anstatt es im ScriptBin- oder Ikarus/LeGo-Thread zu posten), weil es sich dabei nicht um ein "Werkzeug", sondern um ein fertiges Skript handelt, das man nur noch aus der Init_Global initialisieren muss: fertig.
Da ich mir vorstellen kann, dass dieser (kleine) Eingriff in ähnlicher Form in einer zukünftigen Version vom System Pack landen könnte, habe ich dahingehend einen Check eingebaut. Damit sollten Mods weiterhin kompatibel bleiben, sollte das System Pack nachrüsten.
Code:
/*
* Hide focus of dead NPCs with empty inventory
*
* Compatible with Gothic 2 only (already implemented in the System Pack for Gothic 1)
* Requires Ikarus, LeGo (HookEngine)
* Initialize with DisableFocusOfDeadNPCsWithEmptyInventory() in Init_Global
*/
func void DisableFocusOfDeadNPCsWithEmptyInventory() {
const int once = 0;
if (once) {
return;
};
once = 1;
// Safety check in case later versions of the System Pack add this functionality
const int oCNpc__CollectFocusVob_deadNpc = 7552709; //0x733EC5
const int expected[6] = { 28870027, -1065025536, 13995791, -2135228416, -385875968, 203 };
if (!MEM_CompareBytes(oCNpc__CollectFocusVob_deadNpc-14, _@(expected), 4*6)) {
MEM_Warn("Opcode integrity-check failed. This feature must have been already implemented by someone else.");
return;
};
// Overwrite opcode with hook
MemoryProtectionOverride(oCNpc__CollectFocusVob_deadNpc, 5);
MEM_WriteInt(oCNpc__CollectFocusVob_deadNpc, -1869574000); // 4 x nop: 0x90909090
MEM_WriteByte(oCNpc__CollectFocusVob_deadNpc+4, ASMINT_OP_nop);
HookEngineF(oCNpc__CollectFocusVob_deadNpc, 5, _DisableFocusOfDeadNPCsWithEmptyInventory);
};
func void _DisableFocusOfDeadNPCsWithEmptyInventory() {
// Get dead focus NPC
var oCNpc npc; npc = _^(EBP);
var int invPtr; invPtr = _@(npc.inventory2_vtbl);
// Check if inventory is empty
const int oCNpcInventory__IsEmpty = 7393696; //0x70D1A0
const int one = 1;
const int call = 0;
if (CALL_Begin(call)) {
CALL_IntParam(_@(one)); // Ignore equipped (ITEM_ACTIVE)
CALL_IntParam(_@(one)); // Ignore armor (ITEM_KAT_ARMOR)
CALL__thiscall(_@(invPtr), oCNpcInventory__IsEmpty);
call = CALL_End();
};
// Change vob type for different focus priority
if (CALL_RetValAsInt()) {
// Inventory empty: Set invalid zTVobType -> focus priority = -1 (ignored)
EBX = -1; // zTVobType_none
} else {
// Inventory not empty: Set mob zTVobType -> low focus priority (this is the "original" code)
EBX = 128; // zTVobType_mob
};
};
Geändert von mud-freak (27.01.2018 um 17:06 Uhr)
-
Klasse, das probiere ich gleich mal aus! Ist wirklich ziemlich nervig sonst, aber darüber macht man sich trotzdem eigentlich kaum Gedanken. Aber jetzt, wo du es schreibst...
Vielen Dank für die Arbeit!
Edit: Funktioniert nach erstem 5-minütigen Test einwandfrei, vielen Dank!
Geändert von gladi1994 (26.01.2018 um 20:35 Uhr)
-
Danke fürs Testen. Dieses Anklicken von Leichen bis man alle gelootet hat kann schon echt nerven. Das war mein Highlight vom System Pack in Gothic 1.
-
Seltsam ist, dass im Changelog zur v1.7 folgendes steht:
Overall changes for all games:
— Focus can be disabled for dead NPCs with empty inventory;
Und "all games" includes gothic 1 UND 2...
Naja... Super Arbeit jedenfalls, mud-freak! Dankeschön!!
-
Kann ich bestätigen.
Ich nutze das SP_v1.7 und bei mir ist der Fokus von geplünderten Npc's deaktiviert.(Gothic2: ingame getestet).
Ist aber trotzdem eine gute Sache, da deine Lösung vermutlich auch ohne SP funzt, für die paar Leute, die es nicht nutzen.
MfG
-
Ja, das ist ungünstig. Ärgert mich ein bisschen, dass diese Änderung nur in diesem Post, aber nicht im Einleitungspost mit in der Übersicht steht. Der Ini-Eintrag "HideFocus" war ohne weitere Beschreibung nicht sehr eindeutig.
Naja, dann brauchts dieses Skript nicht wirklich. Hängt wirklich letztlich vom Spieler ab, was er bevorzugt.
Danke euch für den Hinweis!
Geändert von mud-freak (27.01.2018 um 17:03 Uhr)
-
Zitat von mud-freak
Ja, das ist ungünstig. Ärgert mich ein bisschen, dass diese Änderung nur in diesem Post, aber nicht im Einleitungspost mit in der Übersicht steht. Der Ini-Eintrag "HideFocus" war ohne weitere Beschreibung nicht sehr eindeutig.
Naja, dann brauchts dieses Skript nicht wirklich. Hängt wirklich letztlich vom Spieler ab, was er bevorzugt.
Danke euch für den Hinweis!
Hab den Thread leider erst heute gesehen.
Ich würde mich an deiner Stelle nicht darüber ärgern.
Du leistest hier tolle Arbeit für die Community.
MfG
-
-
Zitat von mud-freak
Ja, das ist ungünstig. Ärgert mich ein bisschen, dass diese Änderung nur in diesem Post, aber nicht im Einleitungspost mit in der Übersicht steht.
Ja, stimmt, ist mir auch aufgefallen!
Zitat von mud-freak
Naja, dann brauchts dieses Skript nicht wirklich. Hängt wirklich letztlich vom Spieler ab, was er bevorzugt.
Danke euch für den Hinweis!
Kannst du diese Übersicht, die du im SystemPack-Thread gelöscht hast, hier trotzdem noch mal posten? Fand' die verdammt gut und hilfreich!
Zitat von TheBigLeBRUCEky
Kann ich bestätigen.
Ich nutze das SP_v1.7 und bei mir ist der Fokus von geplünderten Npc's deaktiviert.(Gothic2: ingame getestet).
Ist aber trotzdem eine gute Sache, da deine Lösung vermutlich auch ohne SP funzt, für die paar Leute, die es nicht nutzen.
MfG
Was hat es denn für Vorteile, dass SystemPack nicht zu nutzen? Führt das arg krasse Änderungen zum Original-Gothic 1 ein / Vanilla? Wenn man original spielen will, sollte man dann die Finger vom SystemPack lassen? Oder zumindest von Version 1.7? Bis v 1.6 Rev. 2 gab es ja nicht ganz so große Eingriffe, soweit ich das erkennen kann. Zumindest gibt es beispielsweise noch den "hide autofocus" nicht und keine g2-Steuerung mit Maus...
Zitat von TheBigLeBRUCEky
Hab den Thread leider erst heute gesehen.
Ich würde mich an deiner Stelle nicht darüber ärgern.
Du leistest hier tolle Arbeit für die Community.
MfG
Dem kann ich mich nur anschließen!
Zitat von gladi1994
Sehe ich genauso! Und ich bin einer dieser Spieler, die ohne SystemPack spielen, daher freue ich mich sehr darüber! Also hast du schon mal mindestens einer Person geholfen.
Warum tust du das? Was sind eine Gründe dafür, gladi1994?
-
Zitat von Aryn
Was hat es denn für Vorteile, dass SystemPack nicht zu nutzen? Führt das arg krasse Änderungen zum Original-Gothic 1 ein / Vanilla? Wenn man original spielen will, sollte man dann die Finger vom SystemPack lassen? Oder zumindest von Version 1.7? Bis v 1.6 Rev. 2 gab es ja nicht ganz so große Eingriffe, soweit ich das erkennen kann. Zumindest gibt es beispielsweise noch den "hide autofocus" nicht und keine g2-Steuerung mit Maus...
Weshalb jemand das Systempack nicht nutzt, weiß ich nicht.
Ich weiß nur, dass es Leute gibt, die es nicht nutzen.
Deshalb habe ich es mal angemerkt, damit Mud-Freak sieht, dass seine Arbeit trotzdem nicht umsonst war.
Bestimmt kann dir jemand, der das SP nicht nutzt, erklären, warum er das tut.
MfG
-
Zitat von TheBigLeBRUCEky
Weshalb jemand das Systempack nicht nutzt, weiß ich nicht.
Ich weiß nur, dass es Leute gibt, die es nicht nutzen.
Deshalb habe ich es mal angemerkt, damit Mud-Freak sieht, dass seine Arbeit trotzdem nicht umsonst war.
Bestimmt kann dir jemand, der das SP nicht nutzt, erklären, warum er das tut.
MfG
Ja, das hab ich schon verstanden, warum du das gemacht hast. Sehe ich auch so!
Ja, da bin ich gespannt. Vllt ändert es G1-Vanilla wirklich zu sehr?!??
Ich hab den Code noch. Mud-Freak, wenn du einverstanden bist, hänge ich ihn noch mal an:
Code:
---------
oCNpc::CollectFocusVob:
···
0x733EB7 mov eax, [ebp+0x1B8]
0x733EBD test eax, eax
0x733EBF jg to 0x733F9A
0x733EC5 mov ebx, 0x80 jmp to 0xXXXXXX ─────────┐
0x733ECA jmp to 0x733F9A <─────┐ └─> 0xXXXXXX:
··· │
│ push 1 // Ignore equipped (ITEM_ACTIVE)
│ push 1 // Ignore armor (ITEM_KAT_ARMOR)
│ lea ecx, [esi+0x668] // oCNpc->oCNpcInventory
│ call oCNpcInventory::IsEmpty // 0x70D1A0
│ test eax, eax // If inventory empty
│ ┌── jnz 0xB
│ │ mov ebx, 0xFFFFFFFF // Set invalid zTVobType (causes focus priority of -1 == never)
├────┼── jmp to 0x733ECA
│ └─> mov ebx, 0x80 // Else: as above, original code from 0x733EC5
└─────── jmp to 0x733ECA
-
Zitat von Aryn
Zitat von gladi1994
Sehe ich genauso! Und ich bin einer dieser Spieler, die ohne SystemPack spielen, daher freue ich mich sehr darüber! Also hast du schon mal mindestens einer Person geholfen.
Warum tust du das? Was sind eine Gründe dafür, gladi1994?
Da du hier gefragt hast, antworte ich mal hier, obwohl es eigentlich eher OT ist, hoffe das ist nicht schlimm!
Ich kann dir gar nicht so genau sagen, wieso ich das SystemPack nicht nutze. Meine Einstellung dazu (generell zu Mods, egal in welchem Spiel) ist schon immer gewesen, so wenig wie möglich (zumindest von Mods, die keine inhaltlichen Änderungen vornehmen, die man nicht haben möchte oder braucht), sodass das Spiel aber spielbar ist, was Bugs usw. angeht. Und das ist ja auch ohne das SystemPack der Fall. Denn je mehr Mods (oder Veränderungen am Spiel), desto fehleranfälliger das Spiel! (siehe DirectX11-Mod. Die hab ich selbst nicht gespielt, aber das Let's Play von RBTV gesehen, und diese Grafikbugs finde ich wirklich schlimm! Obwohl der Rest davon natürlich Hammer ist, aber dann lieber ganz ohne die Mod und dafür fehlerfrei!)
Ich hab mir mal die ganzen Changelogs durchgelesen und war mir auch immer unsicher, wie die Kompatibilität mit anderen Mods (also auch meiner) aussieht und wollte nicht ewig testen, denn das Spiel läuft ja auch ohne SystemPack super.
Meine Gegenfrage, warum sollte ich es denn unbedingt benutzen? Mir war nicht klar, dass es wirklich kaum noch Leute gibt, die es nicht nutzen.
Zitat von TheBigLeBRUCEky
Weshalb jemand das Systempack nicht nutzt, weiß ich nicht.
Ich weiß nur, dass es Leute gibt, die es nicht nutzen.
Deshalb habe ich es mal angemerkt, damit Mud-Freak sieht, dass seine Arbeit trotzdem nicht umsonst war.
Bestimmt kann dir jemand, der das SP nicht nutzt, erklären, warum er das tut.
Aus obigem Grund!
-
Zitat von Aryn
Ich hab den Code noch. Mud-Freak, wenn du einverstanden bist, hänge ich ihn noch mal an:
Code:
---------
oCNpc::CollectFocusVob:
···
0x733EB7 mov eax, [ebp+0x1B8]
0x733EBD test eax, eax
0x733EBF jg to 0x733F9A
0x733EC5 mov ebx, 0x80 jmp to 0xXXXXXX ─────────┐
0x733ECA jmp to 0x733F9A <─────┐ └─> 0xXXXXXX:
··· │
│ push 1 // Ignore equipped (ITEM_ACTIVE)
│ push 1 // Ignore armor (ITEM_KAT_ARMOR)
│ lea ecx, [esi+0x668] // oCNpc->oCNpcInventory
│ call oCNpcInventory::IsEmpty // 0x70D1A0
│ test eax, eax // If inventory empty
│ ┌── jnz 0xB
│ │ mov ebx, 0xFFFFFFFF // Set invalid zTVobType (causes focus priority of -1 == never)
├────┼── jmp to 0x733ECA
│ └─> mov ebx, 0x80 // Else: as above, original code from 0x733EC5
└─────── jmp to 0x733ECA
Das war übrigens nur ein Vorschlag, wie man das einbauen könnte. Das Skript oben macht das nur in etwa so (letztlich sieht das ganze aber anders aus).
Das System Pack macht das etwas anders. Der Vollständigkeit halber hier:
Code:
oCNpc::CollectFocusVob:
···
0x733FA2 8B 0D 38 07 AB 00 mov ecx, oCNpcFocus * oCNpcFocus::focus
┌───── 0x733FA2 E9 64 A3 F3 FF jmp to 0x66E30B // Check with oCNpcFocus::IsValid is performed
│ 0x733FA7 90 nop
┌───────┼────> 0x733FA8 ···
│ │ ···
│ ┌────┼────> 0x734069 ···
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ └────> 0x66E30B 81 3F 24 D7 83 00 ? (cmp?)
│ │ ┌── 0x66E311 74 0B jz to 0x66E31E
│ │ ┌─┼─> 0x66E313 8B 0D 38 07 AB 00 mov ecx, oCNpcFocus * oCNpcFocus::focus
└──┼─────┼─┼── 0x66E319 E9 8A 5C 0C 00 jmp to 0x733FA8
│ │ └─> 0x66E31E 83 BF B8 01 00 00 00 cmp dword ptr [edi+0x1B8], 0 // if (oCNpc->attribute[0] == 0)
│ ├──── 0x66E325 75 EC jnz to 0x66E313 // False: return default
│ │ 0x66E327 8D 8F 68 06 00 00 lea ecx, [edi+0x668] // oCNpc->oCNpcInventory
│ │ 0x66E32D 6A 00 push 0 // Do not ignore equipped (ITEM_ACTIVE)
│ │ 0x66E32F 6A 01 push 1 // Ignore armor (ITEM_KAT_ARMOR)
│ │ 0x66E331 E8 6A EE 09 00 call oCNpcInventory::IsEmpty // 0x70D1A0
│ │ 0x66E336 85 C0 test eax, eax // If inventory empty
│ └──── 0x66E338 74 D9 jz to 0x66E313 // False: return default
└────────── 0x66E33A E9 2A 5D 0C 00 jmp to 0x734069 // Else: Jump back into function beyond
Was das System Pack alles macht, kann man in der *.patch-Datei in ./Data/SystemPack.vdf nachsehen und sich dann wie ich das hier gemacht habe zusammenreimen.
Dass das so gut, leserlich und modifizierbar ausgelagert ist, war mir bisher nicht bewusst und erlaubt ziemlich interessante Sachen. So könnte man z.B. mit einer eigenen *.patch-Datei Opcode in die Gothic.exe injizieren bevor Ikaus geladen wird. Das könnte hilfreich sein, um dort Dinge schon "vor" Spielstart zu ändern oder auch um einfach Ikarus direkt zu initialisieren sobald die Gothic.dat geladen ist (sprich vor der Erstellung des Menüs usw.).
Leider scheint das System Pack nur eine *.patch-Dateien zu laden und bevorzugt immer die aus der ./Data/SystemPack.vdf, sodass man sie nicht aus einer *.mod-Datei überlagern kann.
-
Zitat von gladi1994
Da du hier gefragt hast, antworte ich mal hier, obwohl es eigentlich eher OT ist, hoffe das ist nicht schlimm!
Ich kann dir gar nicht so genau sagen, wieso ich das SystemPack nicht nutze. Meine Einstellung dazu (generell zu Mods, egal in welchem Spiel) ist schon immer gewesen, so wenig wie möglich (zumindest von Mods, die keine inhaltlichen Änderungen vornehmen, die man nicht haben möchte oder braucht), sodass das Spiel aber spielbar ist, was Bugs usw. angeht. Und das ist ja auch ohne das SystemPack der Fall. Denn je mehr Mods (oder Veränderungen am Spiel), desto fehleranfälliger das Spiel! (siehe DirectX11-Mod. Die hab ich selbst nicht gespielt, aber das Let's Play von RBTV gesehen, und diese Grafikbugs finde ich wirklich schlimm! Obwohl der Rest davon natürlich Hammer ist, aber dann lieber ganz ohne die Mod und dafür fehlerfrei!)
Ich hab mir mal die ganzen Changelogs durchgelesen und war mir auch immer unsicher, wie die Kompatibilität mit anderen Mods (also auch meiner) aussieht und wollte nicht ewig testen, denn das Spiel läuft ja auch ohne SystemPack super.
Meine Gegenfrage, warum sollte ich es denn unbedingt benutzen? Mir war nicht klar, dass es wirklich kaum noch Leute gibt, die es nicht nutzen.
Aus obigem Grund!
@ gladi1994:
Trotz der Gefahr, dass dies vllt ein bisschen offtopic ist :
Soweit ich weiß, kann man G1 ohne das SystemPack nicht in aktuellen Auflösungen spielen. Mein Monitor hat eine native Auflösung von 1920 * 1080. Diese Auflösung hat bei mir nicht ohne das SP funktioniert. Ebenso hatte die die bekannten Probleme mit Fullscreen....
Ob ich Probleme mit dem FPS-Limiter hatte, weiß ich heute leider nicht mehr, da könnte aber auch noch was gewesen sein. Nebenbei hat das SP noch den Soundpatch. SOnst brauche ich eigentlich keine Änderungen. Ich sehe es wie du, gladi1994, so WENIG Änderungen wie nur möglich. Mir erschiend das SP nur sicherer, als irgendwelche "Gothic_fullscreen_border.zip"s oder "Soundpatch.zip"s...
In welcher Auflösung spielst du dann, gladi1994? Immer noch in 800 * 600?
Was würdest du mir dann raten, wenn ich nur das Problem, mit der Auflösung in den Griff kriegen möchte? SP wieder deinstallieren und dies dann anders managen? Ich spiele unter Win 8.1.
Mir war damals nicht bewusst, dass das SP doch so viele Änderungen einführt. Damals hatte ich es nur als Hilfe verstanden, es unter "moderneren" Betriebssystemen fehlerfrei zum Laufen zu bringen. Daher bin ich auch noch bei einer alten SP v1.6 geblieben,
Version 1.7 ändert mir dann doch deutlich zu viel...
Was ist dein Rat?
Dankeschön!
Grüße
aRyn
-
Zitat von Aryn
[...]
Ich denke, gladi hat sich mit dem SystemPack nicht groß auseinandergesetzt. Es ist wie du beschreibst. Es ändert fast nichts, was du als Spieler groß mit bekommen würdest und es fügt sicher keine Bugs hinzu, behebt aber welche. Es läuft besser mit SystemPack und Änderungen sind optional in der .ini einstellbar.
-
-
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|