Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 4 von 9 « Erste 12345678 ... Letzte »
Ergebnis 61 bis 80 von 174
  1. Beiträge anzeigen #61 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    @Milky:
    Meine Meinung: In den früheren Testversionen gab es nicht Abstürze in solchem Ausmaß. Deswegen kann es durchaus möglich sein, dass es an der HookEngine lag/liegt.
    Um sicher zu gehen, würde ich die Hooks HOOK_AI_Drop, Hook_EV_DrawWeapon, CloseDiary und ColorItemName erst einmal deaktivieren, da sie nicht grundlegend wichtig für die Mod sind. Ein paar Features funktionieren dann zwar nicht, aber das ist nicht wichtig um die Abstürze zu testen.

    REMOVE_SHARP ist wichtig, weil der in der Story (Sumpftempel) gebraucht wird. Das dürfte aber mit ein paar Anpassungen in den Dialogen trotzdem relativ leicht zu deaktivieren sein.

  2. Beiträge anzeigen #62 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Neconspictor Beitrag anzeigen
    Es stürzt nicht bei hooktest2() ab sondern an anderer Stelle. Weiß nicht genau wo, ich habe nur alles auskommentiert, was mit Hooks zu tun hatte. [..] An sich ist der Absturz aber nicht ganz unlogisch, da ja der Stack geleert wird.
    Ja, da hast du wohl recht. In meiner leeren Testwelt wird Hlp_GetInstanceID wohl einfach nicht (so häufig) aus den Skripten aufgerufen, deshalb hatte ich keine Probleme.

    Zitat Zitat von Lehona Beitrag anzeigen
    Zur Sicherheit könnte man den kompletten Datenstack sichern? Müsste man aber wohl in Assembly machen. Solange das nicht der Auslöser ist, also den Aufwand erstmal nicht wert (auch performancetechnisch). Könnte maner aber als zusätzliche Funktion in HookEngine anbieten.
    Ich denke auch, dass wir erst einmal den Auslöser festmachen sollten. So groß sollte der Aufwandt aber nicht sein. Ich habe das gerade mal grob zusammen geschrieben (ich habe gerade kein IDA hier, deshalb stimmen die Offsets und Adressen nicht ganz). Was Performance angeht, werden halt vor und nach jedem Daedalus-Aufruf 8000 Bytes hin und her kopiert. Ich lasse das mal hier, falls wir darauf noch einmal zurückkommen wollen.
    Spoiler:(zum lesen bitte Text markieren)
    Code:
    ; Secure data stack in zCParser::CallFunc before calling the Daedalus function
    ;
    ; TODO
    ; - Find second address to hook "XY", plus the length "Z", where the stack offset is the same as in the first hook
    ; - Replace "XXX XXX, XXX" with that very instruction mentioned above
    ; - Find the stack offset "AAA" (or register) that holds the data stack during the second hook
    ; - Allocate memory for injecting the code and adjust the addresses "HERE1" and "HERE2" in the jumps
    ; - Decrease all stack offsets by 4 in zCParser::CallFunc in-between the two hooks
    
    
    ; From 0x792A76 jump to:
    push   0x2004                        ; sizeof(zCPar_DataStack)
    call   operator new(uint)
    push   eax                           ; Secure pointer to the data stack backup on the stack
    
    push   ecx                           ; Backup registers
    push   edi
    push   esi
    
    mov    edi, eax                      ; Setup src, dst and counter for movs
    mov    esi, ecx
    mov    ecx, 0x801                    ; sizeof(zCPar_DataStack)/4
    rep
    movs
    
    pop    esi                           ; Restore registers
    pop    edi
    pop    ecx
    
    call   zCPar_DataStack::Clear(void)  ; Rewrite what has been overwritten with jump
    jmp    0x792A7B - HERE1 - 1          ; Jump back where left off
    
    
    
    ; Continue with CallFunc...
    ; Decrease all following stack offsets by 4
    
    
    
    ; After function call at address XY jump to
    push   ecx                           ; Backup registers
    push   edi
    push   esi
    
    mov    edi, [esp+AAA]                ; Setup src, dst and counter for movs
    mov    esi, [esp+0xC]                ; AAA is the offset to the data stack
    mov    ecx, 0x801                    ; sizeof(zCPar_DataStack)/4
    rep
    movs
    
    mov    ecx, esi                      ; Free memory of data stack backup
    call   operator free(uint)
    
    pop    esi                           ; Restore registers
    pop    edi
    pop    ecx
    
    add    esp, 0x4                      ; Remove the data stack backup from stack (given it is on top!)
    
    XXX    XXX, XXX                      ; Rewrite what has been overwritten with jump
    jmp    XY+Z - HERE2 - 1              ; Jump back where left off (XY+Z)


    Vorher wären "ein paar Tests" mit der Änderung in HookEngine.d vielleicht gar nicht schlecht, bis jemand eine neue Idee hat, wo das Problem liegen könnte.

  3. Beiträge anzeigen #63 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.246
     
    Milky-Way ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Vorher wären "ein paar Tests" mit der Änderung in HookEngine.d vielleicht gar nicht schlecht, bis jemand eine neue Idee hat, wo das Problem liegen könnte.
    Ich habe mal eine aktualisierte Version an unseren Tester gegeben.

  4. Beiträge anzeigen #64 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.246
     
    Milky-Way ist offline
    Es gab bereits einen Absturz beim Laden eines Spielstands:
    Code:
    //======================UNHANDLED EXCEPTION======================
    //======================UNHANDLED EXCEPTION======================
    Gothic2.exe caused a  in module KERNELBASE.dll at 0023:7532C54F, RaiseException()+88 byte(s)
    EAX=0135EB84  EBX=0135EC6C  ECX=00000003  EDX=00000000  ESI=00843DB0
    EDI=0135EC14  EBP=0135EBD4  ESP=0135EB84  EIP=7532C54F  FLG=00200216
    CS=0023   DS=002B  SS=002B  ES=002B   FS=0053  GS=002B
    //=====================  INFOS =========================
    Gothic II - 2.6 (fix), Parser Version: 50
    User:  Chris,  CPUType: 586,  Mem: 0 MB total, 0 MB free
    //====================== CALLSTACK ========================
    0023:7532C54F (0xE06D7363 0x00000001 0x00000003 0x0135EC08) KERNELBASE.dll, RaiseException()+88 byte(s)
    0023:007D44BF (0x0135EC34 0x00889A88 0x35241A2B 0x00AB40C0) Gothic2.exe, _CxxThrowException()+52 byte(s)
    0023:007D0B51 (0x7720E1B2 0x00000021 0x0135EC24 0x0135E5DC) Gothic2.exe, bad_cast::bad_cast
    0023:7720E454 (0x29AB1F40 0x00000000 0x0088DFE0 0x008913B0) ntdll.dll, RtlInitUnicodeString()+356 byte(s)
    0023:006DB111 (0x0135ED6C 0x00000001 0x006E7B60 0x00000000) Gothic2.exe, zSTRING::Init()+5521 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGameExternal.cpp, line 281
    0023:006E7C11 (0x00AB4108 0x00000000 0x00AB40C0 0x001D2405) Gothic2.exe, oCMsgState::operator delete()+23393 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGameExternal.cpp, line 3477+118 byte(s)
    0023:00792568 (0x006E7B60 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+3080 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1433
    0023:00792504 (0x001D062A 0x00AB40C0 0x1C280E9C 0x00008577) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1415
    0023:00792504 (0x001D2235 0x8094C1D0 0x8094BD90 0x0072F161) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1415
    0023:00792FF7 (0x001EAC2D 0x8094BD90 0x00008577 0x228954A8) Gothic2.exe, zCParser::CreateInstance()+87 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1586+12 byte(s)
    0023:0072F161 (0x00008577 0x00000001 0x00018CB9 0x228954A8) Gothic2.exe, oCNpc::InitByScript()+753 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oNpc.cpp, line 1642
    0023:007472D4 (0x228954A8 0x0135F1BB 0x228954A8 0x0000002F) Gothic2.exe, oCNpc::Unarchive()+164 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oNpc.cpp, line 9440
    0023:00526DC5 (0x00000000 0x00000000 0x0082E6F0 0x1B799758) Gothic2.exe, zCArchiverGeneric::ReadObject()+2149 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zArchiverGeneric.cpp, line 1274
    0023:0077F9B3 (0x228954A8 0x0082E6F0 0x228954A8 0x1B799758) Gothic2.exe, oCWorld::Unarchive()+339 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oWorld.cpp, line 390
    0023:00526DC5 (0x1B799758 0x006271F0 0x00000001 0x0135F728) Gothic2.exe, zCArchiverGeneric::ReadObject()+2149 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zArchiverGeneric.cpp, line 1274
    0023:00526DFE (0x00000001 0x0135F728 0x1B799758 0x00000000) Gothic2.exe, zCArchiverGeneric::ReadObject()+14 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zArchiverGeneric.cpp, line 1282
    0023:006271F0 (0x0135F4F4 0x00000001 0x10C22F48 0x00000000) Gothic2.exe, zCWorld::LoadWorld()+288 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zWorld.cpp, line 2647
    0023:0077FDDD (0x0135F724 0x00000001 0x0135F964 0x10C22F48) Gothic2.exe, oCWorld::LoadWorld()+669 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oWorld.cpp, line 447+13 byte(s)
    0023:006CA4CD (0x0135F988 0x0082E6F0 0x7A78F5F0 0x10C22F48) Gothic2.exe, oCGame::LoadWorldDyn()+589 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 3182
    0023:006C9435 (0xFFFFFFFF 0x0135F960 0x0082E6F0 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+901 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2932
    0023:006C6BEB (0xFFFFFFFF 0x00000001 0x0135FCA8 0x00000001) Gothic2.exe, oCGame::LoadSavegame()+1051 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2237
    0023:0042A282 (0x00000001 0x00000001 0x0135FCA8 0x00000001) Gothic2.exe, CGameManager::Read_Savegame()+578 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1557
    0023:00429D02 (0x00000000 0x00000001 0x0135FCA8 0x0159ACB8) Gothic2.exe, CGameManager::Menu()+2610 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1492
    0023:0042AE90 (0x00000001 0x0082E6F0 0x00000000 0x00425E3F) Gothic2.exe, CGameManager::HandleEvent()+320 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1725
    0023:007A55EE (0x00400000 0x0153368A 0x0135FECC 0xFFFDE000) Gothic2.exe, zCInputCallback::GetInput()+46 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zView.cpp, line 210+20 byte(s)
    0023:00425E3F (0x0082F0EC 0x00000000 0x00070240 0x10C22F48) Gothic2.exe, CGameManager::Run()+1551 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 767
    0023:0078188B (0x0000002C 0x0003D5C2 0x00000002 0x00000000) Gothic2.exe, MainProg()+75 byte(s), P:\dev\g2addon\release\Gothic\_ulf\Phoenix.cpp, line 111
    0023:00503270 (0x00400000 0x00000000 0x0153368A 0x0000000A) Gothic2.exe, HandledWinMain()+928 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1169
    0023:00502DFD (0x0135FED0 0x00000000 0x0153368A 0x0000000A) Gothic2.exe, WinMain()+141 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1054+17 byte(s)
    0023:007D43F8 (0x00000004 0x0000FFFF 0x000000B8 0x00000000) Gothic2.exe, WinMainCRTStartup()+224 byte(s)
    //=====================================================

  5. Beiträge anzeigen #65 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Es gab bereits einen Absturz beim Laden eines Spielstands: [...]
    Der Stacktrace enthält hier Fehlinformationen. Zwei der durchlaufenen Funktionen haben keinen "Namen" und es werden deshalb die nächst-vorherigen Funktionen aufgeführt. oCMsgState::operator delete()+23393 ist in echt in - nennen wir es - Npc_CreateInvItems und zSTRING::Init()+5521 befindet sich in - nennen wir es - zCParser::PopNpc.

    Das Problem liegt in einem Aufruf von CreateInvItems, der (über zwei Ecken) aus einer NPC-Instanz aufgerufen wird. So kann man sich das Vorstellen:
    Code:
    instance XXXXX(Npc_default)
        |
        V
    Daedalus function
        |
        V
    Daedalus function
        |
        V
    CreateInvItems(INVALID, X, X);
    Das erste Argument von CreateInvItems ist nicht etwa eine leere, sondern eine ungültige, NPC-Instanz.
    Eine leere Instanz (z.B. hero aus PC_Hero) würde nur folgende Warnung erzeugen:
    Code:
    SCRIPT: Npc_CreateInvItems(): illegal param: "HERO" is NULL. .... <oGameExternal.cpp,#252>
    Ähnlich, wenn wir stattdessen ein Item oder eine andere Instanz übergeben.

    Hier scheitert der Cast zu einem NPC so grundlegend, weil die übergebene Instanz gar keine Instanz ist. Um die gleiche AV mit exakt dem gleichen Stacktrace zu reproduzieren, muss man nur triggerMe() aus einer NPC-Instanz ausführen:
    Code:
    func void triggerMe_sub() {
        var C_Npc a; a = _^(1);
        CreateInvItems(a, ItMi_Gold, 100);
    };
    func void triggerMe() {
        triggerMe_sub();
    };
    
    
    // Aus Instanz aufrufen
    instance XXXX(Npc_default) {
        // ...
        triggerMe();
    };
    Hier ist das übergebene Symbol tatsächlich eine NPC-Instanz (der Parser ist zufrieden), die aber gar keine ist (der Cast in zCParser::PopNpc scheitert).

    Wonach ihr suchen müsst, ist also eine NPC-Instanz aus der eine Daedalusfunktion aufgerufen wird, die eine zweite Daedalusfunktion aufruft, aus der CreateInvItems aufgerufen wird. Dort solltet ihr das erste Argument überprüfen.

    Eventuell könnte man die External hooken und sich den NPC ausgeben lassen. Der letzt-ausgegebene vor dem Crash ist dann der Übeltäter.
    Geändert von mud-freak (11.09.2018 um 11:00 Uhr)

  6. Beiträge anzeigen #66 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    Interessant, was du da rausgelesen hast

    Die External würde ich allerdings nicht hooken. Das Spiel würde eher abstürzen, weil der Hook den Stack leeren würde. Damit würden wir keine bracuhbaren Informationen bekommen.

  7. Beiträge anzeigen #67 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.246
     
    Milky-Way ist offline
    Danke!

    Hat jemand eine einfach-umsetzbare Idee, alle in Frage kommenden Skripte aufzulisten?

    Worauf würde es denn hinweisen, wenn dieser Absturz nicht reproduzierbar ist? Sprich, gleicher Spielstand kann sonst geladen werden? Wie würden wir dann weiter nach dem Fehler suchen?
    (Der Absturz trat beim Laden eines Spielstands auf. Der Npc war also vorher schon in der Welt, als gespeichert wurde, wurde also zumindest einmal ohne Absturz initialisiert.)

    Theoretisch zutreffen würde die Beschreibung auf unsere Funktion, Ambiente-Inventare zu verteilen. Da wird zunächst aus der NPC-Instanz heraus aufgerufen:
    Code:
    B_CreateAmbientInv (self);
    Diese Funktion sieht dann so aus:
    Code:
    func void B_CreateAmbientInv(var C_Npc slf)
    {
    	var int zufall;
    	zufall = Hlp_Random (7);
    	if (slf.guild == GIL_VLK)
    	{
    		B_CreateAmbientInv_VLK (zufall);
    	}
    	else if (slf.guild == GIL_BAU)
    	{
    		B_CreateAmbientInv_BAU (zufall);
    	}
    //....
    	else
    	{
    		B_CreateAmbientInv_BAU (zufall);
    	};
    };
    und die dort aufgerufenen Funktionen machen alle mehr oder weniger dasselbe:
    Code:
    func void B_CreateAmbientInv_BAU(var int InventorySet)
    {
    	if (InventorySet == 1)
    	{
    		CreateInvItems (self, ItPl_Forestberry, 1);
    		CreateInvItems (self, ItFo_Water, 1);
    		CreateInvItems (self, ItFo_Milk, 1);
    		CreateInvItems (self, ItMi_Gold, 12);
    	}
    	else if (InventorySet == 2)
    	{
    		CreateInvItems (self, ItPl_Forestberry, 1);
    		CreateInvItems (self, ItPl_Planeberry, 1);
    		CreateInvItems (self, ItFo_Apple, 1);
    		CreateInvItems (self, ItFo_Cheese, 1);
    		CreateInvItems (self, ItMi_Gold, 10);
    	}
    	else if (InventorySet == 3)
    	{
    		CreateInvItems (self, ItFo_Apple, 1);
    		CreateInvItems (self, ItFo_Cheese, 1);
    		CreateInvItems (self, ItPo_Health_01, 1);
    		CreateInvItems (self, ItMi_Gold, 17);
    	}
    	else if (InventorySet == 4)
    	{
    		CreateInvItems (self, ItPl_Blueplant, 1);
    		CreateInvItems (self, ItFoMuttonRaw, 1);
    		CreateInvItems (self, ItFo_Bread, 1);
    		CreateInvItems (self, ItMi_Gold, 14);
    	}
    	else if (InventorySet == 5)
    	{
    		CreateInvItems (self, ItPl_Forestberry, 1);
    		CreateInvItems (self, ItFo_Bread, 1);
    		CreateInvItems (self, ItFoMuttonRaw, 1);
    		CreateInvItems (self, ItMi_Gold, 13);
    	}
    	else if (InventorySet == 6)
    	{
    		CreateInvItems (self, ItPl_Forestberry, 1);
    		CreateInvItems (self, ItMi_Joint, 1);
    		CreateInvItems (self, ItFo_Cheese, 1);
    		CreateInvItems (self, ItPl_Planeberry, 1);
    		CreateInvItems (self, ItMi_Gold, 11);
    	}
    	else if (InventorySet == 0)
    	{
    		CreateInvItems (self, ItPl_Planeberry, 1);
    		CreateInvItems (self, ItFo_Apple, 1);
    		CreateInvItems (self, ItFo_Cheese, 4);
    		CreateInvItems (self, ItFo_Beer, 1);
    	};
    };
    Frage: (wie) könnte self zwischen Instanz und dem Funktionsaufruf kaputt gehen?
    Zwischen Beginn der Instanz und Aufruf des Ambiente-Inventars passieren meist solche Aufrufe:
    Code:
    	name[0] = "Bandit";
    	guild = GIL_BDT;
    	id = 555002;
    	voice = 6;
    	flags = 0;
    	npcType = npctype_main;
    	B_SetAttributesToChapter (self, 1);
    	level = 15;
    	B_GiveNpcTalents (self);
    	fight_tactic = FAI_HUMAN_NORMAL;
    	EquipItem (self, ItMw_1h_MISC_Sword);
    Geändert von Milky-Way (11.09.2018 um 17:16 Uhr)

  8. Beiträge anzeigen #68 Zitieren
    General Avatar von chris77211
    Registriert seit
    Oct 2015
    Beiträge
    3.654
     
    chris77211 ist offline
    Ganz genau gesagt trat der Absturz auf nachdem ich gestorben bin und aus dem Spiel heraus ein Save laden wollte.

  9. Beiträge anzeigen #69 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Problemkind ist der NPC mit Symbolindex 34167. Falls ihr noch die Gothic.dat habt, mit der die AV aufgetreten ist, könntet ihr mal mit DecDat schauen welcher NPC das ist. Da es nicht reproduzierbar ist, bezweifle ich aber, dass ihr in der NPC-Instanz etwas brauchbares finden werdet. Nachschauen schadet aber nicht.
    Unter welchen Umständen bist du denn gestorben (Magie, Nahkampf, Bogen mit Pfeil in der Hand während Tod, war der NPC mit der obigen SymID involviert, usw.) und hast du mit Quickload oder aus dem Menu geladen?

  10. Beiträge anzeigen #70 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Problemkind ist der NPC mit Symbolindex 34167. Falls ihr noch die Gothic.dat habt, mit der die AV aufgetreten ist, könntet ihr mal mit DecDat schauen welcher NPC das ist. Da es nicht reproduzierbar ist, bezweifle ich aber, dass ihr in der NPC-Instanz etwas brauchbares finden werdet. Nachschauen schadet aber nicht.
    Unter welchen Umständen bist du denn gestorben (Magie, Nahkampf, Bogen mit Pfeil in der Hand während Tod, war der NPC mit der obigen SymID involviert, usw.) und hast du mit Quickload oder aus dem Menu geladen?
    Ich habe es gerade in DecDat gesucht. 34167 ist aber leider eine Routine, die absichtlich leer gehalten wurde:
    Code:
    func void rtn_empty_20002(){
        /*intentionally empty*/
    };
    Der zugehörige Npc scheint auch nichts auffälliges zu haben:

    Code:
    instance BAN_20002_SONTRIL(Npc_Default)
    {
    	name[0] = "Sontril";
    	npcType = npctype_main;
    	guild = GIL_NONE;
    	level = 20;
    	voice = 39;
    	id = 20002;
    	attribute[ATR_STRENGTH] = 100;
    	attribute[ATR_DEXTERITY] = 100;
    	attribute[ATR_MANA_MAX] = 0;
    	attribute[ATR_MANA] = 0;
    	attribute[ATR_HITPOINTS_MAX] = 220;
    	attribute[ATR_HITPOINTS] = 220;
    	Mdl_SetVisual (self, "HUMANS.MDS");
    	Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds");
    	B_SetNpcVisual (self, MALE, "Hum_Head_Bald", Face_N_Weak_Herek, BodyTex_N, ITAR_LEATHER_L);
    	Mdl_SetModelFatness (self, 0);
    	senses = SENSE_SEE | SENSE_HEAR | SENSE_SMELL;
    	fight_tactic = FAI_HUMAN_STRONG;
    	EquipItem (self, ItMw_1h_Vlk_Dagger);
    	Npc_SetTalentSkill (self, NPC_TALENT_BOW, 2);
    	Npc_SetTalentSkill (self, NPC_TALENT_1H, 2);
    	B_CreateAmbientInv (self);
    	daily_routine = rtn_prestart_20002;
    };
    Bist du dir sicher, dass es ein Npc mit Symbolindex 34167 sein sollte?
    Geändert von Neconspictor (11.09.2018 um 22:48 Uhr)

  11. Beiträge anzeigen #71 Zitieren
    General Avatar von chris77211
    Registriert seit
    Oct 2015
    Beiträge
    3.654
     
    chris77211 ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Unter welchen Umständen bist du denn gestorben (Magie, Nahkampf, Bogen mit Pfeil in der Hand während Tod, war der NPC mit der obigen SymID involviert, usw.) und hast du mit Quickload oder aus dem Menu geladen?
    Ich habe mit einem Wolfsmesser gegen einen Wolf gekämpft und aus dem Menu geladen. Was der NPC "Sontril" damit zu tun haben kann weiss ich nicht der war ja meilenweit entfernt.

  12. Beiträge anzeigen #72 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.246
     
    Milky-Way ist offline
    Ich habe mir mal die Funktionen angeschaut, die von Sontrils Instanz aus ausgerufen werden.

    Meiner Ansicht nach in Frage kommen könnten da lediglich:
    1)
    Code:
    // const int EquipItem_TogglesEquip = 1;
    func void Equip_Item (var c_npc slf, var int ItemInst) 
    {
        if (!Npc_HasItems (slf, ItemInst)){
    		CreateInvItems (slf, ItemInst, 1);
        };
    
        if (!Npc_GetInvItem(slf, ItemInst)) {
            MEM_AssertFail("Unexpected behaviour in EquipItem.");
            return;
        };
        
        // if ((item.mainflag == ITEM_KAT_NF) && (Npc_HasReadiedMeleeWeapon(slf)))
        // || ((item.mainflag == ITEM_KAT_FF) && (Npc_HasReadiedRangedWeapon(slf))) {
            // MEM_Warn ("EquipItem: Caller wants to equip an item while item of the same type is readied. Ignoring request.");
            // return;
        // };
        
        // if (item.flags & ITEM_ACTIVE)
        // && (!EquipItem_TogglesEquip) {
            // /* calling EquipItem would unequip the item. */
            // MEM_Info ("EquipItem: This item is already equipped. Ignoring request.");
            // return;
        // };
    
        CALL_PtrParam (MEM_InstToPtr (ItemInst));
        CALL__thiscall (MEM_InstToPtr (slf), 7545792); // oCNpc__EquipItem
    };
    (allerdings ist das hier nur eine Daedalus-Funktion entfernt -- können wir uns hiermit versehentlich den Stack kaputt machen, so dass etwas in der nächsten Funktion nicht klappt?)

    2)
    B_CreateAmbientInv, darin wird eine Gilden-spezifische Funktion aufgerufen, die dann Items erstellt. Code habe ich in meinem vorherigen Beitrag gezeigt. Passt von der 2-Daedalus-Aufrufe Idee her. Allerdings scheint mir die Funktion nicht unbedingt selbst der Übeltäter zu sein, sofern "self" nicht bereits zuvor kaputt geht.


    3)
    Code:
    func void B_SetNpcVisual(var C_Npc slf,var int gender,var string headMesh,var int faceTex,var int bodyTex,var int armorInstance)
    {
    	slf.aivar[AIV_Gender] = gender;
    	Mdl_SetVisual (slf, "HUMANS.MDS");
    	if (gender == MALE)
    	{
    		Mdl_SetVisualBody (slf, "hum_body_Naked0", bodyTex, 0, headMesh, faceTex, 0, armorInstance);
    		if (slf.attribute[ATR_STRENGTH] < 50)
    		{
    			Mdl_SetModelScale (slf, 0.9, 1, 1);
    		};
    		if (slf.attribute[ATR_STRENGTH] > 100)
    		{
    			Mdl_SetModelScale (slf, 1.1, 1, 1);
    		};
    	}
    	else
    	{
    		if ((bodyTex >= 0) && (bodyTex <= 3))
    		{
    			bodyTex = bodyTex + 4;
    		};
    		Mdl_SetVisualBody (slf, "Hum_Body_Babe0", bodyTex, 0, headMesh, faceTex, 0, armorInstance);
    	};
    };
    wird in
    Code:
    Mdl_SetVisualBody (slf, "Hum_Body_Babe0", bodyTex, 0, headMesh, faceTex, 0, armorInstance);
    ein Item erstellt? Aber als External würde das im stacktrace anders aussehen?


    ---------------------------------

    Symbol-id 34167 ist, wie Neconspictor geschrieben hat, die Routine rtn_empty_20002 zu finden. Der String "empty" (nicht case-sensitive) kommt in den Skripten nicht vor, daher gehe ich davon aus, dass diese Routine aus Gothic-Sicht nur eine beliebige (leere) Funktion ist, die nie aufgerufen wird.
    Geändert von Milky-Way (12.09.2018 um 04:38 Uhr)

  13. Beiträge anzeigen #73 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Neconspictor Beitrag anzeigen
    Bist du dir sicher, dass es ein Npc mit Symbolindex 34167 sein sollte?
    Ja, ziemlich:
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Code:
    //======================UNHANDLED EXCEPTION======================
    //======================UNHANDLED EXCEPTION======================
    Gothic2.exe caused a  in module KERNELBASE.dll at 0023:7532C54F, RaiseException()+88 byte(s)
    EAX=0135EB84  EBX=0135EC6C  ECX=00000003  EDX=00000000  ESI=00843DB0
    EDI=0135EC14  EBP=0135EBD4  ESP=0135EB84  EIP=7532C54F  FLG=00200216
    CS=0023   DS=002B  SS=002B  ES=002B   FS=0053  GS=002B
    //=====================  INFOS =========================
    Gothic II - 2.6 (fix), Parser Version: 50
    User:  Chris,  CPUType: 586,  Mem: 0 MB total, 0 MB free
    //====================== CALLSTACK ========================
    0023:7532C54F (0xE06D7363 0x00000001 0x00000003 0x0135EC08) KERNELBASE.dll, RaiseException()+88 byte(s)
    0023:007D44BF (0x0135EC34 0x00889A88 0x35241A2B 0x00AB40C0) Gothic2.exe, _CxxThrowException()+52 byte(s)
    0023:007D0B51 (0x7720E1B2 0x00000021 0x0135EC24 0x0135E5DC) Gothic2.exe, bad_cast::bad_cast
    0023:7720E454 (0x29AB1F40 0x00000000 0x0088DFE0 0x008913B0) ntdll.dll, RtlInitUnicodeString()+356 byte(s)
    0023:006DB111 (0x0135ED6C 0x00000001 0x006E7B60 0x00000000) Gothic2.exe, zSTRING::Init()+5521 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGameExternal.cpp, line 281
    0023:006E7C11 (0x00AB4108 0x00000000 0x00AB40C0 0x001D2405) Gothic2.exe, oCMsgState::operator delete()+23393 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGameExternal.cpp, line 3477+118 byte(s)
    0023:00792568 (0x006E7B60 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+3080 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1433
    0023:00792504 (0x001D062A 0x00AB40C0 0x1C280E9C 0x00008577) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1415
    0023:00792504 (0x001D2235 0x8094C1D0 0x8094BD90 0x0072F161) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1415
    0023:00792FF7 (0x001EAC2D 0x8094BD90 0x00008577 0x228954A8) Gothic2.exe, zCParser::CreateInstance()+87 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1586+12 byte(s)
    0023:0072F161 (0x00008577 0x00000001 0x00018CB9 0x228954A8) Gothic2.exe, oCNpc::InitByScript()+753 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oNpc.cpp, line 1642
    0023:007472D4 (0x228954A8 0x0135F1BB 0x228954A8 0x0000002F) Gothic2.exe, oCNpc::Unarchive()+164 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oNpc.cpp, line 9440
    0023:00526DC5 (0x00000000 0x00000000 0x0082E6F0 0x1B799758) Gothic2.exe, zCArchiverGeneric::ReadObject()+2149 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zArchiverGeneric.cpp, line 1274
    0023:0077F9B3 (0x228954A8 0x0082E6F0 0x228954A8 0x1B799758) Gothic2.exe, oCWorld::Unarchive()+339 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oWorld.cpp, line 390
    0023:00526DC5 (0x1B799758 0x006271F0 0x00000001 0x0135F728) Gothic2.exe, zCArchiverGeneric::ReadObject()+2149 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zArchiverGeneric.cpp, line 1274
    0023:00526DFE (0x00000001 0x0135F728 0x1B799758 0x00000000) Gothic2.exe, zCArchiverGeneric::ReadObject()+14 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zArchiverGeneric.cpp, line 1282
    0023:006271F0 (0x0135F4F4 0x00000001 0x10C22F48 0x00000000) Gothic2.exe, zCWorld::LoadWorld()+288 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zWorld.cpp, line 2647
    0023:0077FDDD (0x0135F724 0x00000001 0x0135F964 0x10C22F48) Gothic2.exe, oCWorld::LoadWorld()+669 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oWorld.cpp, line 447+13 byte(s)
    0023:006CA4CD (0x0135F988 0x0082E6F0 0x7A78F5F0 0x10C22F48) Gothic2.exe, oCGame::LoadWorldDyn()+589 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 3182
    0023:006C9435 (0xFFFFFFFF 0x0135F960 0x0082E6F0 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+901 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2932
    0023:006C6BEB (0xFFFFFFFF 0x00000001 0x0135FCA8 0x00000001) Gothic2.exe, oCGame::LoadSavegame()+1051 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2237
    0023:0042A282 (0x00000001 0x00000001 0x0135FCA8 0x00000001) Gothic2.exe, CGameManager::Read_Savegame()+578 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1557
    0023:00429D02 (0x00000000 0x00000001 0x0135FCA8 0x0159ACB8) Gothic2.exe, CGameManager::Menu()+2610 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1492
    0023:0042AE90 (0x00000001 0x0082E6F0 0x00000000 0x00425E3F) Gothic2.exe, CGameManager::HandleEvent()+320 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1725
    0023:007A55EE (0x00400000 0x0153368A 0x0135FECC 0xFFFDE000) Gothic2.exe, zCInputCallback::GetInput()+46 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zView.cpp, line 210+20 byte(s)
    0023:00425E3F (0x0082F0EC 0x00000000 0x00070240 0x10C22F48) Gothic2.exe, CGameManager::Run()+1551 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 767
    0023:0078188B (0x0000002C 0x0003D5C2 0x00000002 0x00000000) Gothic2.exe, MainProg()+75 byte(s), P:\dev\g2addon\release\Gothic\_ulf\Phoenix.cpp, line 111
    0023:00503270 (0x00400000 0x00000000 0x0153368A 0x0000000A) Gothic2.exe, HandledWinMain()+928 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1169
    0023:00502DFD (0x0135FED0 0x00000000 0x0153368A 0x0000000A) Gothic2.exe, WinMain()+141 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1054+17 byte(s)
    0023:007D43F8 (0x00000004 0x0000FFFF 0x000000B8 0x00000000) Gothic2.exe, WinMainCRTStartup()+224 byte(s)
    //=====================================================
    8577h = 34167d. Das sollte esp+4 an dieser Adresse sein, also das erste Argument an zCParser::CreateInstance. Dass dort der Symbolindex des NPC steht, habe ich bei mir mit dem Hero ausprobiert und in der getriggerten AV überprüft.

    Nur zur Sicherheit die Gegenfrage: Seid ihr sicher, dass es sich wirklich um die (unveränderte, nicht neu-kompilierte) Gothic.dat handelt?


    Zitat Zitat von Milky-Way Beitrag anzeigen
    Ich habe mir mal die Funktionen angeschaut, die von Sontrils Instanz aus ausgerufen werden.
    Ich kann nur spekulieren (weil ich im Moment kein Gothic hier habe), aber ich könnte mir vorstellen, dass innerhalb/mit oCNpc::EquipItem die aktuelle Instanz (sprich self) überschrieben wird. Das würde aber nicht die Nicht-Reproduzierbarkeit erklären.
    Apropos Reproduzierbarkeit: Diese Kette der beteiligten Enginefunktion wird nur dann so aufgerufen, wenn man aus dem laufenden Spiel heraus ein Spielstand lädt.

  14. Beiträge anzeigen #74 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    @Milky: Es wird nicht "Equip_Item" sondern das External "EquipItem" aufgerufen. Auch wird durch Equip_Item nicht der Stack geleert. Das passiert nämlich nur dann, wenn man von der Engine eine Daedalus Funktion aufruft (über zCParser::CallFunc()). Die HookEngine macht dasselbe, wodurch man keine Externals hooken sollte. Umgekehrt, von Daedalus eine Engine-Funktion aufzurufen ist dagegen kein Problem.

    Btw. frage ich mich schon länger, warum es "Equip_Item" eigtl. gibt. Prinzipiell macht es nichts anderes wie das External "EquipItem".

  15. Beiträge anzeigen #75 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Nur zur Sicherheit die Gegenfrage: Seid ihr sicher, dass es sich wirklich um die (unveränderte, nicht neu-kompilierte) Gothic.dat handelt?
    Milky hat extra eine neue Demo mit der Veränderung in der HookEngine.d erstellt.

    Also ja, es müsste die gleiche sein (sofern alles richtig installiert worden ist). Aber ich kann zur Sicherheit mal noch die vorherige Version überprüfen.


    Zitat Zitat von mud-freak Beitrag anzeigen
    Ich kann nur spekulieren (weil ich im Moment kein Gothic hier habe), aber ich könnte mir vorstellen, dass innerhalb/mit oCNpc::EquipItem die aktuelle Instanz (sprich self) überschrieben wird. Das würde aber nicht die Nicht-Reproduzierbarkeit erklären.
    Apropos Reproduzierbarkeit: Diese Kette der beteiligten Enginefunktion wird nur dann so aufgerufen, wenn man aus dem laufenden Spiel heraus ein Spielstand lädt.
    Aber oCNpc::EquipItem wird doch auch im External aufgerufen. Ich sehe da ehrlich gesagt keinen Kausalzusammenhang.

  16. Beiträge anzeigen #76 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Neconspictor Beitrag anzeigen
    Es wird nicht "Equip_Item" sondern das External "EquipItem" aufgerufen.
    Oh guter Punkt, rudern wir hier lieber wieder zurück.

    Zitat Zitat von Neconspictor Beitrag anzeigen
    Auch wird durch Equip_Item nicht der Stack geleert.
    Achtung, das Problem dieser AV hier ist nicht ein leerer/korrupter Stack, sondern ein ungültiges self.
    Ein bisschen ungünstig, dass wir hier verschiedene Crashs gleichzeitig diskutieren. Dass die beiden Crashes zusammenhängen halte ich aber nicht für ausgeschlossen.

    Zitat Zitat von Neconspictor Beitrag anzeigen
    Btw. frage ich mich schon länger, warum es "Equip_Item" eigtl. gibt. Prinzipiell macht es nichts anderes wie das External "EquipItem".
    Ursprünglich ging es glaube ich dabei um mehr Kontrolle aus den Skripten heraus: https://forum.worldofplayers.de/forum/showthread.php?p=15341275



    Zitat Zitat von Neconspictor Beitrag anzeigen
    Aber oCNpc::EquipItem wird doch auch im External aufgerufen. Ich sehe da ehrlich gesagt keinen Kausalzusammenhang.
    Stimmt, höchstwahrscheinlich ruft die externe Funktion EquipItem intern oCNpc::EquipItem auf. Ich dachte eher an die Benutzung von CALL_PtrParam und CALL__thicall. Aber das scheint ja nun irrelevant, da EquipItem und nicht Equip_Item aufgerufen wird.

  17. Beiträge anzeigen #77 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    Zitat Zitat von Neconspictor Beitrag anzeigen
    Milky hat extra eine neue Demo mit der Veränderung in der HookEngine.d erstellt.
    Also ja, es müsste die gleiche sein (sofern alles richtig installiert worden ist). Aber ich kann zur Sicherheit mal noch die vorherige Version überprüfen.
    Ich habe es überprüft und da zeigt Symbolindex 34167 auf unseren Sontril. Wenn ich mich also nicht ganz täusche, muss irgendetwas bei der Installation schief gelaufen sein und unser Tester hat mit der alten Version gespielt

    @Milky: Ich glaube wir sollten eine Art Versionsanzeige einbauen (über eine LeGo-View vielleicht?).


    EDIT:

    Zitat Zitat von mud-freak Beitrag anzeigen
    Achtung, das Problem dieser AV hier ist nicht ein leerer/korrupter Stack, sondern ein ungültiges self.
    Ein bisschen ungünstig, dass wir hier verschiedene Crashs gleichzeitig diskutieren. Dass die beiden Crashes zusammenhängen halte ich aber nicht für ausgeschlossen.
    Das stimmt. Aber "self" muss davor schon ungültig sein. Und das meinte ich mit "Auch wird durch Equip_Item nicht der Stack geleert". Also dass die Funktion an sich "self" nicht überschreibt (hätte ich klarer formulieren sollen...). Oder habe ich da was übersehen?
    Geändert von Neconspictor (12.09.2018 um 09:58 Uhr)

  18. Beiträge anzeigen #78 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Vielleicht könnte man noch mit MEM_GetFuncIDByOffset und co. aus der AV herauskitzeln welche Daedalusfunktionen beteiligt waren, aber vielleicht wäre es noch hilfreich zu wissen, ob dieser Crash auch mit der neusten Gothic.dat auftritt.

  19. Beiträge anzeigen #79 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Vielleicht könnte man noch mit MEM_GetFuncIDByOffset und co. aus der AV herauskitzeln welche Daedalusfunktionen beteiligt waren, aber vielleicht wäre es noch hilfreich zu wissen, ob dieser Crash auch mit der neusten Gothic.dat auftritt.
    Selbst mit exakt der Gothic.dat, mit der das Problem aufgetreten ist, kann man auf die oben beschriebene Weise (fast) unmöglich an die Funktionen heran kommen. Denn sobald man neuen Code schreibt und hinzufügt (z.B. MEM_GetFuncIDByOffset), verschiebt sich alles im Codestack und die Offsets aus der AV sind nutzlos.
    Ich habe aber gerade mit erstaunen festgestellt, dass Ninja in solchen Fällen super Abhilfe schafft. Ninja fügt ja jeglichen neuen Code am Ende des Codestack dran, womit dann die Funktionsoffsets intakt bleiben.

    Obwohl es nun schon ziemlich offensichtlich ist, dass die beiden Daedalusfunktionen B_CreateAmbientInv und B_CreateAmbientInv_XXX sind und wir nichts aus dieser Information gewinnen (der Ursprung des Problems wird wo anders sein), habe ich hier eine Möglichkeit mit der ihr die beiden Funktionsnamen bestätigen könnt - vorausgesetzt ihr habt noch exakt die Gothic.dat mit der die AV auftrat.

    Alles was ihr machen müsst, ist diese VDF-Datei nach [Gothic]\Data\ kopieren und das Spiel starten. Dann werden zwei InfoBoxen erscheinen mit den beiden Funktionsnamen.

    Wie gesagt, ich halte das für recht zwecklos, aber es würde mich interessieren, ob es klappt.

  20. Beiträge anzeigen #80 Zitieren
    Knight Commander Avatar von Neconspictor
    Registriert seit
    Jan 2009
    Beiträge
    2.749
     
    Neconspictor ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Selbst mit exakt der Gothic.dat, mit der das Problem aufgetreten ist, kann man auf die oben beschriebene Weise (fast) unmöglich an die Funktionen heran kommen. Denn sobald man neuen Code schreibt und hinzufügt (z.B. MEM_GetFuncIDByOffset), verschiebt sich alles im Codestack und die Offsets aus der AV sind nutzlos.
    Ich habe aber gerade mit erstaunen festgestellt, dass Ninja in solchen Fällen super Abhilfe schafft. Ninja fügt ja jeglichen neuen Code am Ende des Codestack dran, womit dann die Funktionsoffsets intakt bleiben.

    Obwohl es nun schon ziemlich offensichtlich ist, dass die beiden Daedalusfunktionen B_CreateAmbientInv und B_CreateAmbientInv_XXX sind und wir nichts aus dieser Information gewinnen (der Ursprung des Problems wird wo anders sein), habe ich hier eine Möglichkeit mit der ihr die beiden Funktionsnamen bestätigen könnt - vorausgesetzt ihr habt noch exakt die Gothic.dat mit der die AV auftrat.

    Alles was ihr machen müsst, ist diese VDF-Datei nach [Gothic]\Data\ kopieren und das Spiel starten. Dann werden zwei InfoBoxen erscheinen mit den beiden Funktionsnamen.

    Wie gesagt, ich halte das für recht zwecklos, aber es würde mich interessieren, ob es klappt.
    Die Funktionsnamen sind B_CreateAmbientInv und B_CreateAmbientInv_Bau, also genauso wie du es vermutet hast. Könntest du den Source code zu deinem Ninja-Code posten? Könnte in der Zukunft vielleicht noch nützlich sein

Seite 4 von 9 « Erste 12345678 ... Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide