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 2 von 2 « Erste 12
Ergebnis 21 bis 25 von 25
  1. #21
    Falugify
    Gast
     
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Danke für die Warnung! Das war mir bei meinen kurzen Tests nicht aufgefallen und ich verstehe auch nich ganz, was da passiert. (Sollten die hooks die sonstigen Funktionen nicht unangetastet lassen? Oder überschreibt das Senden der perception interne Variablen, die LeGo nicht automatisch zurücksetzt / zurücksetzen kann?)

    mit oder ohne Waffe?

    rückwärts gegen eine Wand oder eine Steigung, die man vorwärts normal hoch gehen könnte?
    Wenn ich die Perception mit meiner Methode in einer FF setze, passiert das nicht und mir ist das auch nur sehr zufällig aufgefallen, als ich zum Beispiel auf Onars Hof war. Schon wenn man vom Bennets Schmiede den kleinen Hügel Richtung Raoul zurück geht (der nun auch wirklich nicht steil ist, sondern fast eben) sieht man dass die Spielfigur in die Erde versinkt beim Rückwärts gehen.

    Ich habe in meiner Mod den Schläfertempel integriert. Bei den Stufen vor dem Eingang passierte das Selbe, nur dass ich sogar durch die Treppen glitchen konnte. Als ich die Hooks deaktivierte ging es dann wieder. Es kann auch durchaus sein dass es mit den Springen genauso verläuft, weil ich auch als Ork versank, nachdem ich gesprungen hatte. Ich habe nicht explizit getestet. Aufgefallen ist es mir in Gothic 2. Auf jeden Fall war es so ohne Waffe und ich glaube es war auch mit Waffe. Beim Seitwärts hingegen ist mir nichts aufgefallen, aber das habe ich auch nur kurz probiert.

  2. Beiträge anzeigen #22
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    habe ich gerade getestet und passiert bei mir auch beim Rückwärtsgehen, insbesondere beim Rückwärtsgehen mit gezogener Armbrust (nicht bei Nahkampfwaffen). Es dürfte also am Hook von
    Code:
        const int oCAniCtrl_Human__PC_GoBackward_G2 = 7019968; //0x6B1DC0
    Meine Vermutung: das Senden der Perception überschreibt eine Variable (self?), wegen der später etwas in PC_GoBackward nicht mehr richtig funktioniert. Jetzt könnte man natürlich eine andere Funktion hooken oder dieselbe Funktion an anderer Stelle, aber letztlich ist es vielleicht einfacher, eine FrameFunction zu verwenden.

    Dafür einfach innerhalb der *Perception() Funktionen, die an der gehookten Stelle aufgerufen werden, nur die Variable auf TRUE setzen und zusätzlich eine FrameFunction laufen haben (z.B. 1 pro Sekunde, je nachdem, wie schnell man reagieren muss / möchte). Dort dann, falls eine der 3 Variablen gesetzt ist, die Perception senden und die Variablen auf FALSE zurücksetzen. Ich passe das gleich mal in meinem vorherigen Beitrag an.

    Vorteil gegenüber der Abfrage der Animation: die FrameFunction kann größeren delay haben, da sie nicht während der Animation aufgerufen werden muss, und die Abfrage der 3 Integer-Variablen (die man natürlich noch in eine einzige Variable zusammenlegen kann, wenn man ohnehin keine Unterscheidung zwischen strafing, rückwärts und springen vornimmt) ist vermutlich performanter als die String-Vergleiche / Übergabe.

  3. #23
    Falugify
    Gast
     
    Zitat Zitat von Milky-Way Beitrag anzeigen
    habe ich gerade getestet und passiert bei mir auch beim Rückwärtsgehen, insbesondere beim Rückwärtsgehen mit gezogener Armbrust (nicht bei Nahkampfwaffen). Es dürfte also am Hook von
    Code:
        const int oCAniCtrl_Human__PC_GoBackward_G2 = 7019968; //0x6B1DC0
    Meine Vermutung: das Senden der Perception überschreibt eine Variable (self?), wegen der später etwas in PC_GoBackward nicht mehr richtig funktioniert. Jetzt könnte man natürlich eine andere Funktion hooken oder dieselbe Funktion an anderer Stelle, aber letztlich ist es vielleicht einfacher, eine FrameFunction zu verwenden.

    Dafür einfach innerhalb der *Perception() Funktionen, die an der gehookten Stelle aufgerufen werden, nur die Variable auf TRUE setzen und zusätzlich eine FrameFunction laufen haben (z.B. 1 pro Sekunde, je nachdem, wie schnell man reagieren muss / möchte). Dort dann, falls eine der 3 Variablen gesetzt ist, die Perception senden und die Variablen auf FALSE zurücksetzen. Ich passe das gleich mal in meinem vorherigen Beitrag an.

    Vorteil gegenüber der Abfrage der Animation: die FrameFunction kann größeren delay haben, da sie nicht während der Animation aufgerufen werden muss, und die Abfrage der 3 Integer-Variablen (die man natürlich noch in eine einzige Variable zusammenlegen kann, wenn man ohnehin keine Unterscheidung zwischen strafing, rückwärts und springen vornimmt) ist vermutlich performanter als die String-Vergleiche / Übergabe.
    Ja, kann ich bestätigen. Ich habe es in einer Sekunde einmal (Tickrate 1000), und finde es besser als jeden Frame wie ich es ganz am Anfang hatte. Ich denke das werde ich auch so belassen.

  4. Beiträge anzeigen #24
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Du / Ihr könnt mal die folgenden Hooks probieren.

    Diese passieren ganz am Ende von "oCAniCtrl_Human :: _Backward" welches vorher von PC_GoBackward aufgerufen wird.
    An der Stelle müsste man noch einbauen "if Npc_IsPlayer(npc)" damit es nur den Spieler triggert.
    Die Hooks greifen an der spät-möglichsten Stelle von _Backward() kurz bevor der "SetBodyState" vom NPC gesetzt wird.

    Es wird getriggert wenn man Rückwärts geht normal oder auch mit gezogener Armbrust / Bogen

    Gothic drosselt die Eingaben vom Spieler sodass bei mir nie mehr als 2-4 Aufrufe (pro Sekunde) von dem Hook waren, wenn ich "Zurück" durchgehalten habe.

    Die Kollision vom Npc wird erst in ::_Backward() mithilfe von "npc->SetCollDet(1);" gesetzt. Daher nehme ich an das dies das Problem mit dem ursprünglichen Hook war.

    Code:
    func void hook__Backward() {
        const int npcPtr_offset = 300;
        var int npcPtr; npcPtr = MEM_ReadInt(ESI + npcPtr_offset);
    
        var c_npc npc; npc = _^(npcPtr);
    
        MEM_Info(ConcatStrings("Npc: ", npc.name));
    };
    
    func void hooks_init() {
        HookEngineF(7044586, 6, hook__Backward); // ANI_WALKMODE_RUN
        HookEngineF(7044556, 6, hook__Backward); // ANI_WALKMODE_WALK
        HookEngineF(7044526, 6, hook__Backward); // ANI_WALKMODE_SNEAK
    }
    Geändert von Kirides (05.10.2020 um 08:35 Uhr)

  5. Beiträge anzeigen #25
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    Du / Ihr könnt mal die folgenden Hooks probieren.

    Diese passieren ganz am Ende von "oCAniCtrl_Human :: _Backward" welches vorher von PC_GoBackward aufgerufen wird.
    An der Stelle müsste man noch einbauen "if Npc_IsPlayer(npc)" damit es nur den Spieler triggert.
    Die Hooks greifen an der spät-möglichsten Stelle von _Backward() kurz bevor der "SetBodyState" vom NPC gesetzt wird.

    Es wird getriggert wenn man Rückwärts geht normal oder auch mit gezogener Armbrust / Bogen

    Gothic drosselt die Eingaben vom Spieler sodass bei mir nie mehr als 2-4 Aufrufe (pro Sekunde) von dem Hook waren, wenn ich "Zurück" durchgehalten habe.

    Die Kollision vom Npc wird erst in ::_Backward() mithilfe von "npc->SetCollDet(1);" gesetzt. Daher nehme ich an das dies das Problem mit dem ursprünglichen Hook war.

    Code:
    func void hook__Backward() {
        const int npcPtr_offset = 300;
        var int npcPtr; npcPtr = MEM_ReadInt(ESI + npcPtr_offset);
    
        var c_npc npc; npc = _^(npcPtr);
    
        MEM_Info(ConcatStrings("Npc: ", npc.name));
    };
    
    func void hooks_init() {
        HookEngineF(7044586, 6, hook__Backward); // ANI_WALKMODE_RUN
        HookEngineF(7044556, 6, hook__Backward); // ANI_WALKMODE_WALK
        HookEngineF(7044526, 6, hook__Backward); // ANI_WALKMODE_SNEAK
    }
    Danke, das scheint zu funktionieren (und somit würde die FrameFunction nicht mehr gebraucht). Falls jemand meinen aktuellen Code verwenden möchte, siehe früheren Post und dort die Hooks ersetzen durch:
    Code:
    var int hero_strafing;
    var int hero_jumping;
    var int hero_gobackward;
    
    func void StrafePerception() {
    
        // exit function if player is in sneak mode
        if Npc_GetWalkMode(hero) == NPC_SNEAK
        {
            return;
        };
    
        const int PERC_INVERVAL = 1000; // As in oCAIHuman::CreateFootStepSound
        var int percTimer; percTimer += MEM_Timer.frameTime;
        if (percTimer >= PERC_INVERVAL) {
            percTimer -= PERC_INVERVAL;
            hero_strafing = TRUE;
            Npc_SendPassivePerc(hero, PERC_ASSESSQUIETSOUND, hero, hero);
            hero_strafing = FALSE;
        };
    };
    func void StrafePerception_Init() {
        const int oCNpc__EV_STRAFE_player_G1 = 7662588; //0x74EBFC
        const int oCNpc__EV_STRAFE_player_G2 = 6834660; //0x6849E4
        HookEngineF(MEMINT_SwitchG1G2(oCNpc__EV_STRAFE_player_G1, oCNpc__EV_STRAFE_player_G2), 7, StrafePerception);
    };
    
    func void JumpPerception() {
        hero_jumping = TRUE;
        Npc_SendPassivePerc(hero, PERC_ASSESSQUIETSOUND, hero, hero);
        hero_jumping = FALSE;
    };
    func void JumpPerception_Init() {
        const int oCAniCtrl_Human__PC_JumpForward_G2 = 7020032; //0x6B1E00
        HookEngineF(oCAniCtrl_Human__PC_JumpForward_G2, 5, JumpPerception);
    };
    
    func void GoBackwardPerception() {
        // exit function if player is in sneak mode
        if Npc_GetWalkMode(hero) == NPC_SNEAK
        {
            return;
        };
        hero_gobackward = TRUE;
        Npc_SendPassivePerc(hero, PERC_ASSESSQUIETSOUND, hero, hero);
        hero_gobackward = FALSE;
    };
    func void hook__backward() {
        const int npcPtr_offset = 300;
        var int npcPtr; npcPtr = MEM_ReadInt(ESI + npcPtr_offset);
        var c_npc npc; npc = _^(npcPtr);
        if (Npc_IsPlayer(npc))
        {
            GoBackwardPerception();
        };
    };
    func void GoBackwardPerception_Init() {
        // thanks to mud-freak and Kirides:
        // https://forum.worldofplayers.de/forum/threads/1536360-S%C3%A4mtliche-schlafende-NPCs-und-Monster-ignorieren-den-Spieler-trotz-BS_RUN?p=26545171&viewfull=1#post26545171
        
        // hooks in oCAniCtrl_Human::PC_GoBackward_G2
        //const int oCAniCtrl_Human__PC_GoBackward_G2 = 7019968; //0x6B1DC0
        //HookEngineF(oCAniCtrl_Human__PC_GoBackward_G2, 5, GoBackwardPerception); // causes bugs in collision with inclines
        HookEngineF(7044586, 6, hook__backward); // ANI_WALKMODE_RUN
        HookEngineF(7044556, 6, hook__backward); // ANI_WALKMODE_WALK
        //HookEngineF(7044526, 6, GoBackwardPerception); // ANI_WALKMODE_SNEAK
    
        // hooks in oCAIHuman::FightMelee
        HookEngineF(6911940 /* 006977c4 */, 5, GoBackwardPerception); // Gothic 1 Steuerung (?)
        HookEngineF(6914029 /* 00697fed */, 5, GoBackwardPerception); // (?)
        HookEngineF(6914536 /* 006981e8 */, 6, GoBackwardPerception); // Gothic 2 Steuerung (?)
    };
    und die FrameFunction SendQuietSoundIfNoisy entfernen.

Seite 2 von 2 « Erste 12

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