Hallo,
im Gothic 2 Hauptspiel gibt es einen Bug, der das schleichen so ziemlich unnötig macht, da man einfach das seitwärts laufen stattdessen benutzen kann, das letztendlich ähnlich vom Spiel behandelt wird, wie das schleichen selbst. Scheinbar liegt dies am Bodystate, das seitwärts laufen scheint nämlich gar keinen eigenen zu haben und einfach als BS_STAND erkannt zu werden, das NPCs wohl - wie das schleichen auch - ignorieren, bis sie den "Feind", der gerade schleicht, direkt sehen.
Deshalb habe ich einfach probiert, per FF_ApplyOnce den Bodystate des Helden auf BS_RUN zu setzen, wenn dieser eine seitwärts laufen Animation abspielt. Den BS_RUN Bodystate bemerken NPCs normalerweise auch. Und das scheint so auch tatsächlich zu funktionieren, betritt man einen Portalraum per seitwärts laufen, bemerken die NPCs das nun auch.
Problem das ich habe ist allerdings, dass sämtliche schlafende NPCs und schlafende Monster den Helden trotzdem nicht wahrnehmen, wenn dieser seitwärts läuft, obwohl sein Bodystate BS_RUN ist. Rennt der Spieler allerdings, bemerken sie das kurze Zeit später sofort, obwohl hier ja ebenfalls der Bodystate auf BS_RUN gesetzt wird. Meine Vermutung war ja eigentlich, dass irgendwo in den Skripten das ganze abgefragt werden muss, was seltsam wäre, da NPCs den Bodystate BS_RUN bereits wahrnehmen und beim seitwärts laufen somit theoretisch auch wahrnehmen müssten. Auch konnte ich so etwas nicht finden...
Ich habe schon den kompletten Skripte-Ordner nach BS_RUN, BS_SNEAK etc. durchsuchen lassen, aber nichts gefunden, was für dieses Problem verantwortlich sein könnte. Komisch ist auch, dass in der B_MM_AssessEnemy und in der ZS_MM_RTN_Sleep nichts zu finden ist, wo abgefragt wird, in welchem Bodystate der Gegner sich gerade befindet. Denn schlafende Monster nehmen den Spieler ja nicht wahr, wenn dieser schleicht.

So sehen meine Skripte aus:

Code:
func void DIV_SetBodyState (var c_npc slf, var int BodyState) 
{
    MEM_InitAll();


    CALL_PtrParam (MEM_InstToPtr (BodyState));
    CALL__thiscall (MEM_InstToPtr (slf), 7727392);
};
Code:
func void DIV_PrintHeroBodystate(){
    if (AniIsActive(hero, "T_RUNSTRAFEL"))
    || (AniIsActive(hero, "T_RUNSTRAFER"))
    || (AniIsActive(hero, "T_WALKSTRAFEL"))
    || (AniIsActive(hero, "T_WALKSTRAFER"))
    {
        if (!C_BodyStateContains (hero, BS_RUN))
        {
            Print ("Bodystate zu BS_RUN geändert!");
        
            DIV_SetBodyState (hero, BS_RUN);
        };
    };
};
Ich kann mir das einfach nicht erklären, warum es nicht mit dem Bodystate BS_RUN funktioniert, wenn der Spieler seitwärts läuft, aber wenn er rennt, was ja ebenfalls den Bodystate BS_RUN setzt, schon. Hat da jemand 'ne Idee? Oder eventuell hat schon mal jemand diesen Bug komplett behoben und/oder kennt eine Möglichkeit, diesen komplett zu beheben?


Edit: Nach mehreren erfolglosen Versuchen habe ich das ganze nun vorerst aufgegeben. Ich schätze, dass das irgendwo in der Engine verankert ist und dort eher die Animation abgefragt wird, statt dem Bodystate. Jetzt noch länger herumzuprobieren, ist mir das einfach nicht wert. Sollte allerdings noch jemand eine Idee haben oder diesen Bug sogar schon komplett behoben haben, dann gerne her damit. ^^