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

 

Ergebnis 1 bis 16 von 16
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    Tür per Skript öffnen bzw. schließen

    Guten Abend,

    ist es irgendwie möglich eine Tür per Skript zu öffnen bzw. zu schließen? Ich habe schon die Suchfunktion benutzt und nicht sehr viel gefunden, das mir wirklich weiterhilft. Nur diesen Thread, aber so habe ich es vor ein paar Monaten, als ich schon mal das gleiche Problem hatte, auch selbst schon probiert. Es hat aber leider nicht funktioniert...

  2. Beiträge anzeigen #2 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    Mobsis sollten eigentlich auf Trigger-Nachrichten reagieren. Für Wld_SendTrigger/Wld_SendUntrigger braucht man allerdings eindeutige Vob-Namen für die Objekte. Im Zweifelsfall könnte man oCMobInter::OnTrigger/oCMobInter::OnUntrigger direkt aufrufen (wenn beide Vob-Parameter 0 sind, dann wird der State und die Animation einfach gewechselt - man muss selbst aufpassen, dass man keine verschlossenen Objekte öffnet).
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

  3. Homepage besuchen Beiträge anzeigen #3 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von NicoDE Beitrag anzeigen
    Mobsis sollten eigentlich auf Trigger-Nachrichten reagieren. Für Wld_SendTrigger/Wld_SendUntrigger braucht man allerdings eindeutige Vob-Namen für die Objekte. Im Zweifelsfall könnte man oCMobInter::OnTrigger/oCMobInter::OnUntrigger direkt aufrufen (wenn beide Vob-Parameter 0 sind, dann wird der State und die Animation einfach gewechselt - man muss selbst aufpassen, dass man keine verschlossenen Objekte öffnet).
    Also irgendwie funktioniert das so nicht.

    Habs so getestet:

    Code:
    var int TestDoor1;
    
    func int DIV_Trigger_Endfight_End1_Door_Kneipe_01 ()
    {
        Wld_SendTrigger ("DOOR_KNEIPE_01");
        
        Print ("TESTDOOR");
            
        TestDoor1 = TRUE;
    };
    und auch so:

    Code:
    var int TestDoor1;
    
    func int DIV_Trigger_Endfight_End1_Door_Kneipe_01 ()
    {
        Wld_SendUntrigger ("DOOR_KNEIPE_01");
        
        Print ("TESTDOOR");
            
        TestDoor1 = TRUE;
    };
    Das Skript wird aufgerufen, wenn der Held durch einen Trigger in der Nähe von der Tür läuft. Das funktioniert auch, aber die Tür öffnet bzw. schließt sich nicht.

  4. Homepage besuchen Beiträge anzeigen #4 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Also irgendwie funktioniert das so nicht.

    Habs so getestet:

    Code:
    var int TestDoor1;
    
    func int DIV_Trigger_Endfight_End1_Door_Kneipe_01 ()
    {
        Wld_SendTrigger ("DOOR_KNEIPE_01");
        
        Print ("TESTDOOR");
            
        TestDoor1 = TRUE;
    };
    und auch so:

    Code:
    var int TestDoor1;
    
    func int DIV_Trigger_Endfight_End1_Door_Kneipe_01 ()
    {
        Wld_SendUntrigger ("DOOR_KNEIPE_01");
        
        Print ("TESTDOOR");
            
        TestDoor1 = TRUE;
    };
    Das Skript wird aufgerufen, wenn der Held durch einen Trigger in der Nähe von der Tür läuft. Das funktioniert auch, aber die Tür öffnet bzw. schließt sich nicht.
    Keiner mehr 'ne Idee?

  5. Beiträge anzeigen #5 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.410
     
    NicoDE ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Keiner mehr 'ne Idee?
    Nein, außer (wie oben geschrieben) die Engine-Funtionen oCMobInter::OnTrigger/oCMobInter::OnUntrigger direkt aufzurufen.
    (Wld_SendTrigger/Wld_SendUntrigger dürfte wahrscheinlich nicht funktionieren, weil in der External das Objekt auch als Verursacher angegeben wird)
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

  6. Beiträge anzeigen #6 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.803
     
    Fisk2033 ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    als ich schon mal das gleiche Problem hatte, auch selbst schon probiert. Es hat aber leider nicht funktioniert...
    Meinst du damit das hier?

    Zitat Zitat von Hirnschmalz Beitrag anzeigen
    Ich fürchte, ich werde eine Bauernversion machen müssen: ZWEI Türen, von denen eine zunächst
    invisible ist (und damit auch ohne Kollision), die andere in Kap. 0 von hero geöffnet wird.
    Im Init_SmuChapter für Kap. 4 wird dann die bisher sichtbare Tür, wie auch immer ihr Zustand
    sei, auf invisible gesetzt, die andere vice versa. Beide haben dasselbe Visual & dieselbe Key_Instance.
    Sollte gehen ...
    Wäre jetzt zumindest auch mein erster Lösungsansatz gewesen.

  7. Homepage besuchen Beiträge anzeigen #7 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    So, sorry für die späte Rückmeldung, aber ich habe dieses Problem bis jetzt immer wieder aufgeschoben.

    Zitat Zitat von Fisk2033 Beitrag anzeigen
    Meinst du damit das hier?
    Wäre jetzt zumindest auch mein erster Lösungsansatz gewesen.
    Habe das gestern mal so probiert (Tür an selber Stelle im Spacer platziert --> ShowVisual = FALSE --> Kollision deaktiviert --> Später per Skript die alte Tür mit Ikarus gelöscht und bei der anderen, unsichtbaren, das Visual sichtbar gemacht und die Kollision aktiviert), allerdings kommt es trotz dem nicht vorhandenen Visual und der ebenfalls nicht vorhandenen Kollision manchmal vor, dass ein NPC oder der Held die unsichtbare Tür benutzt, wenn diese "neue" Tür eigentlich noch gar nicht da ist. Bedeutet, dass dann die eigentlich sichtbare Tür einfach zu bleibt, weil die unsichtbare geöffnet wurde.

    Zitat Zitat von NicoDE Beitrag anzeigen
    Nein, außer (wie oben geschrieben) die Engine-Funtionen oCMobInter::OnTrigger/oCMobInter::OnUntrigger direkt aufzurufen.
    Wie würde das denn gehen? Ich weiß zwar, dass das mit Ikarus/LeGo möglich ist, allerdings nicht wie.

  8. Beiträge anzeigen #8 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Später per Skript die alte Tür mit Ikarus gelöscht und bei der anderen, unsichtbaren, das Visual sichtbar gemacht und die Kollision aktiviert
    Vielleicht Tür als child eines Movers setzen? damit die unsichtbare Tür gar nicht in einer Position ist wo ein NPC sie benutzen würde? Oder die Zweite Tür erst zur Laufzeit erstellen wenn sie denn auch gebraucht wird. mud-freak hat Funktionen veröffentlicht mit denen man bequem Zeug per Skript einfügen kann.
    https://app.assembla.com/spaces/LM/s...sertAnything.d

    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Wie würde das denn gehen? Ich weiß zwar, dass das mit Ikarus/LeGo möglich ist, allerdings nicht wie.
    http://forum.worldofplayers.de/forum...7#post17631567

    Hier ist eine Liste von Enginefunktionen. Da findest du die Funktionsadressen und welche Parameter die Funktion erwartet und was der Rückgabewert ist. Die Adresse ist in hexadezimalem Format und kann mit dem Windows Taschenrechner in dezimal umgewandelt werden.

    hier mal ein abgewandeltes Beispiel für einen Funktionsaufruf aus GFA:

    Code:
    // Set body state to standing
        const int oCNpc__SetBodyState                        =  7727392; //0x75E920
    
        var oCNpc her; her = Hlp_getNpc(hero);
        var int herPtr; herPtr = _@(her);
    
        var int standing; standing = BS_STAND & ~BS_FLAG_INTERRUPTABLE & ~BS_FLAG_FREEHANDS;
        const int call2 = 0;
        if (CALL_Begin(call2)) {
            CALL_IntParam(_@(standing));
            CALL__thiscall(_@(herPtr), oCNpc__SetBodyState);
            call2 = CALL_End();
        };
    Hier wird für den hero die Funktion SetBodyState aufgerufen mit standing als Parameter.
    In der verlinkten Datei findest du diese Funktion in Zeile 2123.

    Ikarus_Doc.d enthält eine Einleitung die so ein bisschen erklärt wie Speicher/Speicheradressen etc funktionieren. Auch sind dort die CALL Funktionen erklärt.
    Geändert von Cryp18Struct (13.11.2017 um 18:33 Uhr) Grund: anderes Beispiel

  9. Beiträge anzeigen #9 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von NicoDE Beitrag anzeigen
    Nein, außer (wie oben geschrieben) die Engine-Funtionen oCMobInter::OnTrigger/oCMobInter::OnUntrigger direkt aufzurufen.
    (Wld_SendTrigger/Wld_SendUntrigger dürfte wahrscheinlich nicht funktionieren, weil in der External das Objekt auch als Verursacher angegeben wird)
    Ich habe mich heute eine Weile daran versucht, es aber leider nicht hinbekommen.
    Ich habe es mit OnTrigger, OnUntrigger, SendStateChange probiert:
    Code:
    func void close_door (var string door_name)
    {
        const int oCMobInter__OnUntrigger = 7465664; // 0x0071EAC0
        // virtual void __thiscall oCMobInter::OnUntrigger(zCVob * zCVob *) 
    
        const int oCMobInter__OnTrigger = 7464912; // 0x0071E7D0
        // virtual void __thiscall oCMobInter::OnTrigger(zCVob * zCVob *)     
    
        const int oCMobInter__SendStateChange = 7466384; // 0x0071ED90
        // void __thiscall oCMobInter::SendStateChange(int int)       
    
    
        var int ptr; ptr = MEM_SearchVobByName(door_name);
    
        if (!ptr) {return;};
    
        //var oCMobInter oCMobInter_door;
        //oCMobInter_door = MEM_PtrToInst(ptr);
    
        var oCNpc her; her = Hlp_getNpc(hero);
        var int herPtr; herPtr = _@(her);
    
        Print("in here");
        const int int0 = 0;
        const int int1 = 1;
        const int call = 0;
        if (CALL_Begin(call)) {
            //CALL_PtrParam(ptrherPtr);
            //CALL_PtrParam(ptr);
            //CALL__thiscall(_@(ptr), oCMobInter__OnUntrigger);
            //CALL__thiscall(_@(ptr), oCMobInter__OnTrigger);
            CALL_IntParam(_@(int0));
            CALL_IntParam(_@(int1));
            CALL__thiscall(_@(ptr), oCMobInter__SendStateChange);
            call = CALL_End();
        };
    
    };
    Im Code habe ich immer mal ein bisschen hin und her probiert.

    Bei OnTrigger und OnUntrigger ist mir nicht klar, was die zwei Parameter sein sollten. Ich habe da mal unterschiedliche Variationen von Spieler und Mob ausprobiert, aber jeweils ohne Erfolg. Die Tür ist immer offen geblieben.

    Habe ich da noch was falsch gemacht oder funktionieren diese Funktionen einfach nicht so? Irgendeine Funktion muss es doch geben, mit der ich Türen schließen kann.

    (Code wird ausgeführt und ich kann auch Abstürze herbeiführen, wenn ich nicht die richtige Anzahl an Parametern auf den Stack lege.)

  10. Beiträge anzeigen #10 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Leider keine weiteren Ideen, was für Funktionen möglicherweise die Tür schließen lassen könnten?

  11. Beiträge anzeigen #11 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Mein (uneleganter) Lösungsvorschlag ist immer noch die Tür verschwinden zu lassen und eine neue in Position zu bringen oder zur Laufzeit einzufügen. Die neue müsste dann geschlossen sein.
    Kannst du ein bisschen ausführen was genau für eine Anwendung du brauchst? nur eine spezifische Tür? jede beliebige Tür? nur schließen oder auch öffnen? einmalig oder mehrmals?

  12. Beiträge anzeigen #12 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Mein (uneleganter) Lösungsvorschlag ist immer noch die Tür verschwinden zu lassen und eine neue in Position zu bringen oder zur Laufzeit einzufügen. Die neue müsste dann geschlossen sein.
    Kannst du ein bisschen ausführen was genau für eine Anwendung du brauchst? nur eine spezifische Tür? jede beliebige Tür? nur schließen oder auch öffnen? einmalig oder mehrmals?
    den uneleganten Vorschlag hatte ich irgendwie übersehen; das könnte ich ausprobieren.


    Ein paar Npc laufen im TA durch eine Tür (zum Schlafen), durch die der Spieler laut Dialogen nicht darf / soll. Es ist kein so großes Problem, wenn sich der Spieler mal durchquetschen kann hinter dem Npc. Aber idealerweise soll die Tür abgeschlossen sein tagsüber. Abschließen (lockable Status) kann ich die Tür wieder, nur nicht zu machen.

    Bei mir geht es um eine ganz bestimmte Tür (Name bekannt), und es braucht auch nicht besonders schön sein, momentan fange ich über eine Schleife ab, wenn die Tür zu lange offen steht und geschlossen werden sollte.

  13. Beiträge anzeigen #13 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Guten Abend,

    ist es irgendwie möglich eine Tür per Skript zu öffnen bzw. zu schließen? Ich habe schon die Suchfunktion benutzt und nicht sehr viel gefunden, das mir wirklich weiterhilft. Nur diesen Thread, aber so habe ich es vor ein paar Monaten, als ich schon mal das gleiche Problem hatte, auch selbst schon probiert. Es hat aber leider nicht funktioniert...
    Wenn du das von außerhalb steuern möchtest, dann würde ich dir empfehlen die Tür als mover zu platzieren und an der stelle der tür eine unsichtbare tür die dann den mover bewegt. So kannst du die tür von "außerhalb" steuern und lässt trotzdem das gefühl einer "echten" tür entstehen


    Zitat Zitat von Milky-Way Beitrag anzeigen
    den uneleganten Vorschlag hatte ich irgendwie übersehen; das könnte ich ausprobieren.


    Ein paar Npc laufen im TA durch eine Tür (zum Schlafen), durch die der Spieler laut Dialogen nicht darf / soll. Es ist kein so großes Problem, wenn sich der Spieler mal durchquetschen kann hinter dem Npc. Aber idealerweise soll die Tür abgeschlossen sein tagsüber. Abschließen (lockable Status) kann ich die Tür wieder, nur nicht zu machen.

    Bei mir geht es um eine ganz bestimmte Tür (Name bekannt), und es braucht auch nicht besonders schön sein, momentan fange ich über eine Schleife ab, wenn die Tür zu lange offen steht und geschlossen werden sollte.
    Was wäre wenn die Npc's die die Tür benutzen diese immer hinter sich schließen? Das habe ich z.b bei mir bei der Tür für das Zimmer des Königs so geregelt. Sobald der Npc die Tür überwunden hat schließt er diese wieder..
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (22.06.2018 um 19:19 Uhr)

  14. Beiträge anzeigen #14 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von aebo Beitrag anzeigen
    Wenn du das von außerhalb steuern möchtest, dann würde ich dir empfehlen die Tür als mover zu platzieren und an der stelle der tür eine unsichtbare tür die dann den mover bewegt. So kannst du die tür von "außerhalb" steuern und lässt trotzdem das gefühl einer "echten" tür entstehen




    Was wäre wenn die Npc's die die Tür benutzen diese immer hinter sich schließen? Das habe ich z.b bei mir bei der Tür für das Zimmer des Königs so geregelt. Sobald der Npc die Tür überwunden hat schließt er diese wieder..
    Mit Mover müsste ich die Tür dann aber auch passend für die NPC öffnen? Das würde ich gerne vermeiden. Zumal später auch der Spieler die Tür benutzen soll.

    Können Npc verlässlich Türen schließen? Wenn ja, wäre das hier die ideale Lösung. Ich dachte eigentlich, meine B_MoveMob würde das schon erfolglos probieren:
    Code:
    func void B_MoveMob()
    {
    	var string door;
    	door = Npc_GetDetectedMob (self);
    	if (Hlp_StrCmp (door, "DOOR"))
    	{
    		if (Wld_GetMobState (self, door) == 0)
    		{
    			Npc_ClearAIQueue (self);
    			AI_UseMob (self, door, 1);
    			AI_UseMob (self, door, -1);
    		};
    	}
    	else
    	{
    		return;
    	};
    	AI_ContinueRoutine (self);
    };

  15. Beiträge anzeigen #15 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Mit Mover müsste ich die Tür dann aber auch passend für die NPC öffnen? Das würde ich gerne vermeiden. Zumal später auch der Spieler die Tür benutzen soll.

    Können Npc verlässlich Türen schließen? Wenn ja, wäre das hier die ideale Lösung. Ich dachte eigentlich, meine B_MoveMob würde das schon erfolglos probieren:
    Code:
    func void B_MoveMob()
    {
    	var string door;
    	door = Npc_GetDetectedMob (self);
    	if (Hlp_StrCmp (door, "DOOR"))
    	{
    		if (Wld_GetMobState (self, door) == 0)
    		{
    			Npc_ClearAIQueue (self);
    			AI_UseMob (self, door, 1);
    			AI_UseMob (self, door, -1);
    		};
    	}
    	else
    	{
    		return;
    	};
    	AI_ContinueRoutine (self);
    };
    so wird es nicht reibungslos funktionieren.
    AI_UseMob (self, door, 1); steht hier für das aufstoßen/ziehen der tür danach folgt gleich dein AI_UseMob (self, door, -1);. Erst jetzt geht der npc durch die tür und lässt diese dann offen stehen.
    die beiden Ai_ befehle sind quasi nur für das öffnen der tür und nicht für das schließen der tür.
    kannst es gerne ingame ja mal ausprobieren.
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (22.06.2018 um 20:48 Uhr)

  16. Beiträge anzeigen #16 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    zu "NPC macht Tür hinter sich zu" gibt es auch diesen thread:
    https://forum.worldofplayers.de/foru...1#post15835406

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