|
-
30.09.2020 23:30
#21
Zitat von Milky-Way
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.
-
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.
-
04.10.2020 20:51
#23
Zitat von Milky-Way
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.
-
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)
-
Zitat von Kirides
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.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|