Construction Set Der Scriptthread

Und: Ich weiß nicht, wie man einen Journaleintrag an den Tod einer Kreatur anhängt... :cry:

Das ist recht leicht: Du legst folgendes Script auf die Kreatur:
Code:
Begin bla
 
if ( GetHealth <= 0 )
  Journal journaltitel [indexnummer]
endif
 
end

Zu den anderen Sachen fällt mir momentan leider nichts ein. :?

EDIT:
Zu 1:
Du brauchst kein Script, damit du gefälschte Morag Tong-Erlasse herstellen kannst, weil die ID der Erlasse abgefragt wird, wenn eine Wache dich diesbezüglich anspricht, was deinen Plan in dieser Form unmöglich macht.
Jetzt gibt es zwei Möglichkeiten:
Du fälscht einen Erlass nur auf vorher festgelegte NPCs, dann musst du die betreffenden Scripts (kannst du beim entsprechenden Greeting unter Dialoge im Resultfenster nachsehen) um deine IDs erweitern (ist aber jetzt schon ein langes Script, du brauchst 7 oder 8 Zeilen Code für jeden Erlass).
Du möchtest es so haben, dass, wenn dir ein NPC im Weg ist, du einen MT-Erlass fälscht und diesen NPC problemlos aus dem Weg räumen kannst, dann müsstest du für jeden NPC in ganz Vvardenfell einen individuellen Erlass vorbereiten (wo die von Mods hinzugefügten NPCs noch nicht mit inbegriffen sind) => Gute Nacht.
 
Zuletzt bearbeitet:
Hallo, ihr Scriptexperten. Ich habe da ein Problem.

Ich möchte gerne eine Passage durch einen Felshaufen (Aktivator eigene ID) versperren. Der Spieler soll dann, wenn er den Felshaufen anklickt eine Messagebox erhalten: "Ich sollte mir Werkzeug besorgen"

Wenn der Spieler das benötigte Werkzeug gefunden hat (WKZ eigene ID) und in seinem Inventar hat, soll der Felshaufen beim erneuten Anklicken für immer und ewig nach unten in der Versenkung verschwinden damit der Weg frei wird.
 
Also, damit der Fels verschwindet, das hier drauf:
Code:
Begin Haufen
 
if ( GetItemCount "WerkzeugID" >= 1 )
  "HaufenID" -> disable
else
  MessageBox "Du hast nicht das richtige Werkzeug, um diesen Haufen wegzuräumen!"
endif
 
end Haufen

oder, wenn der Fels nach unten absinken soll, dass hier:
Code:
Begin Haufen
 
float zachse
short count
short mover
 
if ( GetItemCount "WerkzeugID" >= 1 )
  set move to 1
else
  MessageBox "Du hast nicht das richtige Werkzeug, um diesen Haufen wegzuräumen!"
endif
 
if ( move == 1 )
  if ( count <= [COLOR=red]30[/COLOR] )
    set zachse to ( GetPos, z ) - [COLOR=red]20[/COLOR]
    set Pos, z, zachse
    set count to count + 1
  endif
endif
 
[COLOR=blue]if ( count == 30 ) ;muss derselbe Wert wie die 30 oben sein[/COLOR]
[COLOR=blue]  "HaufenID" -> disable[/COLOR]
[COLOR=blue]endif[/COLOR]
 
end Haufen
Bei diesem Script musst du bei den roten Werten ausprobieren, was dir dein gewünschtes Ergebnis liefert. Eine Veränderung der 20 wirkt sich auf die Absenkgeschwindigkeit aus, eine Veränderung der 30 wirkt sich auf die Dauer des Absenkens aus.
Die blaue Passage sorgt dafür, dass der Felshaufen nach dem Absenken komplett aus dem Spiel verschwindet. Ich war mir nicht sicher, ob du das drinhaben möchtest, also habe ich's erstmal dazugeschrieben. Kannst du löschen, wenn du sie nicht haben willst.
 
  • Like
Reaktionen: 1 Person
Und schon geht der Spaß weiter. Ich lese immer wieder in Scriptanleitungen, dass für bestimmte Scripte eine Global verlangt wird. Ich gehe davon aus das dies ebenfalls ein Script ist, weiß aber nicht wie ich es anstellen soll.

Die Global soll einfach nur abfragen, ob sich der Spieler noch in einer Zelle die mit dem Namen Solstheim beginnt befindet.

Diese Global wird dann bei einem anderen Script Verwendung finden das einen Gegenstand im Inventar des Spielers entfernt wenn die Globalbedingung nicht mehr zutrifft.
 
Du brauchst ein globales Script mit einer globalen Variable ("anwinsolst"), die die Anwesenheit in Solstheim festhält:

Code:
Begin bla
 
if ( GetCell == Solstheim )
  set anwinsolst to 1
else
  set anwinsolst to 0
endif
 
end bla

Das wäre der Quelltext, der für ein lokales Script gehen müsste. Damit dieses Script aber als globales Script nicht arg auf die Performance schlägt, müsste noch jemand, der was von globalen Scripten versteht (also ich nicht ;)), es dahingehend modifizieren, dass es nur alle paar Frames ausgeführt wird. Ich würde es so noch nicht verwenden.

@ all
Wer also was von globalen Scripten versteht, möge hier Hand anlegen!
 
das kannst du einfach zu einem Startscript (Im Editor unter Gameplay->Startscripts) machen, da wirst du nicht einen fps einbüßen, aber wenn du in einer Höhle/Haus in Solstheim bist, gibt das den Wert 0 zurück zumal du eigentlich nicht aktualiersieren musst bevor der Player die zelle wechselt.

Da der von anwinsolst sich ja nicht während dialogen ändert, kann du auch noch
Code:
 if (menumode == 1 )
return
endif

am anfang einfügen

Player->GetCell wär glaube ich besser, sonst weil das Script nicht wer wo sein soll
 
Was genau bringen/machen denn StartScripts?

Und noch eine Frage: Welches Script/welchen Befehl brauche ich, wenn ich einen Container täglich respawnen lassen will?
 
Startscripts sind globale Script die gestartet werden, wenn man das PI das sie enthält zum ersten mal läd und die solange laufen bis man sie mit StopScript deaktivert, gibt es aber erst ab Tribunal
 
  • Like
Reaktionen: Darkshade
Hey ich habe ein Script gefunden um die normalen Sounds einer Armbrust durch eigene zu ersetzen ich weiss nur nicht ob es richtig ist.

Code:
Begin ArmbrustScript
        
    If ( Player -> HasItemEquipped "ArmbrutID" )
        If ( GetSoundPlaying "crossBOWPULL" == 1 )
            Player -> stopsound "crossBOWPULL"
            Player -> playsound "ArmbustNachladeSoundID"
        endif
        
        if ( getsoundplaying "crossbowshoot" == 1 )
            player-> stopsound "crossbowshoot"
            Playsound "ArmbrustSchussSoundID"
        endif
    endif
    
end

Wenns falsch ist, wäre es nett wenn mir es jemand korrigieren könnte



thx Skuz
 
Hey ich habe ein Script gefunden um die normalen Sounds einer Armbrust durch eigene zu ersetzen ich weiss nur nicht ob es richtig ist.

Code:
Begin ArmbrustScript
 
    If ( Player -> HasItemEquipped "ArmbrutID" )
        If ( GetSoundPlaying "crossBOWPULL" == 1 )
[COLOR=red]            Player -> stopsound "crossBOWPULL"[/COLOR]
[COLOR=red]            Player -> playsound "ArmbustNachladeSoundID"[/COLOR]
        endif
 
        if ( getsoundplaying "crossbowshoot" == 1 )
[COLOR=blue]            player-> stopsound "crossbowshoot"[/COLOR]
[COLOR=red]            Playsound "ArmbrustSchussSoundID"[/COLOR]
        endif
    endif
 
end

Wenns falsch ist, wäre es nett wenn mir es jemand korrigieren könnte



thx Skuz

Evtl. musst du bei der roten Zeile noch das "player->" vorsetzen oder es bei den drei blauen Zeilen entfernen, musst du ausprobieren. Ansonsten sieht das Script für mich richtig aus.
 
Hallo, habe länger in den Scripten die ich gesammelt habe gesucht und auch im Spiel selbst aber ich finde nirgends richtig das was ich brauche:

Der Spieler findet ein bestimmtes Buch oder einen Zettel, Notiz whatever und dann soll er einen Tagebucheintrag erhalten.

Wo krieg ich das her?
Muß doch im Spiel auch irgendwo sein, oder??
 
Das kommt aufs Buch:
Code:
Begin deinscript
 
short count
 
if (count == 0 )
  if ( OnActivate == 1 )
    Journal, jounalname, indexnummer
    set count to 1
    activate
  endif
endif
 
end

Falls das Script wider Erwarten Probleme bereiten sollte, versuch mal, das hier aufs Buch zu legen:
Code:
Begin deinscript
 
short count
 
if (count == 0 )
  if ( OnActivate == 1 )
    Journal, jounalname, indexnummer
    set count to 1
    activate
  endif
else
  activate
endif
 
end

Journalzeile musst du vorher natürlich noch selbst eintragen.
 
  • Like
Reaktionen: 1 Person
Ich suche ein Script mit dessen Hilfe der Spieler einen Söldner anheuern kann. Der Spieler soll mit einer Kontaktperson (my_vermittler) reden, dann soll ihm der Söldner (my_söldner_1) folgen und in der Minute ungefähr 100 Draken aus der Tasche des Spielers ziehen. Wenn der Spieler kein Geld mehr hat, soll der Söldner sich von ihm verabschieden (automatisch anreden) und irgendwie zur "Vermittlungsstelle" gelangen, damit er für weiteres Geld wieder gebucht werden kann. Bis jetzt nicht sonderlich kompliziert, aber falls der Söldner stirbt, soll der Vermittler erkennen, ob der Spieler ihn getötet hat, und wenn ja, ihm bis zur Zahlung von 5000 Draken keinen weiteren Söldner mehr "vermieten". Ist das letztere möglich und wenn ja, wie würde der Script aussehen?

danke im voraus

EDIT:

das ist der script vom Söldner:



begin AA_Söldner_1
float timer
If ( MenuMode == 1 )
return
endif
if ( Journal "mysöldner1" = 10 )
If (
player->GetItemCount "gold_001" == 0 )
forcegreeting player
else
Set timer to ( timer + getsecondspassed )
if timer == 6
player->removeitem "gold_001" 10
endif
endif
else
return
endif
end

zur erklärung:
wenn man sich den söldner nimmt springt mysöldner1 auf 10
gibt man ihn ab, springt es auf 20
beim nächsten nehmen wieder auf 10 usw.
die rückreise des söldners soll als dialog-resultat bei dem forcegreeting geschehen
leider habe ich keine ahnung, wie das geht, wer kennt sich da aus?

achja, der script ist noch nicht ingame getestet, ich hoffe er enthält keine fehler
 
Zuletzt bearbeitet:
Ich bin derzeit ein wenig aus der Materie, deswegen kein Scriptvorschlag von mir.

Vielleicht aber ein Lösungsansatz..
- Hier im Script würde ich mit OnMurder abfragen, ob der Actor tod ist und der PC dafür verantwortlich war.
- Der Vermittler bekommt den Status per Variable zuteilt, 0/1/2 = kein Söldner aktiv/Söldner aktiv/Söldner vom PC getötet
- Mit dem zahlen des Betrages wird die Variable dann zurück auf 0 gesetzt und Söldner sind wieder vermittelbar.

Dialog: auch hier muß zuerst vor dem forcegreeting eine Variable gesetzt werden, um ein bestimmtes DialogTopic angespringen zu können, das im Result einen Transporterbefehl (wie in Magiergilden) hat. Die Koordinaten für das Ziel kannst du dann dem CS entnehmen. Ohne diese Variable, würdest du den Söldner nicht ansprechen können, ohne das er zurück teleportiert wird. Wichtig ist beim Dialog, das die Zeile mit dem Transportbefehl über den normalen Gesprächsoptionen ist, damit sie vom forcegreeting auch als erstes genutzt wird)
 
  • Like
Reaktionen: lim dul
1, thx für die gute idee

2, ich dachte bei forcegreeting wird automatisch das greeting 1 aufgerufen, das da lauten würde:

Bedingungen:
item "gold_001" = 0
Jorunal mysöldner1 10
oder eben von der variable 1 (was dann bedeuten würde ich bräuchte eine globale variable, oder?)

Text:
Ihr könnt mich nicht mehr bezahlen, ich muss gehen. (Oder irgendwie so)

Result:
coc "Söldnerfestung" 1234, 1234, 1234
oder so ähnlich...

dadurch will ich verhindern, dass der dialog auch kommt wenn man in der festung normal mit ihm spricht

EDIT: Das hau ich jetzt auf den Vermittler:
Code:
begin Söldner_vermittler
short Status
if "my_söldner_1" OnMurder
set status to 2
else
return
endif
end
 
Zuletzt bearbeitet:
Beim Dialogsystem wird immer das erste Greeting genutzt, dessen Bedingungen alle zutreffen. Je schwieriger diese Bedingungen zu erfüllen sind, desto höher sollten sie in der Reihenfolge postiert werden.

*snip*
If ( player->GetItemCount "gold_001" == 0 )
set pcpleite to 1 ; <-- beispiel
forcegreeting player
else
*/snip*

Wenn das oberste der Greetings deine Söldners die Bedingung "pcpleite = 1" enthält, wird es nur aktiv wenn du den Söldner nach Hause schicken möchtest. Das mit dem Journal kann dann eine alternative Bedingung sein, die das Greeting für deine Söldner reserviert und das mit dem Gold_001 wäre renundant.

Im Resultfeld sollte dann stehen:
Goodbye
coc "Söldnerfestung" ; <- oder alternativ:
PositionCell 123, 123, 123, 1 "Söldnerfestung"


On Murder fragt wie OnDeath den Zustand des Actors ab.
Die Syntax und Hinweise auf Beispielscripts findest du z.b. hier:
http://www.uesp.net/morrow/editor/mw_cscommands.shtml#onmurder
Ich habe es damals nie benutzt, weiß nicht genau, ob sie genau deinen gewünschten Zweck erfüllt.

*snip* ; von deinem Söldnerscript.
If ( MenuMode == 1 )
return
endif
If ( OnDeath == 1 ) ; Söldner tot?
set Soeldnerstate to 0 ; Globale Var ändern
If ( OnMurder == 1 ) ; ?! Söldner vom PC getötet?
set Soeldnerstate to 2 ; Globale Var ändern
EndIf
EndIf
if ( Journal "mysöldner1" = 10 )
...
*/snip*

Für den Vermittler hiesse es dann:
If ( Soeldnerstate == 2 )
...sperre Handel und verlange Schadensersatz"
...bezahlt PC den Betrag, setzt du Soeldnerstate wieder zurück auf 1
Endif
If ( Soeldnerstate == 0 ) ;falls du immer nur einen Söldner abgeben möchtest
.... "msg: du hast bereits einen Söldner"
EndIf
...
 
Ich wollte das alles in einem Script mit der globalen variable "status" regeln. ist sie auf 0 kein söldner, man kann sich einen ausborgen, auf 1 kann man ihn zurückgeben, wenn die var auf 2 ist, hat der spieler ihn umgebracht und man muss zahlen und auf 3 betrauert der vermittler den söldner einfach nur. dazu dieser script
begin AA_Söldner_1
float timer
If ( MenuMode == 1 )
return
endif
if ( "my_söldner_1"->Ondeath == 1 )
if ( "my_söldner_1" Onmurder == 1 )
set status to 2
else
set status to 3
endif
endif
if ( status = 1 )
If ( player->GetItemCount "gold_001" == 0 )
forcegreeting player
else
Set timer to ( timer + getsecondspassed )
if ( timer > 6 )
player->removeitem "gold_001" 10
set timer to 0
else
return
endif
endif
else
return
endif
 
end AA_Söldner_1

EDIT: Script geädndert
EDIT: Es funzt nicht, es zieht mir nun endlich mal das
Geld aus der Tasche, aber das mit dem Ondead und Onmurder funktioniert nicht
 
Zuletzt bearbeitet:
Versuch statt OnDeath == 1 mal GetHealth <= 0.
Übrigens: Scripte werden weitaus lesbarer (und weniger abschreckend), wenn man sie entsprechend der Zugehörigkeit einrückt, insbesondere bei sehr vielen Unterverzweigungen.;)
 
  • Like
Reaktionen: lim dul
ja, ich arbeite immer mit Tabulatoren, aber beim Kopieren und Einfügen sind die dann immer weg...

thx, ich versuche es mal