PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Scriptproblem



eissceda
06.09.2008, 19:59
Ich bin gerade dabei mich ein bisschen mit Moden zu beschäftigen(genauer gesagt bastle ich gerade an einer kleinen Hausmod herum)

Und ich bin gerade dabei die Trainingshalle einzurichten. Jetzt habe ich das Problem, das das Script nicht das macht, was es eigentlich tun soll. Und zwar die Truhe beim Aktivieren wieder verschließen. Leider tut es das nicht. Stattdessen ist die Truhe gar nicht verschlossen(hat im CS ein Schweres Schloss) und lässt sich auch nicht aktivieren. Außerdem habe ich keine Ahnung, ob und wie ich das Öffnen der Kiste verhindern kann. Und wie ich es hinbekomme, das die Kiste danach sofort wieder verschlossen ist.

Das hier ist die Funktion, die die Truhe wieder verschließen soll, was es aber nicht tut.


Begin OnActivate
if GetLocked == 0
Lock 99;
endif;
End

Falls jemand einen Tipp oder eine Lösung für das Problem hat währe ich sehr dankbar.

Rosebud
06.09.2008, 20:43
Wegen dem aktivieren, sobald du ein Script verwendest bei z.B Tür oder Container


Beachte, das dieses die normale Aktivierung des Objektes verhindert. Um die Standard-Aktivierung des Objektes wieder herzustellen, mußt du ACTIVATE darauf ausführen.

eissceda
06.09.2008, 21:25
Danke für den Hinweiß, Rosebud, aber leider hilft mir das bei meinen Problem nicht weiter. Zwar geht die Kiste jetzt auf, allerdings ist sie nicht verschloßen und muss nicht mit dem Dietrich geöffnet werden.

Low Post
06.09.2008, 23:38
Versuch mal folgendes:

Begin OnActivate
Lock 99
Activate
End

eissceda
07.09.2008, 22:30
Klappt leider auch nicht. Anscheinend verhindert alleine schon das legen eines Scriptes auf einen Gegenstand das Verschließen des Gegenstandes.

Jetzt bin ich auf die Idee gekommen, das verschließen von einem Questscript machen zu lassen(das immer wieder ausgeführt wird, sobald die Truhe geöffnet wird).
Leider funktioniert das aber auch nicht.
Bei meiner Truhe habe ich die Referenz Editor ID eingetragen und den Haken bei Persistenter Referenz gesetzt (Genau wie bei der Questtüre für die Magiergilde in der Festung Blaublut), sobald ich die Referenz in einem Befehl verwende meldet er mir, das er den Befehl nicht gefunden hat und ohne Referenz meldet er, das ich eine Referenz eintragen soll. Habe ich irgendeinen Punkt übersprungen oder woran liegt das?
Es macht hier übrigens keinen Unterschied, ob den Befehl in einer Questscript verwende oder ob ich ihn bei einer Queststage als Resultscript verwende.

Anbei noch mal der Befehl:

000eisLockChest.lock 99;
000eisLockChest ist die bei der Kiste eingetragene Referenz Editor ID.

Muecke49
08.09.2008, 00:18
Vielleicht hilft Dir das hier weiter. (http://cs.elderscrolls.com/constwiki/index.php/How_to_make_re-lockable_doors_%26_containers)

Im Grunde macht der dort beschriebene Container das was du willst. ;) Das Script ist im Grunde recht gut erklärt, allerdings auf Englisch. :)

Low Post
08.09.2008, 01:46
Das Problem sind die Zahlen am Anfang.
Bei Referenzen löscht das CS die automatisch raus oder irgendwie sowas. Verwende stattdessen AAA, dann erscheinen die auch am Anfang der Liste und das CS akzeptiert sie ohne Probleme.



Und was mein Script angeht: bei mir hat das ohne Probleme funktioniert, bei Aktivierung (gut, nur per Konsole via Activate Player 1 da ich zu faul war ein Mesh zuzuweisen, das wirkt aber wie eine normale Aktivierung) öffnet sich das Schossknacken-Menü.
Ingame wird das aber nicht angezeigt, da das Script natürlich erst beim Öffnen ausgeführt wird und wenn man das Schloss dann knackt ist der Container natürlich nicht mehr verschlossen. ;)
Dafür ist dann ein Gamemode-Block nötig. Du könntest ja auch mal den hier versuchen:

Begin Gamemode
if ( GetLocked == 0 )
Lock 99
endif
End

eissceda
08.09.2008, 12:54
Danke für die Hinweise, aber ich habe jetzt eine Lösung für das Problem gefunden.
Anstelle von einem Container verwende ich jetzt eine Tür ohne Ziel(dann muss ich das Öffnen des Containers auch nicht mehr abfangen). Irgendwie funktionert das erste Script von Low Post bei der Türe ohne Probleme während es bei der Truhe keine Wirkung zeigt.
Ich vermute, das das irgendwie damit zusammenhängt, das ich die Truhe in einer Zelle die dem Spieler gehört platziert habe, außerhalb dieser Zelle und bei Türen funktionert das Script einwandfrei.
Übrigens kann man das verschließen auch in das OnActivate mit reinmachen, nach dem Aktivieren, dann wird die Tür/Truhe danach immer gleich wieder verschloßen.

Nochmals Danke für eure Hilfe

eissceda
15.03.2009, 18:25
Der Mod nähert sich langsam aber sicher der Fertigstellung. Allerdings tauchten jetzt noch ein paar kleine Probleme auf.

Ich habe das Verschließescript jetzt noch mal um die Möglichkeit, die Stärke des Schlosses zu ändern, erweitert. Außerdem habe ich Trainingselytra eingefügt, die ich über Script Steuern möchte. Und für beides benötige ich Messageboxen, die aber nicht funktionieren. Hier die aktuelle Version des Verschließescripts. Es so zu erstellen wie hier im Scriptingtutorial habe ich schon versucht, aber das hat auch nichts geholfen(möglicherweise weil es bei dem Tutorial in einem Zauberspruch verwendet wird).

scn 000eisLockscript

int Entscheidung

begin onActivate
if player.isSneaking == 1
MessageBox "Wie schwer soll die Tür verschlossen sein?", "Sehr schwer", "Schwer", "Mittel","Leicht","Sehr leicht"
Set Entscheidung to GetButtonPressed
if Entscheidung == 1
lock 80
elseif Entscheidung == 2
lock 40
elseif Entscheidung == 3
lock 20
elseif Entscheidung == 4
lock 7
else
lock 99
endif
endif
else
Activate
Lock
endif
end

2. Wie schon erwähnt wird die Trainingselytra ebenfalls per Script gesteuert. Während die Funktionen zum Beginnen und Beenden des Kampfes und zum Ausräumen der Pfeile funktionieren habe ich keine Ahnung wie ich ihn dazu bringen soll auf seine Startposition zu gehen, sich nicht zu bewegen und Angriffe zu ignorieren. Eventuell könnte ich dazu auch noch eine zweite Trainingselytra einfügen, die nur als Zielscheibe dient, allerdings müsste ich auch dazu wissen, wie ich sie dazu bekomme unter Beschuss still zu sitzen.

3. Meine Händlerin trägt tagsüber eine Rüstung und nachts und beim Essen normale Kleidung. Und die Sachen, die sie aktuell nicht trägt verkauft sie. Ist es möglich das Verkaufen der Items im Inventar(ohne erstellen von unspielbaren Kopien der Rüstung/Kleidung/Waffen) zu unterbinden?

Danke schon mal für euere Hilfe

Satsuma
15.03.2009, 18:34
Hi,
GetBUttonPressed geht nicht in einem OnActivate block. Dieser Weißheit hatte mich mal Low Post gelehrt. xD
Also müsstest du einen 2 Block einfügen, einen GameMode.



scn 000eisLockscript

short DoOnce
int Entscheidung

begin onActivate
if (DoOnce == 0)
Set DoOnce to 1
endif
end

Begin GameMode
If (DoOnce == 1)
if (player.isSneaking == 1)
MessageBox "Wie schwer soll die Tür verschlossen sein?", "Sehr schwer", "Schwer", "Mittel","Leicht","Sehr leicht"
Set Entscheidung to GetButtonPressed
if Entscheidung == 1
lock 80
elseif Entscheidung == 2
lock 40
elseif Entscheidung == 3
lock 20
elseif Entscheidung == 4
lock 7
else
lock 99
endif
endif
else
Activate
Lock
endif
Set DoOnce to 0
end

Low Post
15.03.2009, 20:00
Eher nicht, da ist immer noch keine Absicherung für den Fall drin, dass GetButtonPressed nicht sofort den richtigen Wert annimmt. ;)


scn 000eisLockscript

int Entscheidung
int Menu

begin onActivate
if player.isSneaking
MessageBox "Wie schwer soll die Tür verschlossen sein?", "Sehr schwer", "Schwer", "Mittel","Leicht","Sehr leicht"
Set Entscheidung to GetButtonPressed
set Menu to 1
else
Activate
Lock
endif
end

Begin Gamemode
if Menu
if Entscheidung == -1
set Entscheidung to GetButtonPressed
Return
elseif Entscheidung == 0
lock 80
elseif Entscheidung == 1
lock 40
elseif Entscheidung == 2
lock 20
elseif Entscheidung == 3
lock 7
else
lock 99
endif
set Menu to 0
endif
End

Außerdem hattest du ein Endif zu viel drin (heißt: Activate & Lock-Befehl wurden immer ausgeführt). Und du solltest dich daran gewöhnen, dass man eigentlich immer mit 0 zu Zählen beginnt (heißt: bei der erste Antwortmöglichkeit gibt GetButtonPressed 0 aus, bei der zweiten 1, etc.).

eissceda
15.03.2009, 20:08
Danke für die Hinweise. Dein Script funktioniert zwar immer noch nicht richtig, allerdings hat es mich auf eine Idee gebracht, wie ich das Script umschreiben kann, damit es funktioniert. Jetzt sieht es so aus. Und noch ein Hinweis für alle, die etwas Ähnliches machen wollen: Die Tür darf sich nicht ans Spielerlevel anpassen, da sonst das Spielerlevel auf die per Script zugewiesenen Werte addiert wird und das Script somit nicht mehr funktioniert. Es hat einige Zeit gedauert bis ich darauf gekommen bin, das das die Ursache für die falschen Locklevel mit der angepassten Variante sein könnte.

scn 000eisLockscript

short DoOnce
int Entscheidung

begin onActivate
if (player.isSneaking)
if (DoOnce == 0)
MessageBox "Wie schwer soll die Tür verschlossen sein?", "Sehr schwer", "Schwer", "Mittel","Leicht","Sehr leicht"
Set DoOnce to 1
endif
else
Activate
Lock
endif
end

Begin GameMode
If (DoOnce)
Set DoOnce to 0
Set Entscheidung to GetButtonPressed
if Entscheidung == 0
lock 99
elseif Entscheidung == 1
lock 80
elseif Entscheidung == 2
lock 40
elseif Entscheidung ==3
lock 20
elseif Entscheidung == 4
lock 7
else
Set DoOnce to 1
endif
endif
end

Edit: Ich glaube ich nehme doch die Variante von Low Post, da die etwas performanter sein dürfte.

Low Post
15.03.2009, 20:17
ó_0


Kommt so ziemlich aufs gleiche raus.
Was mann noch diesbezüglich machen könnte wäre das == 1 nach ja/nein-Abfragen zu löschen (weglassen bedeutet != 0). All zu groß sollte der Effekt aber auch nicht sein. Ich hab das trotzdem spaßeshalber mal gemacht. :p

eissceda
15.03.2009, 22:39
Es hat sich ergeben, das es doch nicht ganz funktioniert. Das Satsuma beim Zählen mit 1 angefangen hat liegt daran, das ich das auch gemacht habe. Und ich habe das gemacht, weil die 0 die Default-Variante, die verwendet wird, wenn keiner der anderen Werte passt. Ist mir eben bei ersten Tests im Spiel aufgefallen.