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 1 von 4 1234 Letzte »
Ergebnis 1 bis 20 von 79
  1. Beiträge anzeigen #1 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline

    Generation Lost's Fragenthread #3

    Inhaltsverzeichnis
    letztes Update: 25.10.2018

    Offene Fragen:
    - [G1] Persistierung von Item-Instanz-Daten


    Beantwortete Fragen
    - [G1] Gibt es Tools wie Stampfer auch für G1?
    Antwort: Leider nicht.

    - [G1] Gibt es eine Liste mit Engine-Adressen für G1?
    Antwort: Ja, hier! Thanks to F a w k e s. Alternativ durch das Union-Projekt auch hier, für G2 hier.

    - [G1] Refresh für Buffs ohne "Tick" funktioniert nicht.
    Antwort: tickMS trotzdem auf 500 setzen, selbst wenn es keine OnTick Funktion für den Buff gibt.

    - [G1] Wie komme ich an die Anzahl von gedroppten Items?
    Antwort: Über das amount-Feld der oCItem Klasse

    - [G1] Was ist ECX und ESP in diesem Skript und wo kommt das her?
    Antwort: Super Erklärung von Lehona

    - [G1] Crashes beim Verwenden von Buttons...
    Antwort: >KLICK<

    - [G1] Engine-Funktionen zum Looten von Truhen/NPCs?
    Antwort: >KLICK<

    - [G1] Alle Items aus einem Inventar entfernen?
    Antwort: >KLICK<

    - [G1] Neue Keybindings
    Antwort: Für Menüeintrage im OP und zur Key-Abfrage die Antwort von necronomicon

    - [G1] MEM_GetMenuItemByString liefert null
    Antwort: Die Funktion sollte nur dann aufgerufen werden, wenn sichergestellt werden kann, dass das betroffene Menü bereits geladen wurde.

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


    Hallo Leute,

    nach einer gefühlten Ewigkeit habe ich mal wieder ein neues Projekt angefangen, dieses Mal für Gothic 1. Daher werden sich alle Fragen auf G1 beziehen.
    Den uralten Thread verlinke ich hier nur noch einmal für mich persönlich:
    https://forum.worldofplayers.de/foru...er-hinaus%29-2

    Nun zu meinen ersten Fragen:

    1. Gibt es eine Gewisse Reihenfolge zur Installation von Systempack, Spine, Mod-Kit und dergleichen? Mittlerweile gibt es ja so vieles, da bin ich mir nicht mehr so sicher.

    2. Spine bietet ja Entwicklertools, aber gibt es dazu auch ein Tutorial? Habe bisher nichts gefunden und stoße gerade auf einige Probleme beim Start meines Projekts bzgl. Spine und fehlender Dateien.
    So habe ich es gemacht:
    - Gothic + PlayerKit + Systempack normal installiert.
    - Einen extra Ordner für das Projekt angelegt und Gothic dort rein kopiert
    - Diesen Ordner in Spine als Modding-Verzeichnis angegeben
    - In Spine unter Entwickler->Spine Editor auf "Spine installieren" geklickt. Es werden Dateien runtergeladen, von denen aber nur Spine.src es in den Scripts-Ordner schafft. Wo ist der Rest?

    3. Wenn ich das Projekt mit Spine starte und das Systempack sowie zSpy aktiviere, wird ersten zSpy gar nicht gestartet und zweitens funktioniert die Maussteuerung dann nicht mehr. Nur wenn zSpy ausgeschaltet ist.

    4. Gibt es eigentlich noch Tools für G1, besonders im Bereich Skripting für Syntax-Highlighting o.Ä.? Evtl. etwas wie Stampfer nur halt für G1? Momentan benutze ich einfach nur Notepad++ mit eigenem Syntax-Highlighting für Deadalus und LeGo Funktionen. Falls da jemand die XML dazu haben will, kann ich die auch gerne hochladen, wenn es nicht schon soetwas gibt.

    LG
    GL

    EDIT:
    5. Gibt es auch eine Liste mit Addressen für Enginefunktionen für G1? Ich finde nur die für G2.

    6. Wie kann ich "bedingt permanente" (De)Buffs erstellen?
    Ich habe eine FF die alle 2 Sekunden feuert und einen bestimmten Wert prüft. Ist der Wert unter dem angegebenen Schwellwert, wird der (De)Buff mit Buff_ApplyOrRefresh() auf den Helden gelegt. Dieser hat eine Dauer von 2,5 Sekunden (also FF delayMS + 500). Theoretisch müsste dann doch, jedes Mal wenn die FF erneut feuert die Dauer des (De)Buffs zurückgesetzt werden, oder nicht? Stattdessen läuft der Buff nach 2,5 Sekunden ganz normal aus und wird dann zwei Sekunden später durch die FF nochmal neu aufgelegt.
    Geändert von GenerationLost (11.02.2024 um 21:27 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.803
     
    Fisk2033 ist offline
    Zitat Zitat von GenerationLost Beitrag anzeigen
    Hallo Leute,

    nach einer gefühlten Ewigkeit habe ich mal wieder ein neues Projekt angefangen, dieses Mal für Gothic 1. Daher werden sich alle Fragen auf G1 beziehen.
    Den uralten Thread verlinke ich hier nur noch einmal für mich persönlich:
    https://forum.worldofplayers.de/foru...er-hinaus%29-2

    Nun zu meinen ersten Fragen:

    1. Gibt es eine Gewisse Reihenfolge zur Installation von Systempack, Spine, Mod-Kit und dergleichen? Mittlerweile gibt es ja so vieles, da bin ich mir nicht mehr so sicher.

    2. Spine bietet ja Entwicklertools, aber gibt es dazu auch ein Tutorial? Habe bisher nichts gefunden und stoße gerade auf einige Probleme beim Start meines Projekts bzgl. Spine und fehlender Dateien.
    So habe ich es gemacht:
    - Gothic + PlayerKit + Systempack normal installiert.
    - Einen extra Ordner für das Projekt angelegt und Gothic dort rein kopiert
    - Diesen Ordner in Spine als Modding-Verzeichnis angegeben
    - In Spine unter Entwickler->Spine Editor auf "Spine installieren" geklickt. Es werden Dateien runtergeladen, von denen aber nur Spine.src es in den Scripts-Ordner schafft. Wo ist der Rest?

    3. Wenn ich das Projekt mit Spine starte und das Systempack sowie zSpy aktiviere, wird ersten zSpy gar nicht gestartet und zweitens funktioniert die Maussteuerung dann nicht mehr. Nur wenn zSpy ausgeschaltet ist.

    4. Gibt es eigentlich noch Tools für G1, besonders im Bereich Skripting für Syntax-Highlighting o.Ä.? Evtl. etwas wie Stampfer nur halt für G1? Momentan benutze ich einfach nur Notepad++ mit eigenem Syntax-Highlighting für Deadalus und LeGo Funktionen. Falls da jemand die XML dazu haben will, kann ich die auch gerne hochladen, wenn es nicht schon soetwas gibt.

    LG
    GL

    EDIT:
    5. Gibt es auch eine Liste mit Addressen für Enginefunktionen für G1? Ich finde nur die für G2.

    6. Wie kann ich "bedingt permanente" (De)Buffs erstellen?
    Ich habe eine FF die alle 2 Sekunden feuert und einen bestimmten Wert prüft. Ist der Wert unter dem angegebenen Schwellwert, wird der (De)Buff mit Buff_ApplyOrRefresh() auf den Helden gelegt. Dieser hat eine Dauer von 2,5 Sekunden (also FF delayMS + 500). Theoretisch müsste dann doch, jedes Mal wenn die FF erneut feuert die Dauer des (De)Buffs zurückgesetzt werden, oder nicht? Stattdessen läuft der Buff nach 2,5 Sekunden ganz normal aus und wird dann zwei Sekunden später durch die FF nochmal neu aufgelegt.
    1. Also wenn du Spine hast, lädt es dir (meines Wissens nach) alles herunter.

    2. Das weiß ich auch nicht genau. Du solltest am besten Bonne mal anschreiben bzw. in seinen Spine-Thread fragen. Vermutlich guckt er dort eher rein, als in diesen Thread.

    3. Selbiges wie 2.

    4. Ich würde einfach mal sagen - nein. Ich habe zumindest noch nie ein Stampfer-ähnliches Tool gesehen.

    5. Du könntest mal mud-freak fragen, er hat vieles nach G1 portiert. Eine Liste, wie es sie für G2 gibt, habe ich allerdings noch nicht gesehen.

    6. Eventuell hilft dir folgender Thread weiter, denn es gibt eine "Buff_Remove" Funktion. Wenn du den Buff direkt von einem NPC löschen willst, dann sind die letzten Posts in dem Thread sicher hilfreich für dich. https://forum.worldofplayers.de/foru...ight=buff+lego

  3. Beiträge anzeigen #3 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Erstmal danke für die Antwort.

    Zitat Zitat von Fisk2033 Beitrag anzeigen
    1. Also wenn du Spine hast, lädt es dir (meines Wissens nach) alles herunter.
    Bis auf das eigentliche ModKit nehme ich an, aber das ist dann ja auch kein Problem. Danke für die Info

    Zitat Zitat von Fisk2033 Beitrag anzeigen
    2. Das weiß ich auch nicht genau. Du solltest am besten Bonne mal anschreiben bzw. in seinen Spine-Thread fragen. Vermutlich guckt er dort eher rein, als in diesen Thread.
    3. Selbiges wie 2.
    Werde ich dann mal machen.

    Zitat Zitat von Fisk2033 Beitrag anzeigen
    4. Ich würde einfach mal sagen - nein. Ich habe zumindest noch nie ein Stampfer-ähnliches Tool gesehen.
    Schade, aber war auch zu erwarten.

    Zitat Zitat von Fisk2033 Beitrag anzeigen
    5. Du könntest mal mud-freak fragen...
    Werde ich tun, danke.

    Zitat Zitat von Fisk2033 Beitrag anzeigen
    6. Eventuell hilft dir folgender Thread weiter, denn es gibt eine "Buff_Remove" Funktion. Wenn du den Buff direkt von einem NPC löschen willst, dann sind die letzten Posts in dem Thread sicher hilfreich für dich. https://forum.worldofplayers.de/foru...ight=buff+lego
    Vielen Dank, das löst schonmal ein anderes Problem! Aber eigentlich meinte ich was anderes. Der Buff soll ja nicht entfernt werden, solange die Bedingung der FF noch gilt. Er soll nur jeweils refreshed werden um quasi einen permanenten Buff zu haben. Wenn dann die Bedingung der FF nicht mehr gilt, darf der Buff ganz normal auslaufen, dann muss er nicht extra gestoppt werden. Das Problem dabei ist halt nur, dass der Buff anscheinend nicht aktualisiert wird und daher gibt es zwischen jedem Tick eine Lücke in der der Buff inaktiv wird und beim nächsten Feuern der FF wieder reaktiviert, statt refreshed wird.

  4. Beiträge anzeigen #4 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Wir sind alle keine Magier, zeig doch einfach mal den Code zu den Buffs


    Eine Liste mit Enginefunktionen von Gothic 1 gibt es nicht, aber mit IDA kann man eigentlich ganz gut selber nachschauen. Mittlerweile sollte es dafür auch ein Tutorial im Editing-Wiki geben. Bei G1 musst du (glaube ich) nur beachten, dass du die GothicMod.exe nimmst, weil dort Debuginformationen enthalten sind.

  5. Beiträge anzeigen #5 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Wir sind alle keine Magier, zeig doch einfach mal den Code zu den Buffs
    Hast ja recht.
    Diese FF wird in der Init_Global aufgerufen:
    Code:
    FF_ApplyOnceExt(RP_Survival_HungerTick, RP_HungerTickMS, -1);
    TickMS ist hierbei 4 Sekunden;

    Hier die Funktion die über die FF läuft:
    Code:
    func void RP_Survival_HungerTick()
    {
    	if ((RP_Hunger - RP_HungerRate) < 0) 
    	{ 
    		RP_Hunger = 0;
    		return; 
    	};
    	
    	RP_Hunger = RP_Hunger - RP_HungerRate;
    	
    	if (RP_Hunger < 1000)
    	{
    		Buff_ApplyOrRefresh(hero, RP_Survival_DebuffHunger_L3);
    	}
    	else if (RP_Hunger < 2000)
    	{
    		Buff_ApplyOrRefresh(hero, RP_Survival_DebuffHunger_L2);
    	}
    	else if (RP_Hunger < 4000)
    	{
    		Buff_ApplyOrRefresh(hero, RP_Survival_DebuffHunger_L1);
    	};
    };
    Da sind noch ein paar Zeilen mehr drin, die sind aber für die Buffs irrelevant.

    Und hier noch die Instanz einer der Buffs, die sind alle gleich, bis auf die OnApply Funktionen für unterschiedliche Effekte.
    Code:
    instance RP_Survival_DebuffHunger_L1(lCBuff)
    {
        name = "Hunger Stufe 1";
        bufftype = BUFF_BAD;
            
        durationMS = RP_HungerTickMS+500;
            
        OnApply = SAVE_GetFuncID(RP_Survival_DebuffHunger_L1_Apply);
    OnRemoved = SAVE_GetFuncID(RP_Survival_DebuffHunger_Remove);
        buffTex = "HUNGER_L1.TGA";
    };
    Zitat Zitat von Lehona Beitrag anzeigen
    Eine Liste mit Enginefunktionen von Gothic 1 gibt es nicht, aber mit IDA kann man eigentlich ganz gut selber nachschauen. Mittlerweile sollte es dafür auch ein Tutorial im Editing-Wiki geben. Bei G1 musst du (glaube ich) nur beachten, dass du die GothicMod.exe nimmst, weil dort Debuginformationen enthalten sind.
    Das hab ich mir tatsächlich auch schon angeschaut... Mir graut es da aber echt vor. Hab auch mal schnell versucht z.B. die Addresse für DoTakeVob zu finden, was ich aber gefunden habe scheint nicht wirklich zu funktionieren. Habe jetzt aber auch nicht wirklich so viel Zeit da reingesteckt.

  6. Beiträge anzeigen #6 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline

    G1 addresses

    Maybe this list of addresses can be helpful:
    http://delfcode.ru/_fr/13/GothicMod.txt

    This is what I have been using mostly to convert / create some functions for G1, for example:

    There is a function in LeGo package oCNPC__RemoveFromSlot which is not ported from G2A to G1. Address is not correct, so when I was trying to convert it I found this address and I replaced constant in EngineAdr_G1.d:
    Code:
    //006A5E80  .text     Debug data           ?RemoveFromSlot@oCNpc@@QAEPAVoCVob@@ABVzSTRING@@H@Z
    const int oCNPC__RemoveFromSlot                     = 6971008; //006A5E80  G1
    
    func void oCNPC_RemoveFromSlot(var c_npc slf, var string SlotName, var int retVal, var int SlotID)
    {
        CALL_IntParam(SlotID);
        CALL_IntParam(retVal);
        CALL_zStringPtrParam(SlotName);
        CALL__thiscall(MEM_InstToPtr(slf), oCNPC__RemoveFromSlot);
    };
    But this was still not working and crashing for me and only after a loooong time I have found out that in G1 function required here only 1 parameter - so I choose (to be honest randomly) that I will remove retVal parameter. I am not 100% sure, but I believe integer parameters are indicated by @@H@ in the linked file:
    Code:
    //006A5E80  .text     Debug data           ?RemoveFromSlot@oCNpc@@QAEPAVoCVob@@ABVzSTRING@@H@Z
    This way function works for me in G1:
    Code:
    func void oCNPC_RemoveFromSlot(var c_npc slf, var string SlotName, var int retVal, var int SlotID)
    {
        CALL_IntParam(SlotID);
        //CALL_IntParam(retVal);
        CALL_zStringPtrParam(SlotName);
        CALL__thiscall(MEM_InstToPtr(slf), oCNPC__RemoveFromSlot);
    };
    Function in action:
    [Video]
    I changed G_CanSteal a little bit - while player is sneaking and trying to steal from a sleeping NPC an item, function inserts sword into players hand, plays animation T_1HSFINISH (while holding a sword in his hand) and finally kills target NPC
    Geändert von F a w k e s (27.09.2018 um 15:32 Uhr)

  7. Beiträge anzeigen #7 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von F a w k e s Beitrag anzeigen
    Maybe this list of addresses can be helpful:
    http://delfcode.ru/_fr/13/GothicMod.txt
    That really is helpful, thanks a lot! With the address for DoTakeVob in this list, I was able to make the Hook work. What about the instruction's byte lenght though? The wiki says "at least 5". Do you succeed here with trial and error, incrementing the length by one each time it didn't work, til it actually does?

    EDIT:
    Zitat Zitat von F a w k e s Beitrag anzeigen
    Function in action:
    I changed G_CanSteal a little bit - while player is sneaking and trying to steal from a sleeping NPC an item, function inserts sword into players hand, plays animation T_1HSFINISH (while holding a sword in his hand) and finally kills target NPC
    That's awesome!
    Geändert von GenerationLost (27.09.2018 um 15:36 Uhr)

  8. Beiträge anzeigen #8 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Edit: @Fawkes: What you're seeing there are "mangled" names, which are created by C++ due to some technicalities (function overloading mostly, I guess). IDA should be able to demangle them, not sure why it didn't in that list. In any case, opening up IDA and jumping to the address (Hotkey G, input as hex) should show you the parameters.

    Da gibt es tatsächlich einen Bug bei Buffs, die keine "Ticks" haben (die werden nicht korrekt refreshed). Fürs erste kannst du das fixen, indem du einfach tickMS = 500 setzt. onTick musst du nicht setzen. Disclaimer: Hab ich nicht getestet.

    Fawkes hat dir ja schon eine Liste geschickt, aber falls du nochmal Hilfe bei sowas braucht, meld dich gerne per Instant Messenger (am besten Steam, "Lehona__") bei mir. In einem Forumsthread lässt sich das immer schlecht erklären.

    Aber aushilfsweise kannst du bei der Länge auch einfach raten. Üblicherweise liegen die Werte zwischen 5 und 8, also muss man nicht so viel ausprobieren, und ein falscher Wert sollte sofort crashen. Mir fällt zumindest kein Fall ein, in dem das nur manchmal zu Abstürzen führen würde. Falls mal gar nichts funktioniert, egal welche Werte du probierst, überschreibst du eine der "verbotenen Instruktionen" (Calls, Jumps), die relative Adressen verwenden. Falls das in der Liste nicht beachtet wurde, kannst du das dann nur in IDA rausfinden.
    Geändert von Lehona (27.09.2018 um 15:42 Uhr)

  9. Beiträge anzeigen #9 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline
    I am using G2A recommended lengths - and if that is not working - then trial and error, so far in 90% of cases it worked like that for me Here is list I've been using successfully (in case you would be trying to hook same addresses):
    Code:
    //Constants declaration
    //004FE140  .text     Debug data           ?CheckPhysics@zCAIPlayer@@AAEXXZ
    const int zCAIPlayer__CheckPhysics    = 5235008;
    
    //006968F0  .text     Debug data           ?Equip@oCNpc@@QAEXPAVoCItem@@@Z
    //already in Lego 2.5.0!
    //const int oCNPC__Equip        = 6908144;
    
    //006A10F0  .text     Debug data           ?DoDropVob@oCNpc@@UAEHPAVzCVob@@@Z
    const int OCNPC__DoDropVob        = 6951152;
    
    //0068FBC0  .text     Debug data           ?UnequipItem@oCNpc@@QAEXPAVoCItem@@@Z
    //already in Lego 2.5.0!
    //const int oCNPC__UnequipItem        = 6880192
    
    //006A0D10  .text     Debug data           ?DoTakeVob@oCNpc@@UAEHPAVzCVob@@@Z
    const int oCNPC__DoTakeVob        = 6950160;
    
    //00669780  .text     Debug data           ?TransferItem@oCItemContainer@@MAEHHH\@Z
    const int oCItemContainer__TransferItem    = 6723456;
    
    //const int oCNPC__CloseInventory    = 7058164;
    //already in Lego 2.5.0!
    
    //006BB890  .text     Debug data           ?OpenDeadNpc@oCNpc@@QAEXXZ
    //already in Lego 2.5.0! however commented out
    const int oCNPC__OpenDeadNPC        = 7059600;
    
    //0067F5F0  .text     Debug data               ?CanInteractWith@oCMobInter@@UAEHPAVoCNpc@@@Z
    const int oCMobInter__CanInteractWith    = 6813168;
    
    //0072A870  .text     Debug data           ?OnAccept@oCViewDialogTrade@@IAIXXZ
    const int oCViewDialogTrade__OnAccept    = 7514224;
    
    //0067D280  .text     Debug data           ?OnTick@oCMobInter@@UAEXXZ
    const int oCMobInter__OnTick        = 6804096;
    
    //Hook addresses and lengths
    
        //Damage calculation
        HookEngine (7567329, 6, "_HOOK_DMG_ONDMG_EVENT");
    
        //Disable animation interruption (not sure if that works actually)
        HookEngine (7609592, 9, "_HOOK_DMG_ONDMG_ANIMATION");
    
        //For Levitation
        HookEngine (zCAIPlayer__CheckPhysics, 6, "_HOOK_CHECK_PHYSICS");
    
        //Preventing from equipping in special cases
        HookEngine (oCNPC__Equip, 5, "_HOOK_EQUIP");
    
        //Preventing unequipping/dropping off some items in special cases
        //---
        HookEngine (oCNPC__DoDropVob, 6, "_HOOK_DODROPVOB");
        HookEngine (oCNPC__UnequipItem, 7, "_HOOK_UNEQUIPITEM");
        //---
    
        //Detection for item picking
        HookEngine (oCNPC__DoTakeVob, 6, "_HOOK_DOTAKEVOB");
    
        //Enhanced Steal function
        HookEngine (oCItemContainer__TransferItem, 5, "_HOOK_STEAL_CONTAINER");    
        HookEngine (oCNPC__CloseInventory, 6, "_HOOK_CLOSE_INVENTORY");
    
        //Preventing plundering of NPC in special cases
        HookEngine (oCNPC__OpenDeadNPC, 7, "_HOOK_OPEN_DEAD_NPC");
    
        //Handler for mob interaction - 
        HookEngine (oCMobInter__CanInteractWith, 7, "_HOOK_MOBINTER_CANINTERACTWITH");
    
        //Improved trading system
        HookEngine (oCViewDialogTrade__OnAccept, 6, "_HOOK_TRADE_ONACCEPT");
    
        //Handler for mob interaction
        HookEngine (oCMobInter__OnTick, 9, "_HOOK_MOBINTER_ONTICK");
    Geändert von F a w k e s (27.09.2018 um 16:05 Uhr)

  10. Beiträge anzeigen #10 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von F a w k e s Beitrag anzeigen
    Code:
    ...
    It would be great if you could contribute those addresses/lengths in case you ported them from LeGo/another script in this forum! I'm not developing for G1, so my support options are pretty limited, but I'm sure those that do work with G1 would love it! Feel free to just send me a PM in case you have any ported addresses (e.g. the first line in your code might be from my damage calculation script?)

  11. Beiträge anzeigen #11 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Da gibt es tatsächlich einen Bug bei Buffs, die keine "Ticks" haben (die werden nicht korrekt refreshed). Fürs erste kannst du das fixen, indem du einfach tickMS = 500 setzt. onTick musst du nicht setzen. Disclaimer: Hab ich nicht getestet.
    Jup, so scheints ohne Probleme zu klappen, danke dir!

    Zitat Zitat von Lehona Beitrag anzeigen
    Fawkes hat dir ja schon eine Liste geschickt, aber falls du nochmal Hilfe bei sowas braucht, meld dich gerne per Instant Messenger (am besten Steam, "Lehona__") bei mir. In einem Forumsthread lässt sich das immer schlecht erklären.

    Aber aushilfsweise kannst du bei der Länge auch einfach raten. Üblicherweise liegen die Werte zwischen 5 und 8, also muss man nicht so viel ausprobieren, und ein falscher Wert sollte sofort crashen. Mir fällt zumindest kein Fall ein, in dem das nur manchmal zu Abstürzen führen würde. Falls mal gar nichts funktioniert, egal welche Werte du probierst, überschreibst du eine der "verbotenen Instruktionen" (Calls, Jumps), die relative Adressen verwenden. Falls das in der Liste nicht beachtet wurde, kannst du das dann nur in IDA rausfinden.
    Werd's mir merken, danke.

    Zitat Zitat von F a w k e s Beitrag anzeigen
    I am using G2A recommended lengths - and if that is not working - then trial and error, so far in 90% of cases it worked like that for me Here is list I've been using successfully (in case you would be trying to hook same addresses):

    Code:
    ...
    Thanks for the advice! There are some interesting hooks there.

    Zitat Zitat von Lehona Beitrag anzeigen
    ... but I'm sure those that do work with G1 would love it!
    I most certainly do!

  12. Beiträge anzeigen #12 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    It would be great if you could contribute those addresses/lengths in case you ported them from LeGo/another script in this forum! I'm not developing for G1, so my support options are pretty limited, but I'm sure those that do work with G1 would love it!
    Ah sorry, I forgot that I have used constant names and not posted addresses anywhere - my previous post edited with constants declaration now
    Zitat Zitat von Lehona Beitrag anzeigen
    Feel free to just send me a PM in case you have any ported addresses
    Your Lego 2.5.0 package is perfect - BIG thank you. This was so far the only address I come across which was not ported EngineAdr_G1.d:
    Code:
    const int oCNPC__RemoveFromSlot = 6971008; //7643760;
    Zitat Zitat von Lehona Beitrag anzeigen
    (e.g. the first line in your code might be from my damage calculation script?)
    Yes! Since I had no idea how you found out the address, I just used a number and didn't use any name for the address.
    From the notes I have (trying to keep a track of all borrowed code for credits once my small mod is finished) this is your original post:
    https://forum.worldofplayers.de/foru...1#post24356119
    Once again - thank you for helping out to those who got stuck with G1.

  13. Beiträge anzeigen #13 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Ich bin jetzt bei dem Versuch das Aufsammeln von Items für ein Weight-System zu hooken, sowohl aus der Welt als auch aus Containern (Truhen, NPCs). Dabei übernahm ich das Grundgerüst von Sektenspinner für G2 und habe die Addresse mit Hilfe der Liste von Fawkes angepasst. Soweit so gut, das funktioniert, ich komme an NPC und Item und kann dementsprechend Fallunterscheidungen für den Hero machen.

    Das gleiche für DoDropVob. Allerdings hat die Sache jetzt einen Haken (kann man sich vllt. schon denken): Gestackte Items werden nicht berücksichtigt, da immer nur die Iteminstanz geliefert wird. Ich bräuchte jedoch auch jeweils die Anzahl der Items, nur habe ich leider keine Ahnung, wie ich da herankommen kann.

    Was ich auch gerne verstehen würde, ist wie genau man mit diesem Snippet in den Hook-Funktionen...
    Code:
    var c_npc slf; slf = MEM_PtrToInst(ECX);				// der NPC, der das Item einsammelt
    var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 4));		// Pointer auf das Item
    ... an die jeweiligen Addressen kommt. Was ist ECX und ESP und wo kommt das her? In der Ikarus-Doku wird von Registern gesprochen...
    @Lehona, scheint mir einen starken Bezug zu IDA zu haben, wenn das hier schlecht zu erklären ist, können wir das gerne, wie du sagtest, über Steam machen.

    Ich vermute einfach mal, dass damit this-Pointer und return-Objekt der Enginefunktion geholt werden. Zumindest erscheint es mir logisch wenn z.B. der Hero als this.DoTakeVob ausführt und das Item damit returned wird um es z.B. ins Inventar zu schreiben.

    Nur wie kommt man darüber an die Anzahl? Oder wird das sogar in einer anderen Funktion gehandelt?
    Ich habe auch einfach mal aus Unverständnis heraus ESP um jeweils ein paar Bytes (die +4 sind doch Bytes, oder?) erhöht oder verringert, in der Hoffnung noch an irgendwelche nützlichen Daten zu kommen, die mit viel Glück sogar ein einfacher Integer mit der Anzahl der Items sind. Leider nicht.
    Geändert von GenerationLost (28.09.2018 um 10:08 Uhr)

  14. Beiträge anzeigen #14 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline
    hey man, try itm.amount

  15. Beiträge anzeigen #15 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Was ESP, ECX und so angeht hat mud-freak vor kurzem ein tutorial geschrieben in dem das auch vorkommt:
    https://wiki.worldofgothic.de/doku.p...ngineforschung

  16. Beiträge anzeigen #16 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von F a w k e s Beitrag anzeigen
    hey man, try itm.amount
    Hm, Deadalus' C_Item doesn't have an amount field, but the engine class has it. How do I get from an instance of C_Item to an engine class object? I assume ESP + 4 contains a pointer to that object?

    EDIT: Oh nvm, I just remembered how it works, this seems to work just fine:
    Code:
    var oCItem itmobj; itmobj = _^(MEM_ReadInt(ESP + 4));
    //itmobj.amount
    Thanks for the hint!

    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Was ESP, ECX und so angeht hat mud-freak vor kurzem ein tutorial geschrieben in dem das auch vorkommt:
    https://wiki.worldofgothic.de/doku.p...ngineforschung
    Ah, dann war ich mit meiner Vermutung also garnicht mal so falsch. ESP zeigt also auf den Anfang eines Stacks der Funktionsargumente enthält?
    Geändert von GenerationLost (28.09.2018 um 12:52 Uhr)

  17. Beiträge anzeigen #17 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von GenerationLost Beitrag anzeigen
    Ah, dann war ich mit meiner Vermutung also garnicht mal so falsch. ESP zeigt also auf den Anfang eines Stacks der Funktionsargumente enthält?
    (Stark vereinfacht) Sind Register Orte in der CPU, an denen man Werte speichern kann - also im Prinzip einfach Variablen. Diese niedrige Abstraktionsebene existiert in Daedalus nicht - der Wert aller Variablen wird im RAM gespeichert und man hat keine Kontrolle, wie Register benutzt werden (will man auch gar nicht). Da es aber unglaublich langsam wäre, nur mit dem RAM zu arbeiten, gibt es eben in CPUs diese Register (das ist geschätzt 100-500x schneller). Je nach Architektur sind das unterschiedlich viele mit unterschiedlichen Namen, aber es gibt eben eine feste Anzahl und man kann keine neuen definieren. Einige der Register haben eine feste Bedeutung (IP bzw. EIP ist zum Beispiel der "Instruction Pointer", da steht also die nächste auszuführende Instruktion), andere kann man völlig frei verwenden. Es gibt allerdings einige Konventionen, wie diese Register benutzt werden. Die wichtigsten Konventionen sind:

    EAX: In diesem Register wird der Rückgabewert gespeichert. Innerhalb einer Funktion wird dieses Register aber natürlich trotzdem zum Speichern von beliebigen Werten genutzt, nur am Ende kommt eben der Rückgabewert rein.

    ESP: In diesem Register steht der Stackpointer. Das ist nicht der Pointer auf irgendeinen Stack, sondern auf den Stack. Ohne da jetzt allzu genau drauf einzugehen sollte man folgendes Wissen: Der RAM ist in zwei Teile aufgeteilt: Der Stack und der Heap. Auf dem Stack liegen lokale Variablen, im Heap alles andere. Außerdem werden Parameter meistens über den Stack übergeben: Der Aufrufer schiebt die Parameter auf den Stack und der Aufgerufene greift dann darauf zu, wie es ihm passt (nicht zwangsläufig von Oben nach Unten). Dieser Register wird meistens nicht manuell verändert, aber Instruktionen wie pop, push oder retn verändern ihn passend. Wenn man tiefer in den Stack möchte (also auf "ältere" Werte zugreifen), muss man Werte auf den ESP addieren. Legt man etwas neues auf den Stack, würde der ESP sich verringern (man sagt: "Der Stack wächst von oben nach unten")

    ECX: Wenn es sowas wie einen this-Pointer gibt, dann liegt er am Anfang der Funktion in ECX. In IDA (und evtl. in den hier geposteten Listen?) erkennt man das daran, dass die Funktion als __thiscall gekennzeichnet ist.

    Über die anderen Register muss man eigentlich nicht viel wissen. In deinem Fall wird also tatsächlich auf den this-Pointer (ECX) zugegriffen und auf einen Parameter, der auf dem Stack liegt (ESP+4). Dieser Parameter ist eben ein Pointer auf das Item, das aufgehoben wird.


    Die Daedalus-Variablen, die den selben Namen wie die Register tragen, sind etwas besonders: Bevor LeGo die Daedalus-Funktion eines Hooks ausführt, werden die Werte einiger Register in diese Variablen geschoben. Nachdem die Daedalus-Funktion ausgeführt wurde, werden die Werte der Variablen zurück in die passenden Register geschoben (im Normalfall ändert sich also nichts).

  18. Beiträge anzeigen #18 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    ...
    Ich danke dir vielmals, das bringt jetzt schon einiges mehr an Klarheit.

    Dazu hätte ich dann mal gerade noch 2 Fragen:
    1. Wie kriege ich raus, was gerade so aufm Stack für die jeweilige Funktion liegt? Auch wieder mit IDA?
    2. Gibt es eine etwas universellere Funktion um auf Item Pickups zu reagieren? Sowas wie AddToInventory? Das wäre einfacher als jede Funktion zu hooken, in der irgendwo von irgendwas ein Item transferiert wird (wie DoTakeVob, TransferItem o.Ä.)
    Geändert von GenerationLost (29.09.2018 um 02:26 Uhr)

  19. Beiträge anzeigen #19 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von GenerationLost Beitrag anzeigen
    Ich danke dir vielmals, das bringt jetzt schon einiges mehr an Klarheit.

    Dazu hätte ich dann mal gerade noch 2 Fragen:
    1. Wie kriege ich raus, was gerade so aufm Stack für die jeweilige Funktion liegt? Auch wieder mit IDA?
    2. Gibt es eine etwas universellere Funktion um auf Item Pickups zu reagieren? Sowas wie AddToInventory? Das wäre einfacher als jede Funktion zu hooken, in der irgendwo von irgendwas ein Item transferiert wird (wie DoTakeVob, TransferItem o.Ä.)
    Sorry für die Verspätung, ich hatte hier drei Tage Totalausfall.

    1. Wenn es sich nicht gerade um Funktionsparameter am Anfang einer Funktion handelt, dann nur mit IDA, indem du die Assembly liest bzw. nachvollziehst.
    2. Nicht dass ich wüsste, auch das findest du am besten raus, indem du dir eine der verantwortlichen Funktionen (e.g. DoTakeVob) mal genauer in IDA anschaust IDA sollte dir auch den globalen Function Call Graph anzeigen lassen können, da siehst du, wie die Funktionen sich untereinander aufrufen (und kannst halbwegs sinnvoll checken, welche Funktionen von DoTakeVob() verwendet werden).

  20. Beiträge anzeigen #20 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Sorry für die Verspätung, ich hatte hier drei Tage Totalausfall.

    1. Wenn es sich nicht gerade um Funktionsparameter am Anfang einer Funktion handelt, dann nur mit IDA, indem du die Assembly liest bzw. nachvollziehst.
    2. Nicht dass ich wüsste, auch das findest du am besten raus, indem du dir eine der verantwortlichen Funktionen (e.g. DoTakeVob) mal genauer in IDA anschaust IDA sollte dir auch den globalen Function Call Graph anzeigen lassen können, da siehst du, wie die Funktionen sich untereinander aufrufen (und kannst halbwegs sinnvoll checken, welche Funktionen von DoTakeVob() verwendet werden).
    Kein Problem!
    Ich sehe schon, ich werde um IDA für meine Zwecke wohl nicht rumkommen.

Seite 1 von 4 1234 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