Ergebnis 1 bis 5 von 5
  1. #1 Zitieren
    Abenteurer
    Registriert seit
    Feb 2007
    Beiträge
    73
    Hallo,

    ich verzweifele gerade mit dem CK. Ich hab für mich selbst eine Mod erstellt bei der ein Pferd vor die Kutsche gespannt wird und das Kutschpferd reitet man und es zieht die Kutsche wie ein Anhänger. Das ganze ist eigentlich dazu gedacht in Verbindung mit den Survival Mods den Umstand etwas realistischer zu machen woher das ganze Equipment kommt.

    Aber zum Punkt - Ich würde gerne irgendwie feststellen ob ich gerade dieses eine Kutschpferd reite. Nur in diesem Fall soll eine Aktion stattfinden - In dem Fall bei der Kutsche den MotionType festlegen.

    Ich hab versucht:

    - Mit einer Begleitquest das Kutschpferd einem Aliase zuzuordnen und nur zu reagieren wenn ich das Kutschpferd reite.
    - Zu prüfen ob das Kutschpferd in einer selbst definierten Fraktion Mitglied ist
    - Dem Kutschpferd ein selbst definiertes Keyword zugeordnet
    - Erfolglos versucht eine eigene Rasse zu erstellen bzw. die bestehende HorseRace zu duplizieren.

    Ich dachte mir es wäre am einfachsten jeweils auf ein Animation zu reagieren (OnAnimationEvent). Aber egal was ich mache mein Reitpferd das nix mit der Kutsch zu tun hat reagiert jedesmal ebenfalls. Obwohl dies weder die Fraktion zugewiesen bekommen hat noch das Keyword. Ich beisse mir daran wirklich die Zähne aus. Ich bin doch noch eher Anfänger beim Scripten.

    Nach meinem bisherigen Verständnis sind Aliase eindeutig aber irgendwie ist in dem ganzen der Wurm drin. Vieleicht hat ja einer von euch einen Tip
    Daimonicon ist offline
  2. #2 Zitieren
    Lehrling
    Registriert seit
    Feb 2014
    Beiträge
    38
    Zeige doch mal dein bisheriges Skript.

    Ein Event, das immer dann feuert wenn der Spieler ein Pferd besteigt, wäre beispielsweise OnPlayerCameraState(), mit Überprüfung auf State 10 (horse). Danach wird mittels GetPlayersLastRiddenHorse() überprüft, ob es sich um das Kutschenpferd handelt.

    Das Ganze würde dann ungefähr so aussehen:

    Code:
    Scriptname _test1 extends Quest
    
    
    ReferenceAlias Property Alias_Kutschenpferd auto
    
    
    Event OnInit()
        RegisterForCameraState()
    EndEvent
    
    
    Event OnPlayerCameraState(int oldState, int newState)
        if newState == 10 && oldstate != 10
            if (Game.GetPlayersLastRiddenHorse() as Actor) == (Alias_Kutschenpferd.GetActorRef())
                
                
            endif
        endif    
    EndEvent

    Das Property muss im CK mit einem Wert gefüllt werden. Unter 'Properties' den entsprechenden Alias für das Pferd auswählen.
    Ghaunadaur ist offline
  3. #3 Zitieren
    Abenteurer
    Registriert seit
    Feb 2007
    Beiträge
    73
    Hi,

    ich hatte einen Workaround gefunden aber ich glaube dein Ansatz ist deutlich eleganter !

    Für die Kutsche hab ich ein Menü und hier spannt man auch zum ersten mal das Pferd an.

    Spoiler:(zum lesen bitte Text markieren)
    Code:
    Scriptname CTaC_CartOptionMenuScript extends ObjectReference  
    
    import MyUtility
    import Utility
    
    Bool Property ShowInfo = False Auto
    {Zeigt Debug_Notification Einträge an oder eben nicht. Solche die immer angezeigt werden sollen müßen dann seperat erstellt werden.
    
    Default = False}
    Bool Property ShowLog = False Auto
    {Aktiviert oder Deaktiviert die Ausgabe in Logdatei.
    
    Default = False}
    
    ObjectReference Property CartHorseRef Auto
    {Referenz auf das Kutschpferd.}
    
    ObjectReference Property LagerChestRef Auto
    {Lagerkiste der Kutsche.}
    
    Message Property CTaC_CartMenuMSG auto
    {Menü das beim aktivieren angezeigt wird}
    
    GlobalVariable Property CTaC_IsCartTetherToHorseGlobal Auto
    {Globale Variabel ob die Kutsche angespannt ist.}
    
    Keyword property CTaC_CartMarkerKWD auto
    
    Quest Property CartTrackQuestREF Auto
    
    
    Event OnActivate (ObjectReference akActionRef)
    
    	IF akActionRef == Game.GetPlayer()
    		MainMenu(akActionRef)
    	EndIF
    
    EndEvent
    
    Function MainMenu(ObjectReference akActionRef)
    
    		Int iButton = CTaC_CartMenuMSG.Show()
    
    		If iButton == 0 ; Lagertruhe einsehen
    			PlayGamebryoAnimation("open" )
    			LagerChestRef.Activate(Game.GetPlayer())
    			Wait(0.5)
    
    			While ( IsInMenuMode() )
    				WaitMenuMode( 1.0 )
    			EndWhile
    
    			PlayGamebryoAnimation( "close" )
    		Endif
    
    		If iButton == 1 ; Kutsche anspannen
    	
    			If CartHorseRef && GetLinkedRef()
    				CartHorseRef.Moveto(GetLinkedRef())
    				Wait(0.5)
    				Debug.Notification("Kutsche angespannt !")
    			Endif
    
    			self.TetherToHorse(CartHorseRef)
    			self.SetMotionType(self.Motion_Keyframed) ;Motion_Fixed
    			; self.SetMotionType(self.Motion_Fixed)
    			CTaC_IsCartTetherToHorseGlobal.SetValueInt(1)
          	Endif
    
    		If iButton == 2 ; Kutschen-Tracking aktivieren
    			CartTrackQuestREF.SetStage(10)
    		Endif
    
    		If iButton == 3 ; Exit
    			While ( IsInMenuMode() )
    				WaitMenuMode( 0.5 )
    			EndWhile
          	Endif
    Endfunction


    Ich hab dazu dann noch ein Hilfsquest Script das eigentlich nur zum tracken der Kutsche dienen sollte bzw. zum wiederfinden

    Code:
    Spoiler:(zum lesen bitte Text markieren)
    Scriptname CTaC_AEventQuestScript extends Quest import MyUtility ReferenceAlias Property Alias_CartHorse Auto ReferenceAlias Property Alias_TravelCart Auto Bool Property ShowInfo = False Auto {Zeigt Debug_Notification Einträge an oder eben nicht. Solche die immer angezeigt werden sollen müßen dann seperat erstellt werden.} Bool Property ShowLog = False Auto {Aktiviert oder Deaktiviert die Ausgabe in Logdatei.} Bool Property IsCartHorse = False Auto {Aktiviert oder Deaktiviert die Ausgabe in Logdatei.} ObjectReference Property CartRef Auto {Referenz auf die Kutsche.} ObjectReference Property CartHorseRef Auto {Referenz auf das Kutschpferd.} GlobalVariable Property CTaC_IsCartTetherToHorseGlobal Auto {Globale Variabel ob die Kutsche angespannt ist.} Actor HorseRef Event OnInit() RegisterForAnimationEvent(Game.GetPlayer(), "tailHorseMount") RegisterForAnimationEvent (Game.GetPlayer(), "tailHorseDismount") CartRef.SetMotionType(CartRef.Motion_Keyframed) Alias_TravelCart.ForceRefIfEmpty(CartRef) EndEvent Event OnAnimationEvent (ObjectReference akSource, string asEventName) Alias_CartHorse.ForceRefIfEmpty(CartHorseRef) HorseRef = Alias_CartHorse.GetActorReference() bool CartHorseIsBeingRidden = HorseRef.IsBeingRidden() LogConditional("Wert von - Wird das Kutschpferd geritten ? = " + CartHorseIsBeingRidden, ShowInfo, 0.5) if CartHorseIsBeingRidden == true && CTaC_IsCartTetherToHorseGlobal.GetValueInt() == 1 If asEventName == "tailHorseMount" CartRef.SetMotionType(CartRef.Motion_Dynamic) ; Standard Motion Type ; CarriageRef.SetMotionType(3) ; Motion_SphereInertia = 2, Motion_BoxInertia = 3 ;CTaC_IsCartTetherToHorseGlobal.SetValueInt(1) Game.EnableFastTravel(false) EndIf If asEventName == "tailHorseDismount" CartRef.SetMotionType(CartRef.Motion_Keyframed) ; CartRef.SetMotionType(CartRef.Motion_Fixed) ;CTaC_IsCartTetherToHorseGlobal.SetValueInt(0) Game.EnableFastTravel(true) EndIf endif EndEvent


    Das scheint zu funktionieren - Aber wie gesagt dein Ansatz scheint mir deutlich eleganter und vermutlich zuverlässiger

    Ich hab unter Umständen durch das herumprobieren noch etwas Müll mit darin
    Daimonicon ist offline
  4. #4 Zitieren
    Lehrling
    Registriert seit
    Feb 2014
    Beiträge
    38
    Die Methode mit OnPlayerCameraState() habe ich selbst mal getestet und scheint zuverlässig zu funktionieren.
    Wenn dein Ansatz über OnAnimationEvent() ebenfalls funktioniert, ist das auch keine schlechte Lösung.
    Gibt wahrscheinlich mehrere Möglichkeiten.

    An die Funktion IsBeingRidden() habe ich gar nicht gedacht. Damit lässt sich die 2. If-Bedingung noch vereinfachen.

    Code:
    Scriptname _test1 extends Quest
    
    ReferenceAlias Property Alias_Kutschenpferd auto
    
    Event OnInit()
        RegisterForCameraState()
    EndEvent
    
    Event OnPlayerCameraState(int oldState, int newState)
        if newState == 10 && oldstate != 10
            if Alias_Kutschenpferd.GetActorRef().IsBeingRidden()
                
                
            endif
        endif    
    EndEvent

    Welche Lösung aber letztendlich die Bessere ist, schwer zu sagen. Da hast du die Qual der Wahl.
    Ghaunadaur ist offline
  5. #5 Zitieren
    Abenteurer
    Registriert seit
    Feb 2007
    Beiträge
    73
    Ich müßte vieleicht mal schauen welches Event öfter abgefeuert wird. Vieleicht wird der Camera State nicht so oft gefeuert mal testen.

    Auf jedem Fall danke für den Tip !

    Ich hatte die andere Variante paar Minuten vorher gefunden und nur die Hoffnung das es so vieleicht geht - Dein Tip hätte mich dann in jedem Fall gerettet.

    Spoiler:(zum lesen bitte Text markieren)
    Daimonicon ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •