Construction Set Ein gutes altes Scriptingproblem

Doctor

Neuankömmling
Also, ich bin grade dabei ein paar Ringtransporter zu basteln. Nun, das Problem besteht darin, dass pro Transporter jeweils fünf Ringe nach oben gehen. Die von PPm Projekts haben einfach 5 verschiedene Transporterringe (alos andere ID's) genommen und denen folgenden Script gewidmet:
if ( timer < 0.0)
elseif (timer < 0.5)
"telportring1"->move z, -1200
"teleportring6"->move z, -1200
elseif ( timer <1)
"teleportring7"->move z, -1200
"teleportring6"->Position 3288.177, 3144.686, 8800, 0
"telportring1"->Position 3993.797, 2985.768, 174.642, 0
"telportring2"->move z, -1200
"tel light"->move z, -1200
elseif ( timer <1.5)
"teleportring8"->move z, -1200
"teleportring7"->Position 3288.177, 3144.686, 8830, 0
"telportring2"->Position 3993.797, 2985.768, 215.791, 0
"telportring3"->move z, -1200
"tel light"->move z, -1000
elseif ( timer <2.0)
"teleportring9"->move z, -1200
"teleportring8"->Position 3288.177, 3144.686, 8860, 0
"ringlight2"->Position 3268.487, 3143.208, 8800, 0
"tel light"->Position 3993.797, 2985.768, 274.642, 0
"telportring3"->Position 3993.797, 2985.768, 248.824, 0
"telportring4"->move z, -1200
elseif ( timer <2.5)
"tel part"->Position 3999.797, 2958.768, 180.642, 0
"tel part2"->Position 3268.487, 3143.208, 8800, 0
"teleportring9"->Position 3288.177, 3144.686, 8890, 0
"teleportring10"->move z, -1200
"telportring4"->Position 3993.797, 2985.768, 282.678, 0
"telportring5"->move z, -1200
elseif ( timer <3.0)
"teleportring10"->Position 3288.177, 3144.686, 8920, 0
"telportring5"->Position 3993.797, 2985.768, 312.960, 0
"holering"->Position 3999.797, 2958.768, 200.642, 0
elseif (timer <3)
elseif ( timer <5)
"holering"->Position 3999.797, 2958.768, -1200.642, 0
"telportring5"->move z, 1200
"teleportring10"->move z, 1200

(Das Schema geht dann für jede halbe Sekunde bis 12 hoch so weiter)


Das ist für die zwei Ringtransporter, die die gemacht haben, noch vertretbar (also es gibt zwei von diesen Monsterdingern), aber wenn ich jetzt 10 oder 20 Ringtransporter mache, dann ist schon ende.

Ich habe mir auch schon was anderes überlegt (diesen Script hänge ich dann dem Activator an):

If (OnActivate==1)
"ring1"-> positioncell [standort des Ringtransporters]
[und das gleiche für die 4 anderen Ringe]
[und den Rest analog wie oben]
Das erspart mir schonmal das erschaffen von 100 gleichen Sachen mit anderem Namen.
Aber ich muss immer noch diese ewige Timer abfolge schrieben. Gibt es dafür nicht einen besseren Weg??
 
Der timer wird hier für Auf-und Abwärtsbewegungen benutzt. Keine Ahnung wie das im Game aussieht und was es bewirkt aber dieser Script-Ausschnitt koordiniert die Bewegung irgendwelcher Objekte. Das wird wahrscheinlich in einer von irgendeinem Genie berechneten und genau ausgetesteten Schleife durchgeloopt so das es passabel aussieht und nicht ruckelt.

Wenn wir nur wüssten was Teleporter-Ringe sind und was sie bewirken sollen...
 
Wozu Google doch alles gut ist.

Ein Bild:
ringtransporter.jpg


Die Seite dazu:
http://stargate-project.de/stargate/index.php?seite=lexikon&aktion=showit&ID=22

Da noch ein Bild:
transporter1.jpg

Da die dazugehörige Seite:
http://www.fortunecity.de/tatooine/strangelove/149/technologie.htm

Diese Ringe legen sich übereinander und man steht dann wie in einem Reifenstapel.
Füsse sollte man einziehen, ebenso überstehende Ellenbogen.
Hth ;)
 
Falls du dir den Mod angucken willst, wo es zwei Ringtransporter bereits gibt, kannst du hier gucken: HIER KLICKEN (dann dort in der Navigationsleiste auf "Stargate (dv)")

Dort kann man sich das Script ingame angucken :win:
 
@ Rene, sorry wenn ich mich nicht ganz klar ausgedrückt habe. Aber eigentlich war meine Frage nicht was der Script bewirkt, sondern ob das ganze nicht irgendwie einfacher zu machen ist.
 
ja, sicher - wenn es nur darum geht die Ringe rauf und runterzubewegen ist das wirklich ein sagen wir mal umständlicher Weg.
Einfacher wäre sicher an jeden Ring das gleiche Script zu machen, die Berechnung beginnt dann an der vom Editor zugewiesenen Startposition,

begin

short Richtung

;Richtung 1 : hoch
;Richtung -1: runter

if ( menumode == 1 )
return ; im Menu brauchen die Dinger nicht rauf und runterzugehen
endif

if ( richtung == 0 )
; bewegt sich noch nix, also hier muss von der ursprünglichen z-Position
; ausgehend gestartet und die Richtung für's erste Mal festgelegt werden
; der Block würde nur einmal durchlaufen
if ( GetPos Z == ganzoben )
; set Richtung to -1
; elseif ( GetPos Z == fast ganz oben usw...
;...
;endif
endif

; dann, wenn die Richtung einmal feststeht

if ( getpos z <= GanzUnten )
set richtung to 1
elseif ( getpos z >= GanzOben )
set Richtung to -1
endif


Moveworld z Richtung * PunkteProSekunde

end script

das script an jedem einzelnen ring, die ringe könnten auch alle gleich heissen wenn's nur darum geht sie rauf und runterzubewegen. Sollten die einzelnen Ringe selbst noch einzigartige Funktionen haben geht's leider nicht so.
 
Eigentlich sollten sich die Ringe nur rauf und runter bewegen. Wenn sie dies getan haben, wird man automatisch an einen andern Ort teleportiert und dort gehen dann die Ringe auch rauf und runter :-D
 
klasse, das erleichtert mir doch einiges. Aber äh, ich versteht den Script nicht ganz zu 100%. Könntest du bitte mal statt der ganzen Variabeln, richtige positionen eingeben. Fang bei 0 0 0 0 an. Danke!
 
die einzigen Positionen die du festlegen muss sind abhängig von der Zelle in der sich der Teleporter befindet. Das wären hier nur die GanzOben und die GanzUnten-Position da der Teleporter nicht in jeder Zelle an der gleichen Stelle ist.
Abhängig von der Anzahl der Ringe und des Abstandes zwischen GanzOben und GanzUnten sollte die Bewegung pro Sekunde auf den halben bis vollen Abstand der Ringe zueinander sein.
Wenn die Ringe sich nur bewegen während Teleportiert wird musst Du eine zusätzliche Globale Short Variable nehmen die während Teleport aktiv ist auf 1 gesetzt wird - daran könnten die Ringe "erkennen" ob sie sich überhaupt bewegen sollen.

Also, ich kann dir hier keine Werte geben weil ich weder die Höhe des Teleportes kenne noch weiss ich wie weit der oberste und der unterste Ring entfernt sind und noch weniger weiss ich an welcher Koordinate du den Teleporter platziert hast.

Also ins Script gehört an der Stelle wo Richtung == 0 - also noch unbestimmt ist - eine einmalige Festlegung der Werte für GanzOben und GanzUnten.
 
Ach mist, jetzt hab eich schon wieder als Gast geschrieben. Grrrr.....
@ Rene Ich habe jetzt probeweise 5 Ringe an folgende Position gesetzt :
"Suran 6,-6" 52776 -45550 716 0

Die 5 Ringe haben jetzt alle dieselbe Position. Kannst du dasjetzt dann bitte mal konkretisieren????? (Ich steh irgendwie auf der Leitung, sry)
 
begin

short Richtung

;Achtung ! Die Ringe müssen die gleiche X + Y Position haben !
;1=oben
;2=unten
;-1=nüx :p

if ( menumode == 1 )
return
endif

if ( GetPos Z >= 716 ) ; Achtung ! Bei einem anderen Cell auch anderen Wert
set richtung to -1
endif

if ( getpos z <= 10 ) ; Achtung ! Bei den anderen Ringen muss es anders sein .
player->set PostitionCell"CELLID" x, x, x, x ; da kommt für x die Position hin bei CELLID die Cell
set richtung to 1
endif

if ( OnActivate"Ringaktivator" == 1 )
set richtung to 2
endif

if ( richtung == 1 )
Moveworld z 30
endif

if ( richtung == 2 )
Moveworld z -30
endif

if ( richtung == -1 )
disable
endif

end

hmm... ich hab den Script etwas abgeändert ... funkt der so ?
ich hab kein CS also kann ich net testen ....
naja auch Egal
:eplo:

Ach und so einen geilen Effekt wie beim SG-Mod gibbet aba net .
hier fahren die Ringe nur runter und nicht abwechselnd runterfahren draufklatschen ....
 
Der Script müsste funktionieren, aber da muss man ja dann doch jedem Ring einen anderen anhängen. Und das mit den Effekten: Die Sounddatei dafür habe ich und den Lichteffekt auch. Mann hängt einfach eine Zeile dran playsound "ID"
 
ToBiOh schrieb:
abgeändert

begin

short meinStartpunkt
short Richtung
float GanzOben
float GanzUnten

if ( menumode == 1 )
return
endif

; einfügen:
if ( meinStartpunkt == 0 ) ; erster Durchlauf!
****************************************
endif


if ( RingAktiviert == 0 )
return
endif

if ( GetPos Z >= GanzOben )

set richtung to -1
set RingAktiviert to RingAktiviert + 1

if ( RingAktiviert >= 6 ) ; mindestens 5 Ringe waren jetzt einmal oben
set RingAktiviert to 0

if ( MeinStartPunkt == 1 )
Player-> Position x y z zrot "Beispielmora"

elseif ( MeinStartPunkt == 2 )
Player-> PositonCell x y z zrot "Vivec, Hoher Tempel"
usw.

endif
return
endif

elseif ( getpos z <= GanzUnten )
set richtung to 1

endif


Weg damit if ( OnActivate"Ringaktivator" == 1 )
set richtung to verkehrt
endif


if ( richtung == 1 )
Moveworld z 30
endif

if ( richtung == -1 )
Moveworld z -30
endif


end

hmm... ich hab den Script etwas abgeändert ... funkt der so ? NEIN!
....

Das X und Y gleich sind ist klar.
Im Script unter

if ( MeinStartPunkt == 0 )
; muss in etwa stehen

If ( GetPCCell "Suran" == 1 )

set GanzOben to zzzzz1
set GanzUnten to zzzzz1 + Abstand von GanzOben nach GanzUnten
set MeinStandPunkt to 1

elseif ( GetPCCell "da wo noch einer steht" == 1 )

set GanzOben to zzzzz2
set GanzUnten to zzzzz2 + Abstand von GanzOben nach GanzUnten
set MeinStandPunkt to 2
;... usw. (die zzzz#-Position ist abhängig vom Aufstell-Ort.)

endif



und das Oben im Text rot markierte:
Die richtige Syntax wäre

if ( RingActivator-> OnActivate == 1 )
wobei zu beachten ist das dies nur die erste Instanz der RingActivator-Objekte erreicht/ abfragt.

Besser ist wenn der Ringaktivator ein eigenes Script hat:
(alle haben das Gleiche!)

begin

global short RingAktiviert
; muss unter Gameplay, Globals dimensioniert werden!
if ( RingAktiviert == 0 )
set RingAktiviert to OnActivate
endif

end
 
Nein musst DU nicht. Alle Ringe können das gleiche Script tragen.
Ich hab mal einen Test gemacht und ein paar Dwemerische Teleporter gebastelt.

Als Demo-Download häng ich es hier an.
Ich hab es mit Tribunal gemacht weil ich dadurch nicht nach jedem Speichern zu cleanen brauche, sind aber keine Trib-objekte drin.

Im Game kommt man nur z.B. per coc "_testzelle1" zu den Teleporter-Zellen.


Das Mitanheben des Spielers durch die Ringe liesse sich etwas vermeiden wenn man die unsichtbare (blaue) Barriere tiefer setzt. Allerdings werden dann kleinere Rassen immer etwas mit angehoben. Möglicherweise hast Du andere Meshes parat die den Spieler nicht mit anheben - dieser Test benutzt halt nur Original-MW-Meshes.

Grösse, Anzahl und Abstand sind total Variabel- schau mal rein vieleicht hilfts...

Vieleicht bringts jemand auch als Konkurenz-System zu den Propylonen in sämtlichen Dwemer-Ruinen unter - soll mir Recht sein.
Wer Objekte oder Scripts hierraus benutzt: Auf jeden Fall eigene Namen für angepasste/abgeänderte Objekte verwenden!

Vieleicht hab ich das alles auch ganz falsch verstanden? Teste es einfach mal an- ich hatte gestern etwa 30 mal das Vergnügen bis alles genehm lief.
 
wow cool, ich teste sofort :D

So, habe getestet, funktioniert ganz gut. Im original müssten die Dinger schneller hoch und runter gehen und das auch mehrmals, bis man weg ist. Aber ich verstehe noch immer nicht warum das funktioniert. Es funktioniert zwar, aber ich weiß nicht warum :Äh?: :cry: :cry:
VIelleicht ist das irgendwie zu hoch für mich. Ich war nie so der Scriptexperte. Kann sich mal einer hinsetzen und sich die Zeit nehmen mir das verständlich zu machen?
 
die Teile wo was dransteht verstehe ich ja auch hauptsächlich. Nuaja, ich werde mal schauen, dass ich den Script einfach so übernehme, ohne viel zu verstehen. Wenn du nichts dagegen hast, versteht sich
 
Ich habe da auch ne Scriptfrage, bzw. allgemeine Frage:

Geht es überhaupt, dass man mit einem Script den Himmel verändert? Also z.B. wenn man auf einen neuen Planeten geht, ist der Himmel komplett rot oder so :-D

Geht das per Script? Wenn nicht, geht das irgendwie anders?