Construction Set Der Scriptthread

Naja, 1000 Einheiten pro Sekunde wegbewegen- sollte eigentlich gehen.
Wenn Deine Wand ein Activator ist wäre das auch in Ordnung....
Hörst Du den Sound? Kommt der Journal-Eintrag?

Ich seh keinen Fehler, hilft nur das: (mach das an die Wand)

begin Testscriptdiagnose

short Aktivierbar
float NeuePosX
float AlteXPos

if ( AlteXPos == 0 )
set AlteXPos to GetPos X
else

if ( getPos X != AlteXpos )

set NeuePosX to GetPos X
set aktivierbar to -1


else

if ( GetJournalIndex "blabla">=123 )
set aktivierbar to 1
if ( OnActivate )
messagebox "aktiviert"
journal "blabla" 456
playsound3d "door stone open"
moveWorld X 123
endif
endif

endif

endif

end


Mach das mal an die Mauer, stell sie aber nicht an X-Position 0 auf (ganz wichtig! Sonst musst Du die 0 in der allerersten Zeile gegen eine andere von X verschiedene Zahl austauschen)

Dann stell Dich vor die Mauer (inGame)
öffne die Konsole aber so das Du die Mauer siehst und klick die
Mauer an so das die ID oben am Rand der Konsole steht.
Dann tipp ein
SV [enter]

und Du bekommst die Werte der Mauer angezeigt, "Aktivierbar" sagt Dir ob das Script überhaupt ausgeführt wird (also die Bedingungen bis hierhin zutreffen) und die Positionen, könntest DU aber auch inGame einfach mit GetPos X abfragen

Schliess die Konsole, aktiviere die Mauer, kuck was passiert
Eine Messagebox sollte anzeigen wenn das Aktivieren registriert wurde.
Schau im Zweifelsfall
wieder in die Konsole und frag die Werte der Mauer ab.
Falls alles passiert- aber die Mauer sich noch immer nicht rührt dann versuch es mit
Move X 1000
anstelle von MoveWorld, obwohl auch ich davon ausgehe das MoveWorld richtig ist.
Kannst auch mehrmals probieren, musst nur die Mauer über die Konsole mit
SetPos X 123
wieder an die alte Position setzen.
 
Zuletzt bearbeitet:
Ja, die Mauer ist ein Activator. Ich habe es mit dem Befehl Move und MoveWorld probiert, genau das selbe Ergebnis: Der Sound wird abgespielt, der passende Tagebucheintrag kommt auch. Nur die blöde Mauer bewegt sich nicht. Das heißt, sie bewegt sich schon, aber nur um genau drei Einheiten. Genauso war es gestern auch schon, allerdings habe ich das aufgrund der geringen Veränderung nur unterschwellig wahrgenommen. Jetzt konnte ich dank deiner Hilfe die Daten erfragen, daher habe ich festgestellt, dass es sich um drei Einheiten an der X-Achse entlang bewegt. Aber wieso drei? Wo steht in meinem Script, dass sie sich um drei Einheiten bewegen soll?

Wenigstens stehe ich nicht alleine auf dem Schlauch, das lässt mich nicht völlig verzweifeln. :D
 
Die Bewegung eines Gegenstandes mit diesen Befehlen wird über die Framerate gesteuert. Du musst den Befehl kontinuierlich geben, damit sich die Mauer bewegt.
Sowas geht zB. mit einem Timer. Ansonsten bewegt sich die Mauer halt nur für einen Frame lang mit 1000 Einheiten pro Sekunde. Scheinbar hast du also eine Framerate von etwa 333 fps...

Außerdem ist 1000 auch eine ziemlich hohe Geschwindigkeit. Nach meiner Erfahrung werden Geschwindigkeiten über 800 nicht mehr korrekt interpretiert. Ich hatte mal einen Meteor, der sich mit 1500 bewegen sollte aber nur so vor sich hingeschlichen ist. Scheinbar gibt es dort irgendwelche Compilerprobleme.
 
Scriptanfrageeeen~

1. Eine Tür darf nur dann aufgehen, wenn alle Items aus dem Inventar in eine bestimmte Truhe gelegt wurden.

2. Bei einer bestimmten HP unterschreitung, muss wird man in einen bestimmten raum teleportiert und vollkommen geheilt.

3. Wenn ein bestimmtes Item benutzt wird, wird man in einen bestimmten Raum teleportiert.

4. Wenn eine Bestimmte Tür durchschritten wurde, muss ein anderer Dialog eines NPC's kommen als wenn man durch Aufgeben (skript 2 und 3) zu diesem NPC kommt.

___
sicher bissle viele aber is wichtig T_T
 
So, ich wollte mal fragen ob mein Script so geht.
Der Sinn des Scripts ist dass wenn man ein Schalter aktiviert eine Mauer verschwindet.

Also:
Code:
Beginn my_schalterscript

if OnActivate == 1
wand.disable
endif

Irgendwie zu kurz. Kann nicht stimmen.
 
Weiss nciht ob deins so geht wenn müsste da noch ein -> hin
Code:
Beginn my_schalterscript

if ( OnActivate == 1 )
"wand_ID" -> disable
endif

End

Dabei müsste die Wand persitert oder so was sein. Einfach ein Häckchen wo man da eins machen kann, eins machen.

Ich mache das aus irgendein grund immer anderst:

Code:
Begin Schalter

If ( onActivate == 1 )

set Wandverschwinde to 1

endif
End

Dabei ist Wandverschwinde eine Globale variable
Der kommt an den Schalter

Der kommt jetzt an die Wand

Code:
Begin Wand

If ( Wandverschwinde == 0 )
Enable

elseIf (Wandverschwinde == 1 )
Disable

EndIf
end
und es muss auch so Persidentiert werden weiss gerade nciht wie das heist
 
Zuletzt bearbeitet:
und es muss auch so Persidentiert werden weiss gerade nciht wie das heist

Es heißt "Reference Persistent" und nein bei der zweiten Möglichkeit muss die Wand nicht persistent sein. Was ein riesiger Vorteil ist, wenn man viele Instanzen von einem Objekt machen will (bei Reference Persistent geht nur ein Objekt pro ID).
 
Ach ja- das hatte ich vergessen, aber Lichtkrieger hat ja hoffentlich Licht ins Dunkel gebracht, als ich würd's dann so schreiben:

begin MauerWeg

float StartPos
float EndPos
short Richtung

if ( MenuMode )
return
endif

if ( StartPos == Endpos)
set startpos to getpos X
; die 1000 sind die gesamte Strecke über die das Teil dann bewegt wird
set Endpos to StartPos + 1000
endif


if ( Richtung == 0 )

if ( OnActivate == 0 )
return
endif

if ( GetJournalIndex "DarfDasAufmachen" >= erfüllt )

if ( GetPos X <= Startpos )
; die 32 ist der Wert den das Teil pro Sekunde bewegt wird
; das Vorzeichen sagt die Richtung in die bewegt wird

set Richtung to 32
else
; wenn es auch wieder zurückgehen soll: (sonst nicht!)
set Richtung to -32
endif

endif

elseif ( Richtung < 0 )

if ( GetPos X> Startpos )
MoveWorld X Richtung
else
set Richtung to 0
endif

elseif ( Richtung > 0 )
if ( GetPos X < Endpos )
moveworld X Richtung
else
set Richtung to 0
endif

endif

end
 
Zuletzt bearbeitet:
Rene, was ist bloß los mit dir...

if ( StartPos == Endpos)
set startpos to getpos X
; die 1000 sind die gesamte Strecke über die das Teil dann bewegt wird
set Endpos to StartPos + 1000
endif

An dieser Stelle musst du >= nehmen, denn da beides float-Werte sind, die sich schnell verändern, werden sie niemals den gleichen Wert annehmen. Sondern sich um Bruchteile von Editoreinheiten verfehlen.
Das musste ich selber leidvoll erfahren.
 
Ich wollte nur kurz anmerken, dass es bei mir nun funktioniert, weil ich einen Timer eingebaut habe. Danke für eure Hilfe. :)
 
ich MUSS leider nochmal drauf zurückkommen:

Scriptanfrageeeen~

1. Eine Tür darf nur dann aufgehen, wenn alle Items aus dem Inventar in eine bestimmte Truhe gelegt wurden.

2. Bei einer bestimmten HP unterschreitung, muss wird man in einen bestimmten raum teleportiert und vollkommen geheilt.

3. Wenn ein bestimmtes Item benutzt wird, wird man in einen bestimmten Raum teleportiert.

4. Wenn eine Bestimmte Tür durchschritten wurde, muss ein anderer Dialog eines NPC's kommen als wenn man durch Aufgeben (skript 2 und 3) zu diesem NPC kommt.

___
sicher bissle viele aber is wichtig T_T
 
1. Nicht zu machen. Sobald ich etwas mehr Zeit habe, such ich einen Thread heraus in dem Rene eine alternative Methode erarbeitet hat.

2. Ist dein Kampfgebiet in einer Interiorzelle oder in mehreren Exteriorzellen untergebracht? Das beeinflusst meine Herangehensweise.

3. Schon mal was von einem Teleportamulett gehört? Die Suchfunktion hilft da bestimmt...
Aber ich will mal nicht so sein:
begin my_amulett_script

if ( OnActivate == 1 )
set my_NPC.weg to 2
Player->PositionCell xpos ypos zpos zrot "Zellenname"
endif

end


4. Setzte in jedem der drei Scripte ein lokale Variable, die du auf den NPC legst und frag diese im Greeting mit der Funktion Local ab.

Auf dein NPC legst du folgendes Script:
begin my_NPC_script

short weg

end


und auf die Tür legst du folgendes:
begin my_door_script

if ( OnActivate == 1 )
set my_NPC.weg to 3
Activate
endif

end


Im Dialog kannst du dann in der Resultbox den Wert von weg wieder auf 0 setzten und somit einen neuen Durchgang starten.
 
  • Like
Reaktionen: Verganon
danke erstma.

1. ich dachte da schon an diese möglichkeit, kann sie aber nicht umsetzen weil ich keine ahnung davon habe: das gewicht was der Spieler trägt MUSS = 0 sein.

2. die meisten sind exterriors es gibt aber auch interriors.
 
Beim 1. kannst du einfach durch ein Script sagen der Player legt alle Gegenstände ab oda so, und dann legt er die Rüstung an.
Gibts net in Arktwend was ähnliches?
 
nici so EINFACH geht das bei mir nich, weil ich einfach nich zurecht komme mitm skripten also bitte nen skript dazuschreiben und nich nur "dumm" labern. sonst könnt ich es ja auch selbst machen, wenn ichs könnte...
 
Beim 1. kannst du einfach durch ein Script sagen der Player legt alle Gegenstände ab oda so, und dann legt er die Rüstung an.
Gibts net in Arktwend was ähnliches?

Zu dem Thema einfach:
Es gibt für dieses Problem keine einfache Lösung. Eben nur die von Rene vorgaschlagene:
http://forums-de.ubi.com/eve/forums/a/tpc/f/398100233/m/3641011624?r=7091031624#7091031624
Hier gibt es die Kurzform des Ganzen. Einfacher ist es wohl nicht zu machen. Und man kann es immer noch austricksen, wie ich in meinen Versuchen zu Ananke schon feststellen musste.
 
  • Like
Reaktionen: Verganon
nochmals danke, dann fehlt nurnoch nummer 2 und dann gehts munter weiter in den Kampfgebieten (Killfetzer Crediteintrag is dir sicher sicher und vielleicht noch etwas mehr)
 
So, zu 2:
Da du hauptsächlich Exteriors verwendest, schlage ich dir folgendes vor:

Beim betreten des Kampfgebiets startes du ein globales Script. Das heißt ein Script das nirgendswo angehängt ist. Dies kannst du durch den Befehl
StartScript my_global_script
tun.

Dieses Script sieht nun in etwa so aus:

begin my_global_script

if ( Player->GetHealth < 50 )
Player->ModCurrentHealth 99999
set my_NPC.weg to 1
Player->PositionCell xpos ypos zpos zrot "Zellenname"
StopScript my_global_script
endif

if ( Player->GetCell "Kampfgebietname" == 0 )
StopScript my_global_script
endif

end


Letzte if-Bedingung ist notwendig um das Script zu beenden, wenn der Spieler das Gebiet auf anderem Weg verlässt.
 
Rene, was ist bloß los mit dir...



An dieser Stelle musst du >= nehmen, denn da beides float-Werte sind, die sich schnell verändern, werden sie niemals den gleichen Wert annehmen. Sondern sich um Bruchteile von Editoreinheiten verfehlen.
Das musste ich selber leidvoll erfahren.

Falsch Killfetzer:

if StartPos == Endpos, das heisst wenn Start und Ziel noch den gleichen Wert haben, nämlich 0, genauer gesagt nur im allerallerersten Scriptdurchlauf will ich die Werte festlegen. Spar mir eine zusätzliche DoOnce-Variable ;)

Und zu dem Post hier drüber:
Es gibt kein
if ( Player->GetCell "XYZ-Zelle" ) !!! das solteest Du eigentlich wissen.
Der Befehl lautet
if ( GetPCCell "xyz-zelle" )
 
Zuletzt bearbeitet: