Construction Set [Frage] Skript Suche

Metalpunk13

Abenteurer
hey,
hab mal ne frage (hab zwar killfetzers scripting toturial, aber habs immer noch net begriffen) also: geht es das man wenn man einen umhang nimmt, und den anzieht ein helm ins inventar eingefügt wird und der auch wieder aus gefügt wird wenn man den umhang weglegt? hab bis jetzt:

begin "NAME"

OnActivate
Player->AddItem "ID" 1

if player->drop "ID2"
player->drop "ID"
edif

end "NAME"

aber funtzt net :?
 
nein-nein-nein, so geht das nicht...

pass auf, es gibt drei Arten von Scripts.
Die einen, die "lokalen" hängen an irgendwelchen Dingen oder NPCs. So wie Deins wohl werden soll.
Es gibt noch zwei weitere Sorten, "globale" und "lokal gestartete globale". Die soll'n uns aber jetzt nicht weiter interessieren.

Dein "lokales" Script wird dadurch "in Schwung gebracht" das das Objekt an dem es hängt - hier also ein Umhang oder ein Helm- zusammen mit dem Player- also dem Spieler-NPC- in einer Zelle ist oder wenn es sich im Inventar eines in der gleichen Zelle befindlichen Objektes - sei es Container, Kreatur oder NPC- befindet.

Solange der Scriptträger also da ist wird in jedem Frame (Bildaufbau) das Script daran einmal aufgerufen und von oben nach unten durchgearbeitet. Also etwa 20 - 50 mal die Sekunde, je nach Rechnerleistung und -belastung.

Das bedeuted also das da nicht irgendwelche unverständlichen Befehle stehen dürfen, sondern Du musst genau wissen was Du da hin schreibst.
Laut Editor-Hilfe gibts da folgendes Format

begin Name_des_Scriptes

; Semikolon davor heisst für den Rechner
; den Text in der gleichen Zeile dahinter zu ignorieren
; Name_des_Scriptes muss natürlich durch einen sinnvollen Namen
; ersetzt werden

; zunächst also Variablen-Deklarationen

;short sVariable ;Werte von -32767 bis 32767
;float fVariable ; für "Kommazahlen"
;long lVariable ; für ganz laaange Zahlen, bis zu -zig Fantastilliarden

; in solchen Variablen kann sich das Script Werte "merken"
; oder Ereignisse daran ablesen

; nur für die Beispiele und damit es nicht abstürzt: ;)
short Bedingung1a
short Bedingung1b
short Bedingung2
short BedingungW


; dann noch Systemvariablen, die kannst Du nicht nehmen wie Du willst
; und manche haben "Eigenarten"

short OnPCAdd
;wird auf 1 gesetzt wenn der Spieler den Scriptträger in sein Inventar bekommt
short OnPCEquip
; wird auf 1 gesetzt wenn der Spieler den Scriptträger "anzieht", bzw. sich den daran hängenden Zauber zurechtlegt (z.B. Schriftrolle)
short OnPCDrop
;wird auf 1 gesetzt wenn der Spieler das Objekt in der Welt ablegt

; nur die hier oberhalb beschriebenen System-Variablen werden nicht
; automatisch oder zuverlässig automatisch zurückgesetzt, daran solltest
; Du denken

; auch noch nützlich:
;short companion (mind. Tribunal): auf 0 macht der Scriptträger sein
;Inventar nicht auf, bei 1 könnte der Spieler den "Teilen"-Dialog sehen
; short WaitOutSide
; wenn die auf 1 steht wird der Scriptträger dem Spieler nicht in
; Innenräume folgen
; short PCSkipEquip
; wenn die auf 1 steht wird das Anziehen oder das Zurechtlegen des
; Zaubers (Schriftrolle) verhindert. Muss aber in jedem Script-Durchlauf
; neu gesetzt werden



if ( Bedingung1a )
; wenn die Bedingung 1a zutrifft wird ausgeführt was hier steht
elseif (Bedingung1b)
; wenn Bedingung 1a nicht zutrifft und bedingung 1b zutrifft
; wird ausgeführt was hier steht

if (Bedingung2)
; eingeschachtelte Bedingung2, die aber nur abgearbeitet wird
; wenn Bedingung 1b zutrifft
endif ;2
; ein endif "schliesst das if, Bdingung2 ist hier also
;komplett abgearbeitet oder wurde übersprungen falls sie nicht zuraf
else ;1c
; wenn Bedingung1a und Bedingung1b noch nicht "gegriffen haben"
; und käme dieser Scriptabschnitt dran. Es kann 1 if und 127 Elseifs oder 126 Elseifs und 1 Else in einer if-Abfrage geben die am Ende
;aber wieder nur ein

endif ;1

;hat, das erleichtert Dir evtl. wie man das mit den If's macht
; die (Bedingung) zwischen den Klammern muss immer wahr,
; 1 bzw. True sein damit sie ausgeführt wird,
; d.h. Du kannst da auch was "negatives" hinschreiben oder
; vergleichen. Dazu kannst Du zwischen die zu vergeleichenden Werte
; entweder == ist gleich, <= ist kleiner oder gleich,
; >= ist grösser oder gleich,< ist kleiner, > ist grösser, != ist ungleich
; einsetzen.

; so setze ich jetzt mal eine oben deklarierte Variable auf den Wert 1

set BedingungW to 1

; ausserdem gibt es noch

while (BedingungW)
; was hier steht wird ausgeführt SOLANGE die Bedingung
; zutrifft. Der Interpreter wird diesen Text solange ausführen bis
set BedingungW to 0
; die BedingungW nicht mehr zutrifft
;also in diesem Fall nur einmal, aber es ginge auch endlos
; und würde Morrowind zum Einfrieren bringen

endwhile
;schliesst das while, auch die könnte man verschachteln aber das würde
;sich potenzieren und wäre nicht nur sehr langsam sondern auch
; schlechter programmierstil

end Name_des_Scriptes
 
  • Like
Reaktionen: Metalpunk13
BOAH.. is das viel... da war ich wohl mit meinem script dottal im schwarzen... naja ich versuche mal das um zu setzen... mal sehn...

begin Cliffhunter

;this one will drop the second clothing if the first clothing still droped

short sVariable (hab ich aber nich verstanden)

...

ach das is doof... verstehe das nich^^ kann mir nich jemand ein skript schreibn? weil ich krieg das nich hin... :cry: aber deine Erklärung hat mir sehr geholfen :) , obwohl ich das nich mit den variablen verstanden habe, wozu die da sind...:? brauche trotzdem das skript :cry: kann mir das mal jem schreibn? :-D wäre zuuuuu nett
mfg Metalpunk13
 
Eigentlich ist es gar nicht so schwer:

begin my_umhang_script

short OnPCEquip
short OnPCDrop

if ( OnPCEquip == 1 )
Player->AddItem "my_helm" 1
set OnPCEquip to 0
endif

if ( OnPCDrop == 1 )
if ( Player->GetItemCount "my_helm" >= 1 )
Player->RemoveItem "my_helm" 1
endif
set OnPCDrop to 0
endif

end


Dieses Script fügt nun beim Anziehen des Umhangs einen Helm dem Inventar hinzu. Diesen muss man aber per Hand anziehen. Wenn du den Umhang aus deinem Inventar dropst, wird der Helm entfernt (komplett, nicht gedropt). Weil sonst hättest du eine wunderbare Helmproduktionsstätte geschaffen.

Wenn du willst, dass der Helm automatisch an und aus gezogen wird, musst du das über mehere Scripte machen (eines auf dem Helm und eines auf dem Umhang). Das ist dann aber schon weitaus komplizierter.
 
  • Like
Reaktionen: Metalpunk13
so und nu noch ne frage: hab ein skript gebastelt für mein mod, also:

Begin cliffhunter

;makes the cliffracer disappear if Cliffhunter_uniq died

short doOnce
;global short DestroyBlight

if ( "Cliffhunter_uniq"->OnDeath >= 1 )
SetHealth 0
Set doOnce to 1
endif

end


ganz einfaches skript, hab das auf alle klippenläufer gelegt und die sollen wenn ich den großen (Cliffhunter_uniq) besiegt habe alle tod sein, leider funtzt das wieder nich, aber es gab auch keine komplikationen und es wurde nicht gesagt das irgendetwas falsch is... HELP
 
Zuletzt bearbeitet:
ich würd eher ein script auf den Cliffracer unique legen, der alle tötet.
Sonst könnte es sehr inkompitabel mit anderen Mods sein.

EDIT: vll. so:
begin Cliffhunter

if ( "Cliffhunter_uniq"->OnDeath >= 1 )
"cliffracerID".sethealth 0
endif

end Cliffhunter


k.A. obs geht. o_O Aber wenn du das auf den boss legst, wäre es theoretischerweise so dass alle sterben.
 
Zuletzt bearbeitet:
Um euch gleich mal zu enttäuschen:
Keines von beiden wird funktionieren!

Metalpunk: Deines hat einfach zwei Fehler drin (dzu komm ich gleich)
Nici: Deines tötet die Klippenläufer (höchstens, ich bezweifle das es funktioniert) einmal. Alle die danach neu gespawnt werden nerven noch immer.

Ich würde dieses Script vorschlagen:

begin my_cliffracer_script

short doOnce

if ( doOnce == 0 )
if ( GetDeadCount "Cliffhunter_uniq" >= 1 )
sethealth 0
set doOnce to 1
endif
endif

end


Aber wie Nici schon gesagt hat, verträgt sich dieses Script vermutlich nicht mit einer ganzen Reihe von anderen Mods. (Da dürfte so ziemlich jeder Tiermod darunter sein).
 
wenn man einen Talisman der Klippenläufertötung macht, der einmal alle auslöscht und sie dann respwanen, aber das braucht ja seine Zeit... Wär ausgeglichen.
 
der Cliffracer_uniqu aus deinem Script da oben muss aber
1. in der Welt vorkommen, also im Editor aufgestellt sein (nicht mit Place-Befehlen inGame eingesetzt)
2. entwerder Essential oder Persistent markiert sein, wobei bei essential allerdings die Meldung vom durchtrennten Faden kommt
3.der cillfracer_uniqu muss auch EINMALIG sein, wenn Du mehrere davon einsetzt wird
if ( Cliffracer_unique-> OnDeath )
; das hier nur ausgeführt wenn der zuerst im Editor platzierte
; Cliffracer_unique stirbt
endif

eine andere Möglichkeit wo keine der obigen Bedinungen notwendig ist:

if ( cliffracer_unique-> GetDeadCount >= 1 )
; muss wohl irgendwann im Laufe des Spieles mal
; so ein Klippenläufer gestorben sein
endif

;)
 
eine andere Möglichkeit wo keine der obigen Bedinungen notwendig ist:

if ( cliffracer_unique-> GetDeadCount >= 1 )
; muss wohl irgendwann im Laufe des Spieles mal
; so ein Klippenläufer gestorben sein
endif

Ach Rene, lies doch mal meinen Post zwei obendrüber durch. Da schreib ich genau das gleiche.
Zumindest fast. DieStruktur deines GetDeadCount-Befehls funktioniert so nicht ;)

Kann ja jedem mal passieren :D