Der(die) Else, ElseIf Fall(e)

Xgf

Bürger
Grundsätzlich funktioniert folgender Script Teil.... aber nicht immer
Ich sitze auf dem Pferd (pferd steht, asky ist auf freilauf) folgende function läuft regelmässig, save game.

Code:
If Player.IsRunning()
  ... mach      
ElseIf Player.IsInCombat()
  ... mach 
ElseIf Player.IsSneaking()
  ... mach 
ElseIf Player.IsOnMount()
  ... mach 
Else
  ... mach 
EndIF

Lade Game, script läuft regelmässig, aber nichts passiert. Nach ca. 2 Minuten warten fällt das script in den "Else" Fall danach abwechslungsweise "Else", "Player.IsOnMount()" oder beides.

Habe das nun geändert

Code:
If Player.IsRunning() == TRUE
  ... mach 
EndIf
If Player.IsInCombat() == TRUE
  ... mach 
EndIf
If Player.IsSneaking( )== TRUE
  ... mach 
EndIf
If Player.IsOnMount() == TRUE
  ... mach 
EndIf
If Player.IsRunning() == False && Player.IsOnMount() == False && Player.IsSneaking() == False && Player.IsInCombat() == False
  ... mach 
EndIF

Nu macht es das was es soll. Es beginnt sofort mit "Player.IsOnMount()". Ich konnte das eindeutig reproduzieren.
.. erschreckend :shock::eek::huh:
 
Hmm, die beiden Beispiele verhalten sich aber schon von der Logik her nicht gleich. Was passiert denn, wenn mehrere Bedingungen zutreffen, beispielsweise wenn der Spieler gleichzeitig im Kampf ist und auf dem Pferd sitzt? Bei dem ElseIf-Beispiel wird nur der IsInCombat Teil ausgeführt, da die Bedingung ja bereits zutrifft, und anschließend wird zum EndIf gesprungen. Im unteren Beispiel werden dagegen sowohl IsInCombat als auch IsOnMount ausgeführt, da jede Bedingung für sich allein geprüft wird.

Vielleicht hast du in deinem richtigen Script in dem ElseIf-Konstrukt am Anfang auch eine Bedingung, die fast immer zutrifft, und kommst dadurch garnicht erst zu den nachfolgenden Bedingungen...
 
Ich muss noch erwähnen, dass bei meinen Versuchen/Tests, Player.IsOnMount() immer auf True war. Ein Debug Msg hat mir das bei jedem Durchlauf bestätigt.

Hmm, die beiden Beispiele verhalten sich aber schon von der Logik her nicht gleich. Was passiert denn, wenn mehrere Bedingungen zutreffen, beispielsweise wenn der Spieler gleichzeitig im Kampf ist und auf dem Pferd sitzt?

Ja die beiden Beispiele verhalten sich nicht gleich, dass ist mir bewusst.
Der Sinn vom Else und ElseIf wäre ja gerade, dass falls mehrere Bedingungen auf True sind, nur eine, nämlich die erste die zutrifft abgearbeitet wird. Im zweiten Beispiel, ohne ElseIf werden alle Fälle die zutreffen abgearbeitet, was ich dann auch nicht wirklich brauchen kann.

Hier ein kleines VBS Beispiel. Obwohl beiden Bedingungen zutreffen, wird nur die erste Abgearbeitet. So sollte das auch sein. Bei Papyrus scheint es aber je nach Situation gar nicht zu funktionieren mit dem ElseIf.

Code:
x = 2
If x = 2 then
  msgbox "x = 2"
ElseIf x > 1 then
  msgbox "x > 1"
End If

Es kommt nur x = 2
 
Zuletzt bearbeitet:
Der Sinn vom Else und ElseIf wäre ja gerade, dass falls mehrere Bedingungen auf True sind, nur eine, nämlich die erste die zutrifft abgearbeitet wird. Im zweiten Beispiel, ohne ElseIf werden alle Fälle die zutreffen abgearbeitet, was ich dann auch nicht wirklich brauchen kann.

Du könntest es ja mal mit dem "normalen" If, aber verschachtelt probieren:

Code:
If Player.IsRunning()
  ... mach      
Else
   If Player.IsInCombat()
   ... mach 
   Else
      If Player.IsSneaking()
      ... mach 
      Else
         If Player.IsOnMount()
         ... mach 
         Else
         ... mach
         EndIf
      EndIf
   EndIf
EndIf

Das müsste sich dann genauso verhalten, wie sich das ElseIf auch verhalten sollte.
 
  • Like
Reaktionen: Xgf