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 28 von 31 « Erste ... 17212425262728293031 Letzte »
Ergebnis 541 bis 560 von 606
  1. Beiträge anzeigen #541 Zitieren
    Apprentice Avatar von TheFallOne
    Registriert seit
    Mar 2020
    Beiträge
    11
     
    TheFallOne ist offline
    Zitat Zitat von Umfi Beitrag anzeigen
    Hey, hatte ich noch auf meiner alten Festplatte.

    https://upload.worldofplayers.de/fil...tel_Source.zip

    vielen danke ^^. sehr nett!!!!!!

  2. Beiträge anzeigen #542 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von N1kX Beitrag anzeigen
    Hello. In one Polish mod, the old version of ikarus is very different from the base version 1.2.0. Compared with the actual, there are differences that seem reasonable. Should I upgrade to current?
    I'm not sure what your question is. When comparing your uploaded Ikarus.d to the one from version 1.2.2, I don't see any reason why not to update to version 1.2.2.

  3. Beiträge anzeigen #543 Zitieren
    Veteran Avatar von N1kX
    Registriert seit
    Aug 2018
    Ort
    Serov
    Beiträge
    640
     
    N1kX ist gerade online
    Extensions that made poles (Polish) optional? I will build an intermediate version with the latest versions of extenders and give the mod for tests, see how they go.
    Thanks.

  4. Beiträge anzeigen #544 Zitieren
    Kämpfer
    Registriert seit
    Feb 2016
    Ort
    Dresden
    Beiträge
    349
     
    gladi1994 ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Mittlerweile haben sich einige Ausbesserungen an Ikarus angesammelt und wir möchten Version 1.2.2 vorstellen. Größtenteils handelt es sich um interne Verbesserungen um seltenen Abstürzen entgegen zu wirken oder kleine Fehler auszumerzen. Für den Normalgebrauch ist ansonsten vor allem die Vervollständigung der Engineklassen unter Gothic 1 interessant. So sind Gothic 1 und Gothic 2 nun endlich gleich auf.

    Folgende Verbesserungen wurden eingebaut (click here for English):
    • Sicherere Implementierungen von MEM_ReadByte und MEM_WriteByte: Behebt seltene Abstürze und macht es etwas schneller
    • Fehlende Gothic 1 Klassen hinzugefügt (für eine vollständige Liste siehe hier)
    • Weitere Hlp_Is-Funktionen für Mobs hinzugefügt (für eine vollständige Liste siehe hier)
    • STR_Lower Funktion hinzugefügt (analog zu STR_Upper)
    • Hexadezimal-Umrechnungen korrigiert: Großbuchstaben A bis F in MEMINT_HexCharToInt und MEMINT_ByteToKeyHex hinzugefügt
    • Warnungen verborgen, wenn bei Initialisierung keine Kamera, Infomanager oder Spawnmanager existieren, z.B. wenn aus Init_Perceptions initialisiert wird
    • MEM_GetFuncIDByOffset für mit MEM_ReplaceFunc überschriebene Funktionen korrigiert, z.B. MEM_ReadInt: While-Schleifen laufen nun stabiler
    • Erkennung des Codestack-Endes bei Sprüngen (Tokenizing) eingebaut: Endlosschleifen werden nun vermieden
    • MEMINT_SwitchG1G2 ausgebessert
    • Potentielle Absturzquelle beim Cachen von Funktionen in MEM_CallByString behoben

    Fürs Arbeiten mit Ikarus ändert sich dadurch nichts. Aufgrund der vielen Fixes ist dies Aktualisierung sehr zu empfehlen.

    Heruntergeladen können die Skripte zu Ikarus 1.2.2 hier: https://github.com/Lehona/Ikarus/releases/tag/v1.2.2

    Ich würde an dieser Stelle einen Moderatoren bitten, den Einleitungspost vom Ikarus-Thread mit dem Download-Link zur Version 1.2.2 zu ergänzen. Vielen Dank!
    Vielen Dank für die neue Version!

    Hab ein wenig gebraucht, bis ich diesen Post und die aktuelle Ikarus Version gefunden habe, da sie im Startpost noch nicht erwähnt ist.
    Vielleicht wäre es der Übersicht halber möglich, das dort noch zu ergänzen?
    Ansonsten tolle Sache, vielen Dank!

  5. Beiträge anzeigen #545 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Guten Tag an alle

    Wäre schön wenn ein Assembler Guru mir helfen könnte.

    man nehme an, ich habe einen Hook bei 0x006C3685, jetzt möchte ich gerne die adresse welche bei 0x006C3677 in ECX geladen wird herausfinden und dort meinen eigenen Wert eintragen (es ist ein zSTRING).

    Ich bin leider nicht erfahren genug, weder in assembler noch mit IDA um zu verstehen was die ganzen sonderzeichen und Werte genau meinen.

    - Was heißt das [ ] welches die rechte Seite umhüllt?
    - Was ist "0C8H" in diesem Fall? (0C8 sieht aus wie das erste Token nach der Adresse 006C3677, hängt das zusammen?)
    - var_8C ist laut IDA "-000000000000008C" ( ist das jetzt "-140" oder "140" wie steht dieser Stackpointer(?) in Relation?
    - Wie kann ich mein verhalten mit Ikarus replizieren? (Ich denke MEM_ReadInt, Mem_WriteString und Pointer-Mathe)

    Mir geht es darum generell zu verstehen wie ich das Assembler genauer deuten kann (speziell in diesem Fall geht es mir aber auch ums Ergebnis )

    Code:
    .text:006C3677 0C8 8D 4C 24 3C           lea     ecx, [esp+0C8h+var_8C] ; Load Effective Address
    .text:006C367B 0C8 51                    push    ecx
    .text:006C367C 0CC 8B CF                 mov     ecx, edi
    .text:006C367E 0CC E8 FD F1 04 00        call    ?GetName@oCItem@@QAE?AVzSTRING@@H@Z ; oCItem::GetName(int)
    .text:006C3683 0C4 3B C5                 cmp     eax, ebp        ; Compare Two Operands
    .text:006C3685 0C4 C6 44 24 7C 03        mov     byte ptr [esp+0C4h+var_48], 3

  6. Beiträge anzeigen #546 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    IDA stellt hexadezimale Zahlen mit einem h-Suffix dar. 0C8H ist also einfach 0xC8. lea steht für load effective address, was ein etwas verwirrender Name ist, aber im Prinzip kann man damit einfach drei Werte auf einmal addieren (je nach Wert). Dort wird also einfach ESP + 0xC8 - 0x8C gerechnet. Da ESP bereits als Daedalus-Variable existiert, kannst du das einfach so ausrechnen innerhalb des Hooks.

    var_XX sind Offsets von lokalen Variablen (relativ zum Base Pointer, d.h. der Wert den ESP am Beginn der Funktion hatte), die IDA erkannt hat. Die Stackpointer-relative Adressierung löst das dann immer auf in [esp + stack_offset + var_XX], da sich das Offset zum ESP ändern kann.

  7. Beiträge anzeigen #547 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    IDA stellt hexadezimale Zahlen mit einem h-Suffix dar. 0C8H ist also einfach 0xC8. lea steht für load effective address, was ein etwas verwirrender Name ist, aber im Prinzip kann man damit einfach drei Werte auf einmal addieren (je nach Wert). Dort wird also einfach ESP + 0xC8 - 0x8C gerechnet. Da ESP bereits als Daedalus-Variable existiert, kannst du das einfach so ausrechnen innerhalb des Hooks.

    var_XX sind Offsets von lokalen Variablen (relativ zum Base Pointer, d.h. der Wert den ESP am Beginn der Funktion hatte), die IDA erkannt hat. Die Stackpointer-relative Adressierung löst das dann immer auf in [esp + stack_offset + var_XX], da sich das Offset zum ESP ändern kann.
    Grandios, danke für die Erklärung. Ich wusste nicht was genau das "0C8h" in IDA dargestellt hat.
    Jetzt mit der Info das es der aktuelle stack_offset ist, konnte ich problemlos auf die gewünschte lokale Variable zugreifen und sie manipulieren.

    Vielen Dank!

  8. Beiträge anzeigen #548 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Das Stackoffset kann man sich auch gut anzeigen lassen in IDA, unter Optionen -> General solltest du da einen Haken setzen können.

  9. Beiträge anzeigen #549 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Das Stackoffset kann man sich auch gut anzeigen lassen in IDA, unter Optionen -> General solltest du da einen Haken setzen können.
    joa, der ist ja direkt rechts neben der Adresse, zwischen den Instruktionen ("bytes")

  10. Beiträge anzeigen #550 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    EDIT: Kaffee sollte vor dem Programmieren getrunken werden.

    Ich suche einen Index, was sollte ich benutzen?
    MEM_GetParserSymbol.
    FALSCH!

    Richtig ist MEM_GetSymbolIndex!!
    Damit klappt auch alles... Tut mir leid fürs vollmüllen vom Thread

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

    Da bin ich nochmal.

    Möchte gerade bisschen dreckigen Code bei mir aufräumen und müsste dafür die "Hlp_GetInstanceId" einer Instanz anhand des Namens herausfinden.

    Man nehme: "ITKE_MEINKEY" als Name einer Instanz welche gesucht werden soll.

    Ich bräuchte hier den Wert der Instanz, welcher für "Npc_HasItems(npc, ITKE_MEINKEY)" benötigt würde.

    Zuvor habe ich dafür über eine Schleife in Daedalus das ganze Inventar abgesucht bis ich das gewünschte Item gefunden habe.


    Jetzt würde ich gerne den Code bisschen kompakter gestalten und habe mir den
    "MEM_GetParserSymbol" und die "zCPar_Symbol" Klasse mal angeschaut.
    Generell bekomme ich so einen Wert, nur kann ich mit den Werten für Instanzen nichts anfangen.

    Code:
    var zCPar_Symbol sym; sym = MEM_PtrToInst(parSym);
    sym.content: 386044 // Stackoffset, laut Beschreibung
    sym.offset: 0       // Ist leer
    sym.pos_beg: 44874  // Position an der die Instanz geparst wurde?
    Nun müsste ich anhand der Werte irgendwie an den Wert kommen den ich brauche:
    Npc_HasItems(npc, ITKE_MEINKEY) <-- // IntToString(ITKE_MEINKEY) = 16600

    Wie schaffe ich das? Leider blicke ich hier nicht durch.

    Variablen und Konstanten über den Parser und das Symbol zu manipulieren ist dagegen ein kinderspiel ...
    Geändert von Kirides (17.08.2020 um 13:59 Uhr)

  11. Beiträge anzeigen #551 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Nochmal ich, diesmal ein anderes Thema:

    Es wäre ziemlich gut wenn es in Ikarus eine Möglichkeit gebe, funktionen mittels ID zu "replacen"

    so könnte man z.B. eine Initialisierende, wrappende Funktion mit gleichen Funktionsparametern bauen, welche bei existenz einer vorhanden Funktion diese aufruft und sich selbst replacet.

    Ganz in der Manier von "MEM_ReplaceFunc(var func f1, var func f2)", vielleicht "MEM_ReplaceFuncWithFuncId(var func f1, var int funcId)"

    Das wäre z.B. für Patches ziemlich praktisch, diese könnten sich für bestimmte "mods" (z.B. GothicGame, also original spiel) spezialisieren und dadurch minimal effizienter werden.

    Aktuell müsste man dafür einiges an Code von Ikraus kopieren um das zu ermöglichen. Ich meine... es ist nur eine mikro Optimierung... aber es *kann* die performance innerhalb schleifen verbessern. Ikarus selbst mach ja schon ordentlich gebrauch vom austauschen von implementierungen.


    Kleines Beispiel einer funktion welche bereits existieren könnte, oder auch nicht und sich dementsprechend austauscht:
    Code:
    func void Patch_ClearRuneInv(var C_Npc slf) {
    	const int once = 1;
    	const int fnId = -1;
    	if (once) {
    		fnId = +MEM_FindParserSymbol("B_ClearRuneInv");
    		once = 0;
    	};
    	if (fnId != -1) {
    		MEM_ReplaceFuncWithFuncId(Patch_ClearRuneInv, fnId);
    		Patch_ClearRuneInv(slf); // call new function.
    	};
    };
    Spoiler:(zum lesen bitte Text markieren)

    Ungetestet!

    Code:
    // Funktion kopiert und die erste Zuweisung durch direkte funcID ausgetauscht
    func int MEM_GetFuncOffsetById(var int fncId) {
        var int r;
        r = fncId;
        r = MEM_ReadIntArray(contentSymbolTableAddress, r); //symbolTable[ID(fnc)]
        r = MEM_ReadInt(r + zCParSymbol_content_offset); //symbolTable[ID(fnc)].content
        return r + 0;
    };
    
    
    // Aufruf von MEM_GetFuncOffset mit "MEM_GetFuncOffsetById" ersetzt.
    func void MEM_ReplaceFuncWithFuncId(var func f1, var int f2Id) {
        var int ptr;    ptr    = MEM_GetFuncPtr(f1);
        var int target; target = MEM_GetFuncOffsetById(f2Id);
        
        /* jetzt bitte in einem Rutsch, nicht, dass da einer was ersetzen will, was ich brauche. */
        MEM_WriteByte(ptr, zPAR_TOK_JUMP);
        MEM_WriteInt (ptr + 1, target);
    };

  12. Beiträge anzeigen #552 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    Es wäre ziemlich gut wenn es in Ikarus eine Möglichkeit gebe, funktionen mittels ID zu "replacen"

    so könnte man z.B. eine Initialisierende, wrappende Funktion mit gleichen Funktionsparametern bauen, welche bei existenz einer vorhanden Funktion diese aufruft und sich selbst replacet.
    Du beschreibst fast haargenau was Daedalus-Hooks machen, siehe hier und hier. MEM_ReplaceFunc ist tatsächlich nur für interne Dinge geeignet, HookDaedalus ist für "Nutzer". Es bietet mehr Möglichkeiten (Ersetzen einer Funktion, voranschieben oder nachschieben von weiterem Code) und ist sicherer (lässt sich stacken).

    Zitat Zitat von Kirides Beitrag anzeigen
    Das wäre z.B. für Patches ziemlich praktisch, diese könnten sich für bestimmte "mods" (z.B. GothicGame, also original spiel) spezialisieren und dadurch minimal effizienter werden.
    Das wird bereits an einigen Stellen in der Ninja-Dokumentation themasiert, wie hier. Das kann ich noch einmal empfehlen nachzulesen. Bitte dem Schema folgen, weil HookDaedalus gerade im Kontext von stapelbaren Patches sicherer ist als MEM_ReplaceFunc. Für konkrete Beispiele kannst du mal in einige meiner Patches reinschauen, da habe ich das teilweise verwendet.

  13. Beiträge anzeigen #553 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Du beschreibst fast haargenau was Daedalus-Hooks machen, siehe hier und hier. MEM_ReplaceFunc ist tatsächlich nur für interne Dinge geeignet, HookDaedalus ist für "Nutzer". Es bietet mehr Möglichkeiten (Ersetzen einer Funktion, voranschieben oder nachschieben von weiterem Code) und ist sicherer (lässt sich stacken).


    Das wird bereits an einigen Stellen in der Ninja-Dokumentation themasiert, wie hier. Das kann ich noch einmal empfehlen nachzulesen. Bitte dem Schema folgen, weil HookDaedalus gerade im Kontext von stapelbaren Patches sicherer ist als MEM_ReplaceFunc. Für konkrete Beispiele kannst du mal in einige meiner Patches reinschauen, da habe ich das teilweise verwendet.
    Wenn ich das richtig lese, dann würde eine über HookDaedalusFunc-gehookte Funktion kaputt gehen, wenn man umgekehrt hookt

    Code:
    func void Patch_I_Will_be_Replaced() {
        HookDaedalusFunc(Patch_I_Will_be_Replaced, VanillaFunc);
    };
    Wenn nun VanillaFunc aus irgendeinem Grund "ContinueCall" aufrufen würde, würde die Funktion wieder in diese Funktion reinspringen, oder verstehe ich da etwas falsch?

  14. Beiträge anzeigen #554 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    ContinueCall funktioniert nicht über einen Stack sondern wird abhängig von der Caller-Position resolved. Das heißt, dass solange du VanillaFunc nicht noch irgendwo anders als zweiten Parameter von HookDaedalusFunc angegeben hast, sollte es da keine Probleme geben (und wenn doch gibt es einen Fehler und keine Hook wird eingesetzt). Theoretisch kann man in solchen Fällen nur ContinueCall nicht verwenden, aber da man das meistens tun möchte, haben wir das komplett unterbunden.

    Vielleicht versteh ich aber dein Beispiel falsch. Kannst du ggf. das noch ein bisschen ausführen und erklären, welches "Setup" benötigt wird um einen Bug zu triggern (und was der Bug ist)?

  15. Beiträge anzeigen #555 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    ContinueCall funktioniert nicht über einen Stack sondern wird abhängig von der Caller-Position resolved. Das heißt, dass solange du VanillaFunc nicht noch irgendwo anders als zweiten Parameter von HookDaedalusFunc angegeben hast, sollte es da keine Probleme geben (und wenn doch gibt es einen Fehler und keine Hook wird eingesetzt). Theoretisch kann man in solchen Fällen nur ContinueCall nicht verwenden, aber da man das meistens tun möchte, haben wir das komplett unterbunden.

    Vielleicht versteh ich aber dein Beispiel falsch. Kannst du ggf. das noch ein bisschen ausführen und erklären, welches "Setup" benötigt wird um einen Bug zu triggern (und was der Bug ist)?
    Der folgene code startet eine Dauerschleife, wenn der ContinueCall un-kommentiert wird.
    Patch_CrashGame() ist der Einstiegspunkt hierbei.

    Code:
    func void CrashGame() {
    	MEM_Info("Vor ContinueCall");
    	// ContinueCall();
    	MEM_Info("Nach ContinueCall");
    };
    
    func void Patch_CrashGame() {
    	HookDaedalusFuncS("Patch_CrashGame", "CrashGame");
    	Patch_CrashGame();
    	// Oder auch direkt über den Call:
    	CrashGame();
    };
    Ja, ich weiß, das ist recht unwahrscheinlich aber es könnte passieren


    Aber ist auch nicht wirklich wichtig. Ich kann ohne probleme damit leben mir einfach irgendwelche FunctionIDs als const zu merken und dadurch nur noch CallByID(...) aufrufe haben zu müssen.
    Geändert von Kirides (17.08.2020 um 19:14 Uhr)

  16. Beiträge anzeigen #556 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Dass das eine Dauerschleife erzeugt ist ja klar, unabhängig vom Rest der Funktion:

    Code:
    func void Patch_CrashGame() {
    	HookDaedalusFuncS("Patch_CrashGame", "CrashGame");
    	Patch_CrashGame();
    ...
    };
    Und auch wenn du nur den Call in CrashGame() drin hast: Was sollte deiner Meinung nach denn passieren? In meinen Augen erzeugst du auch hier ganz klar eine Dauerschleife, schließlich würde dein Code so aussehen, hättest du ihn ohne Hooks geschrieben:

    Code:
    func void CrashGame() {
        // Hier direkt anstatt per Hook eingefügt
        // MEM_Call wegen der Parsereihenfolge    
        MEM_Call(Patch_CrashGame);
    };
    
    func void Patch_CrashGame() {
        CrashGame();
    };
    Da ist ja recht klar, dass das eine Dauerschleife wird.

    Edit: Ich glaube ich habe vertauscht, welche der Funktionen bei dir gehookt wird :P Aber solange CrashGame bzw. Funktionen, die als Hooks verwendet werden, nicht anderweitig aufgerufen werden (was sowieso eher ein No-Go ist, implementierungsunabhängig), sehe ich noch immer keinen Fehler.
    Geändert von Lehona (17.08.2020 um 19:35 Uhr)

  17. Beiträge anzeigen #557 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Ich versteh auch nicht ganz was du denn genau vorhast. Dein Beispiel von oben mit B_ClearRuneInv sähe ganz einfach so aus:

    Code:
    func void Patch_ClearRuneInv(var C_Npc slf) {
    
        // Do something crazy
    
        // Continue with original B_ClearRuneInv (or omit this to act as replacement)
        PassArgumentN(slf);
        ContinueCall();
    };
    
    
    /*
     * Initialization
     */
    func void Patch_Init() {
    
        // ...
    
        // Hook Daedalus function if it exists (otherwise nothing happens - super clean for a patch)
        HookDaedalusFuncS("B_ClearRuneInv", "Patch_ClearRuneInv");
    };
    Ist doch ganz easy?! Schau dir mal den Mud-Patch an, für weitere Beispiele genau dieser Art.

  18. Beiträge anzeigen #558 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Ich versteh auch nicht ganz was du denn genau vorhast. Dein Beispiel von oben mit B_ClearRuneInv sähe ganz einfach so aus:

    ....
    Ist doch ganz easy?! Schau dir mal den Mud-Patch an, für weitere Beispiele genau dieser Art.
    Das was ich meinte war genau *anders* herum. Ich will keine Daedalus Funktionen um funktionalität erweiter, oder austauschen, sondern eine PATCH funktion konditional durch eine vanilla funktion austauschen um solche Konstrukte hier loszuwerden:

    Code:
    func void Patch_B_ClearRuneInv(var C_NPC targetNpc) {
        const int once = 1;
        const int fnId = -1;
        if (once) {
            fnId = +MEM_FindParserSymbol("B_ClearRuneInv");
            once = 0;
        };
        if (fnId != -1) {
            MEM_PushInstParam(targetNpc); // Push targetNpc for function parameter.
            MEM_CallByID(fnId);
        } else {
            // Hier selber das Inventar von targetNpc aufräumen
        };
    };
    Wie ich schon meinte, mir ist das eigentlich egal wenn das nicht funktionieren soll, geht ja auch auf dem Weg wie du es beschrieben hast

    Und es ist davon mal abgesehen auch deutlich schöner

  19. Beiträge anzeigen #559 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    Das was ich meinte war genau *anders* herum.
    Meine Antwort gilt anders herum dafür auch:

    Code:
    func void Patch_B_ClearRuneInv(var C_NPC targetNpc) {
        // Hier selber das Inventar von targetNpc aufräumen
    };
    
    /*
     * Initialization
     */
    func void Patch_Init() {
    
        // ...
    
        // Replace the function above if the mod already provides it
        HookDaedalusFuncS("Patch_B_ClearRuneInv", "B_ClearRuneInv");
    };

    Zitat Zitat von Kirides Beitrag anzeigen
    Und es ist davon mal abgesehen auch deutlich schöner
    Ich finde diesen Coder hier schöner, kürzer und leserlicher.



    Möglicherweise habe ich dich evtl. noch nicht komplett verstanden.

  20. Beiträge anzeigen #560 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Meine Antwort gilt anders herum dafür auch:

    Code:
    func void Patch_B_ClearRuneInv(var C_NPC targetNpc) {
        // Hier selber das Inventar von targetNpc aufräumen
    };
    
    /*
     * Initialization
     */
    func void Patch_Init() {
    
        // ...
    
        // Replace the function above if the mod already provides it
        HookDaedalusFuncS("Patch_B_ClearRuneInv", "B_ClearRuneInv");
    };


    Ich finde diesen Coder hier schöner, kürzer und leserlicher.



    Möglicherweise habe ich dich evtl. noch nicht komplett verstanden.
    Das kam jetzt vielleicht falsch rüber. Ich meinte damit deinen Code, das replace direkt in einem Init anstatt on-demand wie ich das gedacht hätte.

    Mit deinem (deutlich schöneren!) Code ist direkt ersichtlich daß bei Kondition X der Code ausgetauscht wird.

Seite 28 von 31 « Erste ... 17212425262728293031 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