Also zwecks Scriptlänge:
Ich würde da einfach für alle möglichen Bewegungen (vorwärst/rückwärts/links drehen/etc.) Eigene Aktivatoren machen, die das für eine/mehrere variable Referenz ausführen. Im Hauptscript werden erst die zu bewegenden Referenzen bestimmt und dann mit z.B. einem Counter immer die jeweilige Aktion aufgerufen.

Wichtig dabei ist, dass man nicht mehr als 5/6 Aktionen im gleichen Frame aufruft, da sonst der Activate-Befehl einfach nicht ausgeführt wird.



Hier mal ein Beispielscript für Vorwärtsfahren:
Code:
scn ActivateorShipMoveForwardScript

long Index
float PosX
float PosY
float TrigAngleZ
ref rMove
ref Ref1
ref Ref2
;etc.

Begin OnActivate
 SaveIP
 set rMove to Player
 if ( Index == 0 )
  set rMove to Ref1
 elseif ( Index == 1 )
  set rMove to Ref2
 ;etc.
 else
  ResetAllVariables
  Return
 endif
 rMove.Disable                   ;Kollision muss mit bewegt werden. Erforder ein Enable im Hauptscript!
 if ( ( rMove.GetAngle z ) < 90 )
  set TrigAngleZ to ( 90 - ( rMove.GetAngle z ) )
 else
  set TrigAngleZ to ( 450 - ( rMove.GetAngle z ) )
 endif
 set PosX to ( ( rMove.GetPos x ) + ( cos TrigAngleZ ) )
 set PosY to ( ( rMove.GetPos y ) + ( sin TrigAngleZ ) )
 ;Um die Geschwindigkeit zu erhöhen muss man einen Faktor vor den Sinus/Cosinus setzen.
 rMove.SetPos x, PosX
 rMove.SetPos y, PosY
 set Index to ( Index + 1 )
 RestoreIP
End
Ich hab OBSE-Befehle verwendet, da mir die Ersatzreihen für Sinus/Cosinus nicht geläufig sind. Die lassen sich aber im CS-Wiki finden.
Und der Loop lässt sich auch ohne größere Probleme aufspalten (dann braucht man auch rMove & Index nicht mehr); gleiches gilt natürlich für das ResetAllVariables.


Und hier noch ein Beispiel für ein Hauptscript mit einer Ref, die sich 15 Einheiten nach vorne bewegt:
Code:
scn BoatMainScript

int bDisabled       ;sicherstellen, dass das Boot 2 Frames sichtbar und nur einen unsichtbar ist
short Stage
long Count

Begin Gamemode
 if ( bDisabled )
  if ( BoatRef.GetDisalbed )
   BoatRef.Enable
  else
   set bDisabled to 0
  endif
  Return
 endif
 set bDisabled to 1
 if ( Stage == 0 )
  if ( Count < 15 )
   set ActivateorShipMoveForwardRef.Ref1 to BoatRef
   ActivateorShipMoveForwardRef.Activate Player, 1
   Return
  endif
 elseif ( Stage == 1 )
  ;hier kommt der Code fürs zurückfahren hin.
 ;etc.
 else
  set Stage to 0
 endif
 set Stage to ( Stage + 1 )
End
Das hier benötigt keine OBSE-Befehle, wenn man die also aus den Bewegungsscripten "eliminiert" (was durchaus möglich ist) wird das auch nicht benötigt.