Construction Set Der Scriptthread

Räbbähh- rabatz- mecker mecker, nein-nein-nein so geh das nicht...

1.

if ( OnActivate )
;an einer Tür heisst, der Spieler hat gerade versucht sie zu öffnen. Das
;kann nur passieren wenn die Tür nicht verschlossen ist.
endif

Deswegen darfst Du die Tür NICHT ABSCHLIESSEN !


2.
If ( OnActivate )
; mit darauf folgendem "Activate" an einer Tür die in eine andere Zelle führt bewirkt das
; der CellChanged-Event in der dabei betretenen Zelle nicht stattfindet
; beispielsweise würden befreite Sklaven in einem Raum hinter dieser Tür
; niemals verschwinden- daran sollte man unbedingt denken!
endif

ergo:

das Script sollte also an einer NICHT abgeschlossenen Türe sein die etwa so ein Script trägt:

begin meineVerrammelteTür

if ( MenuMode )
; falls ein Menu auf ist verlassen wir das Script sofort
return
endif

if ( GetLocked )
; hat der Spieler einen Schloss-Zauber auf die Tür gelegt
; dagegen müssen wir also was tun:
Unlock
;und wieder raus hier
return
endif


if ( Player-> GetItemCount "meinSpezialschlüssel" == 0 )
; hat der etwa keinen Schlüssel?
if ( OnActivate )
; will aber trotzdem durch?
; dann kommt die Meldung:
messagebox "Ihr habt keinen Schlüssel für diese Tür!"
; Playsound LockedDoor *
endif
endif

end

* der Name des Sounds für die verschlossene Tür ist mir nicht geläufig aber Du wirst schon den richtigen finden ;)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: MorroFan
Ich glaub ich stell zu viele Fragen.:oops:
Aber, kann man wenn man etwas gekauft oder gefunden hat (ich sag nur Besitzurkunde für ein Haus) mit einem Script die Interior Cell umbenennen?
(z.B: von: ´Haus zu verkaufen´ zu ´%PCNames Haus´ oder ´Euer Haus´)

mfg, MorroFan
 
Du kannst höchstens zwei verschiedene Interiorzellen erstellen, die die unterschiedlichen Namen haben und dann zwei Türen hinmachen. Per Script lässt du halt nur die richtige Tür erscheinen.

Allerdings Variablennamen können in Zellennnamen nicht eingebunden werden. (Also auch nicht der Name des Spielers)
 
  • Like
Reaktionen: MorroFan
Ich stell wirklich zu viele Fragen...

ähm, hallo erstmal. Ich brauch mal nen Telport-script der mich bei benutzen eines items (Ring) zu einer exterior, bzw. interior cell teleportiert.
mfg, MorroFan
 
Code:
begin my_teleportscript
if (menumode == 1)
  return
endif 

If (onPcEquip == 1)
  player->positioncell "Zellname" x,y,z,zrot
endif
end
sowas?
(habe irgendiwe das gefühl, was vergessen zu haben...)
Man kann es auch noch mit einer abfrage machen ala "willst du zu blabla teleportiert werden" Ja/Nein, allerdings kenn ich mich damit nich aus ^^
mfg erc
 
  • Like
Reaktionen: MorroFan
Code:
begin my_teleportscript
if (menumode == 1)
  return
endif 

If (onPcEquip == 1)
  player->positioncell "Zellname" x,y,z,zrot
endif
end
sowas?
(habe irgendiwe das gefühl, was vergessen zu haben...)...mfg erc

Das Gefühl kenn ich :D

Ich hab noch ne andere Methode die aber auf den gleichen Befehl hinausläuft

Allerdings sollte man das Script unbedingt auf ein Kleidungsstück legen (Ring oder Amulett) und zusätzlich zum Script einen Zauber mit Wirkung bei Benutzen. Ganz egal was für ein Zauber- nur der Name des Ringes ist am Ende "wichtig" weil der im Magiemenu erscheint.
Das Tolle daran ist das man den Ring dann per Schnelltaste oder durch Klick auf den Namen des Ringes im Magie-Menu auslösen kann und dabei nicht erst ein anderer Ring abgelegt wird den man dann als Spieler ja erst wieder anziehen müsste.

Das Script geht so:

begin meinRingTeleportScript

short benutzt
short OnPCEquip
short pcSkipEquip

set pcskipEquip to 1

if ( benutzt== 0 )

set Benutzt to OnPCEquip

else

set Benutzt to 0

Player-> Position Xpos Ypos Zpos Zrot "ExteriorCellName"

endif

end

; dieser Befehl teleportiert den Spieler in eine Exterior-Zelle
; funktioniert nur mit Exteriors die einen Namen haben wie "Balmora", "Zergonipal", "Dagoth Ur"
; - aber NICHT in Regionen wie "Bitterküste","Aschland","Roter Berg"
; möglich wäre auch:

; Player-> Position XPos YPos ZPos Zrot
; das geht nur im gleichen Interior oder wenn der den Koordinaten
; entsprechende Exteriorbereich in der Nähe (geladen) ist
; und was auch noch geht:

; Player-> PositionCell XPos YPos ZPos ZRot "InteriorCellName"

; der verfachtet den Spieler an die entsprechende Position in der
; benannten Zelle.


; allen 3 Befehlen gemein ist das sie wie ein "Return"-Befehl wirken
; und nach dem Abarbeiten des Position-Befehles wird das Script verlassen
; daran sollte man denken wenn man damit experimentieren will...
 
  • Like
Reaktionen: MorroFan
dann halt statt player->positioncell x,y,z,zrot "zellname"
Ich sagte ja, ich hab ein komsches Gefühl...

Ich hab dann auch noch ne Frage: Kann man ein script schreiben, das überprüft, wieviel Health der Spieler noch hat und wenn sie unter 10 fällt, ihm einen Spruch added? Es soll halt funktionieren, ohne das man immer etwas anhaben oder sichtbares im inventar haben muß ^^
mfg erc
 
Ja, du musst das Script halt nur einmal starten.

Das machst du mit dem Befehl StartScript, Scriptname. Das Script selbst liegt nirgendwo drauf (ist also ein globales Script). Wo und wie du dieses Script auslöst, ist deine Sache.

Code:
begin my_script

if ( Player->GetHealth < 10 )
Player->AddSpell "my_spell"
StopScript my_script
endif

end
 
  • Like
Reaktionen: ercvomnil
Und wie lös ich das am dümmesten mal aus? Ich kann ja nun schlecht das Main-Script ändern :)
Ich hab mir schon mal den Mod "Amulett der Elemente" angesehen, da wird das script ja auch immer gestartet und added das Amulett, wenn es noch nicht im Inventar liegt. Ich konnte allerdings nicht herausfinden, wie das geht ^^" (das starten, nicht das adden)
mfg erc
 
also nochmal: ich bin ein absoluter noob im scripten. kann ich nun den script von ReneMiner so übernehmen oder muss da noch was verenglischt werden?:shock:
 
@erc: Da ich einfachmal unterstelle, dass das Script für DSUNK ist, würde ich folgendes Script auf einen unsichtbaren Activator (EditorMarker.nif) legen und den Raum platzieren, wo der Effekt ausgelöst werden soll.

Code:
begin my_start_script

short doOnce

if ( doOnce == 0 )

;hier ist noch Platz für eventuelle andere Bedingungen, wie Journal
StartScript my_script
set doOnce to 1
endif

end

@MorroFan: Ohne jetzt erc auf die Füße treten zu wollen, aber in der Regel solltest du gute Ratschläge von Rene immer annehmen :)
Sein Script kannst du so übernehmen. Alle Zeilen mit ; am Anfang sind Kommentare und werden vom Compiler ignoriert. Sein Script sieht also in etwas übersichtlicherer Form so aus:

Code:
begin meinRingTeleportScript

short benutzt
short OnPCEquip
short pcSkipEquip

set pcskipEquip to 1

if ( benutzt== 0 )
[INDENT]set Benutzt to OnPCEquip[/INDENT]
else
[INDENT]set Benutzt to 0
Player-> Position Xpos Ypos Zpos Zrot "ExteriorCellName"[/INDENT]
endif

end
 
Das Problem ist nur: Ich kann nicht in jeder Zelle von MW einen Activator platzieren ^^", denn das Script soll dann Global, soll heißen überall laufen.
Aber kann man das Script nich an zB ein Licht hängen? Ich weiß das bei der Strahlenkrankheit von Rene ein Ligth geaddet wurde, das aber nicht im Inventar angezeigt wurde - mait müßte es doch gehen...
Das dann hinzufügen ist nich das Problem, nur wirkt das script, wenn ich es so machen würde auch wie gewünscht? (bzw tritt es überhaupt in action?)
mfg erc
 
I need a script

Also: ein plugin: Ein wurfspeer, der wenn man ihn geworfen hat, in wurfrichtung in einem bestimmten abstannt "liegen bleibt"
(ich weis, das irgentwas vonwegen "placeatpc" drinnen forkont... aber mehr auch nicht:oops::oops:)
P.S.: die ID ist Fl_wurfspeer_eisen (oder Stahl, Ebenerz USW)
 
sry, wenn ich schon wieder nerve ^^" aber ich brauch noch ein script, das den gegenstand, auf dem es liegt von 5-21 uhr enabled und von 21-5 disabled. Ich hab schon mehrere versionen ausprobiert, aber keine funktioniert :cry:
Ich weiß, das es mit Gamehour und </> ist, aber es klappt halt nicht...
mfg erc
 
Das Problem ist nur: Ich kann nicht in jeder Zelle von MW einen Activator platzieren ^^", denn das Script soll dann Global, soll heißen überall laufen.
Aber kann man das Script nich an zB ein Licht hängen? Ich weiß das bei der Strahlenkrankheit von Rene ein Ligth geaddet wurde, das aber nicht im Inventar angezeigt wurde - mait müßte es doch gehen...
Das dann hinzufügen ist nich das Problem, nur wirkt das script, wenn ich es so machen würde auch wie gewünscht? (bzw tritt es überhaupt in action?)
mfg erc

Nachdem das Script einmal aktiviert wurde, läuft es immer weiter. Das heißt, du aktivierst es über einen Activator in einer Zelle, die der Spieler während deines Mods zwangsweise betritt oder durch Result in einem Dialog.

Dein zweites Script:

Code:
begin my_script

short doOnce

if ( doOnce == 0 )
  if ( GameHour >= 5 )
    gegenstand->enable
    set doOnce to 1
  else
    gegenstand->disable
  endif
else
  if ( GameHour > 21 )
    gegenstand->disable
    set doOnce to 0
  endif
  if ( GameHour < 5 )
    gegenstand->disable
    set doOnce to 0
  endif
endif

end


@Fuchsli:

So genau wirst du das nicht machen können. Zumindest das Registieren eines Abwurfs wird schwierig werden. Außerdem hast du in Exteriorzellen ein Problem mit Gelände, so dass der Speer dann im Boden verschwunden ist oder in der Luft schwebt und in Interiorzellen, dass der Raum nur beschränkt ist. Ich denke nicht, dass sowas machbar ist.
 
  • Like
Reaktionen: ercvomnil
Ja man kann dem Spieler bei Morrowind einfach statische Lichter (also kein Kreuz bei "Can Carry" ) ins Inventar packen. Die sieht man auch nicht im Inventar und sie können auch Scripte tragen - sollten allerdings auf keinen Fall Sound haben weil sonst manchmal der Ton im Spiel anfängt zu knattern.

Für ein die ganze Zeit laufendes Script solltest Du in Erwägung ziehen ein Startup-Script einzusetzen (benötigt mindestens Tribunal)
Geh im TES-CS oben am Menu Gameplay auf "Edit startscripts"
dann kannst Du festlegen welche Scripts deines Mods sofort gestartet werden sollen wenn das Spiel geladen wird. Lege aber nur ein Startupscript pro PlugIn fest und starte von diesem aus mit dem Startscript-Befehl
eventuell benötigte weitere Scripte. Diese laufen dann zu 100% global.

Wenn Du vorhast das Script von einem Objekt/Dialog aus zu starten damit es "global" weiterläuft dann muss das Objekt/der Sprecher als persistent markiert sein sonst gibt es nach dem Speichern und Neuladen des Spielstandes eine Fehlermeldung das nicht festgestellt werden kann welches Objekt das Script gestartet hat.
Durch Objekte oder Dialoge oder durch Scripts an Objekten mit dem Startscript-Befehl gestartete Scripte laufen nicht wirklich global- sondern sind lokal, sogenannte "Targeted Scripts" - damit lässt sich auch 'ne Menge anfangen, aber nicht das Richtige für diesen Zweck.

Beispielsweise kann man eine Dialogzeile zum Thema "Gesundheit" schreiben:
"Ich glaube ich werde gleich sterben"

unter der Antwort im Result steht:

Startscript meinTestScript
goodbye
___________________________

das hier aufgerufene

begin meinTestscript


if ( MenuMode == 0 )

stopscript meinTestscript

if ( HasItemEquipped "Iron Helm" )
additem Gold_001 12345
sethealth 0
endif

endif

end
____________________________
(nicht abtippen- iss nur'n Beispiel :D :D :D)

das bewirkt das jeder NPC der diese Dialogzeile spricht nach dem Gespräch 12345 Draken bekommt und dann tot umfällt - aber nur wenn er einen Eisenhelm trägt ;)
 
  • Like
Reaktionen: ercvomnil
Was für ein geiles Bespiel - danke, du hast mir grad ein herzhaftes Lachen beschert :lol::lol::lol:
Was würde ich nur machen, wenn es euch nicht gäbe?
mfg erc

Edit: Fuchsli, ich denk mal, du willst den Speer wiederaufheben können, um halt nur einen mit rumzuschleppen, oder? Man könnte es doch so machen, das immer, wenn der spieler diesen speer geworfen (dh damit angegriffen hat) ihm ein neuer Speer geaddet und equipt wird, oder?
mfg erc
 
Zuletzt bearbeitet: