Construction Set Der Scriptthread

Also das:
Code:
begin Horst
float timer
short lol
if ( MenuMode == 1 )
  return
endif

if ( OnActivate == 1 )
  if ( lol == 0 )
    Set timer to ( timer + GetSecondsPassed )
    if ( timer < 3 )
      "ACTIVATOR"->MoveWorld z -100
     return
     set lol to 1
   endif
  endif
endif

end
...ist Murx.

Das hingegen:
Code:
begin Horst
float timer
short state

IF ( MenuMode == 1 )
  Return
ElseIF ( state == -1 )
  Return
EndIF

IF ( OnActivate == 1 )
  set state to 1
EndIF

IF ( state == 1 )
  set timer to ( timer + GetSecondsPassed )
  IF ( timer < 3 )
    "ACTIVATOR"->MoveWorld z -100
  Else
    set state to -1
    ;do something else here
  EndIF
EndIF

end
...wird funktionieren.
 
  • Like
Reaktionen: J2W
Guten Tag,

Könnt ihr bitte mir ein Script schreiben?

Er soll auf einer Tür gelegt werden.
Der Script soll so wirken:
Wen man die Tür Öffnen will muss man erst eine bestimmte Geld Summe zahlen, da mit diese Tür sich erst öffnet.
Die Tür sollte sich nach kurzer Zeit dann wider selbst ab schlissen so das man erneut zahlen muss um durch zu kommen.
 
Ich hätte auch mal eine frage bezüglich eines Scripts.

Kann man mit einem Script bewirken, dass wenn eine Kreature stribt, diese dann eine kleine Feuerwelle aussendet?

Das quasi bei der Sterbeanimation in einem bereich von sagen wir mal 20 ein Feuerzauber wirkt.

Gruß: TakoTasujin
 
Er soll auf einer Tür gelegt werden.
Der Script soll so wirken:
Wen man die Tür Öffnen will muss man erst eine bestimmte Geld Summe zahlen, da mit diese Tür sich erst öffnet.
Die Tür sollte sich nach kurzer Zeit dann wider selbst ab schlissen so das man erneut zahlen muss um durch zu kommen.

Soll es eine Teleporttür oder eine normale sein? Für eine Teleporttür würde es so aussehen:

Code:
begin my_script

short state
short button

if ( MenuMode == 1 )
  return
endif

if ( state == 0 )
  if ( OnActivate == 1 )
    MessageBox, "Ihr müsst bezahlen um weiterzukommen.", "OK", "Lieber nicht."
    set state to 1
  endif
elseif ( state == 1 )
  set button to GetButtonPressed
  if ( button == 0 )       ;bezahlen
    if ( Player->GetItemCount, "Gold_001" < 1000 )
      MessageBox, "Ihr habt keine 1000 Draken."
      set state to 0
      set button to -1
    else
      Player->RemoveItem, "Gold_001", 1000
      set state to 0
      Activate
    endif
  elseif ( button == 1 )
    MessageBox "Dann halt nicht."
    set state to 0
   endif
endif

end

Ich hätte auch mal eine frage bezüglich eines Scripts.

Kann man mit einem Script bewirken, dass wenn eine Kreature stribt, diese dann eine kleine Feuerwelle aussendet?

Das quasi bei der Sterbeanimation in einem bereich von sagen wir mal 20 ein Feuerzauber wirkt.

Gruß: TakoTasujin

Das Script habe ich vor ein paar Wochen doch erst mit einer Frostnova geschrieben...

Code:
begin my_script

if ( MenuMode == 1 )
  return
endif

if ( OnDeath == 1 )
  Cast, "my_firespell", Player
endif

end
 
Hallo ich hab ein problem mit einem script aber habs jetzt aufgegeben.^^

Ich habe ein paar Trigger erstellt und sobald der Player in einen der Trigger Läuft wird er von punkt A zu punkt B teleportiert soweit ist mir die sache auch klar. Doch an Punkt B ist ebenfals ein Trigger der wieder zu punkt A führt und das geht ja nicht da soetwas eine Kettenreaktion auslösen würde. Ich könnte ihn auch einfach Disablen aber ich hab 9 trigger also insgesammt 18 Trigger jetzt bräuchte ich halt einen script der nicht unbedingt so aufwendig ist das ich jeden einzelnen Trigger mit einen anderen script versehen muss. Achso ja die trigger müssen nach dem teleport wieder enabled werden.
Wüsste da jemand eine Lösung :huh:
 
Uhm... also noch einmal fürs Verständnis:

• es gibt neun "Teleportpunkte" an denen jeweils ein Teleporttrigger sitzt (ich mutmaße, es sind unsichtbare Aktivatoren)
• Jeder Trigger teleportiert den Spieler an einen vordefinierten der acht anderen Zielpunkte
• dadurch entsteht ein Teleportringnetz:
1->2->3->4->5->6->7->8->9->1
• Die Trigger reagieren auf Annäherung (Distance <= X)
• Wurde der Spieler von A nach B teleportiert, soll er nicht direkt wieder weiter gebeamt werden.

Oder soll von jedem Ort aus zu jedem Ort aus teleportiert werden können?

Oder gibt es einfach nur neun "Wurmlöcher"... sprich ist es immer nur eine bidirektionale Verbindung von A nach B?


Es gibt unabhängig davon noch Fragen:

Liegen die Teleportpunkte in der gleichen Zelle oder finden Zellwechsel statt?

Wie genau soll das Re-Triggering funktionieren? Muß sich der Spieler erst ein Stück weit entfernen, ehe der Trigger wieder scharf gemacht wird, oder soll einfach eine gewisse Zeitspanne verstreichen, ehe der Teleporter wieder voll einsatzbereit ist?


Unabhängig davon, wie das Teleportnetz aussieht, würde ich das ganze über eine Global steuern, welche die Aktionen aller Punkte kontrolliert. Dann braucht man ein Script für alle Teleporter, wenn es sich selbst konfiguriert. Aber um das zu machen, müßte ich genau wissen, wie es sein soll.
 
Zuletzt bearbeitet:
Teleporter 1a -> Teleporter 1b
Teleporter 2a -> Teleporter 2b
Teleporter 3a -> Teleporter 3b
.
.
.
Die Teleporter befinden sich alle in der gleichen Cell. sie sollen alle unsichtbar sein es sollen ja nur Trigger sein die grünen Boxen im CS.
wen man durch teleporter 1a läuft (also werden sie durch berühren dieser Box aktiviert) kommt man an Teleporter 1b raus und andersrum. der Teleporter sollte so schnell wie möglich wieder bereit sein wenn der spieler durch einen beliebigen anderen teleporter gelaufen ist.
 
Ein Script (ungetestet), das 2x9 Teleporter verwalten kann, könnte so aussehen:

Code:
begin AutoWormhole_SC
short MyID
float Distance
float Timer

IF (menumode == 0)
 set Distance to ( 0 * GetSecondsPassed ) ;BlockTimer Countdown while in MM
 return
[COLOR="Magenta"]
ElseIF ( Timer > 0 ); Cooldown Timer triggered?
 set Timer to ( Timer - GetSecondsPassed )
 IF ( Timer <= 0 )
  set GB_WormholeActive to 0
  set Timer to 0
 EndIF
 return
ElseIF ( GB_WormholeActive != 0 )
 IF ( GB_WormholeActive == 1 )
  ;Enter Cooldown Time here  
  set Timer to 5
  set GB_WormholeActive to -1; /only one Teleporter manages Cooldown
 EndIF
 return; dropout until Cooldown reached
[/COLOR]
EndIF

IF (MyID != 0 )
 set Distance to ( GetDistance, player )

 IF Distance >= 250 ;too far away
  return
 EndIF 

 ;do something else here

[COLOR="SeaGreen"] IF 	( MyID == 1 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 10]
 ElseIF ( MyID == 2 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 11]
 ElseIF ( MyID == 3 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 12]
 ElseIF ( MyID == 4 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 13]
 ElseIF ( MyID == 5 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 14]
 ElseIF ( MyID == 6 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 15]
 ElseIF ( MyID == 7 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 16]
 ElseIF ( MyID == 8 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 17]
 ElseIF ( MyID == 9 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 18]
 ElseIF ( MyID == 10 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 01]
 ElseIF ( MyID == 11 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 02]
 ElseIF ( MyID == 12 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 03]
 ElseIF ( MyID == 13 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 04]
 ElseIF ( MyID == 14 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 05]
 ElseIF ( MyID == 15 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 06]
 ElseIF ( MyID == 16 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 07]
 ElseIF ( MyID == 17 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 08]
 ElseIF ( MyID == 18 )
  player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 09]
 EndIF[/COLOR]

[COLOR="Magenta"]
 set GB_WormholeActive to 1[/COLOR]
 return
EndIF

[COLOR="Red"]
set Distance to ( GetPos X ); eigene X-Koordinate feststellen

IF	( Distance == Trigger 01 CSPosition X Wert )
 set MyID to 1
ElseIF	( Distance == Trigger 02 CSPosition X Wert )
 set MyID to 2
...
ElseIF	( Distance == Trigger 18 CSPosition X Wert )
 set MyID to 18
EndIF[/COLOR]

end
Du brauchst zusätzlich eine Globale Short Variable (= GB_WormholeActive)

Das Script geht davon aus, dass alle Teleporter in der gleichen Zelle liegen. Sie können aber nicht an den gleichen Stellen liegen, also werden sich ihre Koordinaten im Construction Set unterscheiden. Ich würde es so machen, dass alle Teleporttrigger eine jeweils leicht unterschiedliche X, Y oder Z Position aufweisen. Das läßt sich ja leicht realisieren, indem man die Teile mit einem sauberen Grid auf eine bestimmte Position im CS platziert. Ich habe angenommen, jeder Teleporter hätte einen anderen (eindeutigen) X-Koordinaten Wert. Dann definiert dieser den Teleporter und das Script kann sich anhand der X-Koordinate die ID des Teleporters ermitteln auf dem es liegt (rot markier). Das muß das Script nur ein einziges Mal machen, dann weiss es, welchen Teleporter es steuert).

Mit so einer ID kann man über ein simples IF-Block Array (grün markiert) die ganzen Teleporterziele hinterlegen, dem Teleporter mit ID 01 also sagen, er soll zum Teleporter mit ID 10 beamen und umgekehrt. Ziemlich simpel.

Das weitere wäre dann nur noch das Verhindern des sofortigen Rückteleports. Das geschieht über die Global. Egal welcher Teleporter den Transport auslöst, er setzt die Global auf 1 und sperrt damit erstmal alle anderen Teleporter.

Der erste Teleporter, dessen Script danach anläuft, merkt, dass ein Cooldown angestossen wurde. Er übernimmt dann den Timer des Cooldowns und gibt am Ende den Teleport wieder frei (Magenta markiert).

Du mußt nur die entsprechenden Koordinaten und den Zellnamen in das Script einsetzen, und die Cooldowntime/TriggerDistance. Ich hoffe, ich hab keinen Fehler drin, denn ich hab hier kein CS, um zu testen.



PS:
Man könnte das ganze natürlich noch feiner ausgstalten, indem man die ID des Ausgangsteleporters in die Global schreibt und damit nur den Zielteleporter für eine Weile lahmlegt, während alle anderen noch laufen - aber dazu hab ich keine Lust :D
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Raistlin
den Grün Markierten bereich hab ich nicht ganz verstanden, sorry. Kannst du den mir noch einmal erklären?

er zeigt mir auch die fehlermeldung an (" Player-" not Found)

Sollte das dort nicht (If Player ->PositionCell X,Y,Z, Angle "Cellid" ;[Dest02]
heißen?
 
Nein. Das Script liegt auf dem Teleporter Marker.

Der hat eine ID (MyID, mit Werten von 1-18), ermittelt über seine X-Position.

Wenn das Script durchläuft, kommt es an die Stelle:

IF ( MyID = 1 )
player->PositionCell X,Y,Z,Rotation "CellID"
ElseIF ( MyID = 2 )
...usw.

Hier wird analysiert, welcher Teleporter das Script ausführt. Ist es Teleporter 1, transportiert er den Spieler mit:

player->PositionCell X,Y,Z,Rotation "CellID"

an den Zielort des zugehörigen zweiten Teleporters. Die Werte des Befehls müssen auf das zugehörige Ziel eingestellt werden und der Spieler wird bei Kontakt automatisch dorthin teleportiert. " player-" darf es nicht geben.
 
also das script lege ich nicht auf den trigger sondern auf einen marker??

muss ich da wiklich die genauen daten eingeben :cry: ist so viel arbeit ^^
 
Das Script kommt auf jeden Marker/Trigger. Es sollte doch so sein, dass der Spieler an eine bestimmte Stelle geht und von dort ohne irgendwas zu tun woanders hinteleportiert wird. Also muß das Script auf den Auslöser, der das feststellt.

Und die Koordinaten wirst du schon reinschreiben müssen, wie soll das sonst funktionieren? Sicher ist das Arbeit... aber bissle was mußt du schon auch selbst machen.
 
zeile 38 sagt er (Script Command "Player-" not Found)

du sagst ich soll den script auf Marker setzten ich hab aber Trigger Boxen. Oder war das nicht klar? oder bin ich jetzt komplett falsch XD
 
Zuletzt bearbeitet:
begin RODAutoWormhole_SC

short MyID
float Distance
float Timer

IF (menumode == 0)
set Distance to ( 0 * GetSecondsPassed ) ;BlockTimer Countdown while in MM
return

ElseIF ( Timer > 0 ); Cooldown Timer triggered?
set Timer to ( Timer - GetSecondsPassed )
IF ( Timer <= 0 )
set GB_WormholeActive to 0
set Timer to 0
EndIF
return
ElseIF ( GB_WormholeActive != 0 )
IF ( GB_WormholeActive == 1 )
;Enter Cooldown Time here
set Timer to 5
set GB_WormholeActive to -1; /only one Teleporter manages Cooldown
EndIF
return; dropout until Cooldown reached

EndIF

IF (MyID != 0 )
set Distance to ( GetDistance, player )

IF Distance >= 250 ;too far away
return
EndIF

;do something else here

IF ( MyID == 1 )
player->PositionCell 2919.2231, 2769.3201, 7364.0718, ANGLE "CELLID" ;[Dest 10]
ElseIF ( MyID == 2 )
player->PositionCell 654.4342, Y, Z, ANGLE "CELLID" ;[Dest 11]
ElseIF ( MyID == 3 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 12]
ElseIF ( MyID == 4 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 13]
ElseIF ( MyID == 5 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 14]
ElseIF ( MyID == 6 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 15]
ElseIF ( MyID == 7 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 16]
ElseIF ( MyID == 8 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 17]
ElseIF ( MyID == 9 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 18]
ElseIF ( MyID == 10 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 01]
ElseIF ( MyID == 11 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 02]
ElseIF ( MyID == 12 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 03]
ElseIF ( MyID == 13 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 04]
ElseIF ( MyID == 14 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 05]
ElseIF ( MyID == 15 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 06]
ElseIF ( MyID == 16 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 07]
ElseIF ( MyID == 17 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 08]
ElseIF ( MyID == 18 )
player->PositionCell X, Y, Z, ANGLE "CELLID" ;[Dest 09]
EndIF


set GB_WormholeActive to 1
return
EndIF


set Distance to ( GetPos X ); eigene X-Koordinate feststellen

IF ( Distance == Trigger 01 CSPosition X Wert )
set MyID to 1
ElseIF ( Distance == Trigger 02 CSPosition X Wert )
set MyID to 2
...
ElseIF ( Distance == Trigger 18 CSPosition X Wert )
set MyID to 18
EndIF

end

ab den Rot Markierten Bereich macht er Faxen
 
Du versuchst das SO zu kompilieren? Kann nichts werden. Das kompiliert der erst, wenn alle Daten eingesetzt sind.

• "CELLID" muß durch den Namen der Zelle ersetzt werden, in der die Teleporter sind.
• "ANGLE" muß durch die Blickrichtung in Grad ersetzt werden.
• Benutz besser ein Grid, so dass du ganzahlige Positionen für die Zielpunkte hast.

Und denk dran, am Ende des Scripts müssen auch die

IF ( Distance == Trigger 01 CSPosition X Wert )

Einträge korrekt eingetragen werden, damit sie am Ende mit den richtigen Koordinaten so:

IF ( Distance == 566 )

oder ähnlich aussehen. Vorher wird das eh nichts mit kompilieren. Mach das ganze am besten erst einmal mit einem der neuen Teleportpunkt Pärchen...