Hallo erstmal!
Also ich versuch grad nen Zauber zu skripten.
Ich spiel mal mit offenen Karten: Er soll einen toten NPC wiederbeleben, aber nur wenn der Spieler einen speziellen, gefüllten, schwarzen Seelenstein im Inventar hat.
Falls nicht, soll eine Message den Spieler über den fehlenden Seelenstein informieren und beenden. Falls es klappt, wird 1 Seelenstein aus dem Inventar des Spielers entfernt.
Alles schön ung gut, nur momentan funktioniert NICHTS.
Das Skript sieht bislang so aus:
Zitat
scn ZDtotenbeschwoerung
float reanimation
ref target
begin ScriptEffectStart
set reanimation to 0
if { player.GetItemCount ZDBlackSoulGemFilled >= 1 }
set reanimation to 1
player.disable ZDBlackSoulGemFilled 1
endif
end
begin ScriptEffectStart
set target to GetSelf
if { reanimation == 1 }
target.resurrect
else
message "Du brauchst einen gefüllten schwarzen Seelenstein"
endif
end
...
Ich hab mir zwei der entsprechenden Seelensteine ins Inventar getan, nen NPC gekillt, Zauber gecastet, aber es hat rein garkeine Auswirkungen.
Wäre dankbar für jede Hilfe.
Hm, also ich weiß gerade nicht, wie das auswählen des Ziels funktioniert und ob es mit "ref target" getan ist.
Mit "scripteffectstart" kann ich auch nicht viel anfangen, ich hätte es jetzt erstmal
begin onhit targetID versucht, aber wenn es so gemacht wird, dann müsste das so schonmal stimmen.
Was unnötig ist, sind die Klammern die du in die If-Sentence gesetzt hast.. man braucht keine Klammern [habe ich auch noch in keinem Script gesehen oO].
Ich glaube auch eine ganz normale "Short" Variable dürfe völlig ausreichen.
Außerdem musst du diese Variabele garnicht auf 0 setzen, das müsste sie von sich aus schon sein, weil sie ja leer, also 0 ist.
Was nicht funktioniert ist "player.disable". Da musst du den removeitem objectID, count befehl benutzen
Warum du dann den If-Block beendest blicke ich im moment auch noch nicht so ganz.
Der zweite ergibt jedenfalls nicht viel Sinn.
Warum denn "set target to getself" ? Damit wärst DU Ziel des Spruches.
Hm, lass mich überlegen. Ich würde es mal so probieren:
scn ZDtotenbeschwoerung
float reanimation
ref target
begin ScriptEffectStart
if player.GetItemCount ZDBlackSoulGemFilled >= 1 && reanimation == 0 && target.getdead == 1
set reanimation to 1
player.removeitem ZDBlackSoulGemFilled, 1
target.resurrect
if target.getdead == 0
messagebox "Lebende NPCs kann man nicht wiederbeleben"
endif
else
messagebox "Du brauchst einen gefüllten schwarzen Seelenstein"
endif
end
Wie gesagt, ich weiß nicht wie das mit dem einholen des Ziels geht, aber wenn das schon durch das sprechen des Spruches funktioniert [vorrausgesetzt man trifft auch], dann sollte es klappen. Sollte..... ^^
Ja ich denk halt manchmal zu kompliziert.
Die Klammern beim if sollen nur der Übersichtlichkeit dienen
@Lagerhaus_Jonny
Also mit deinem Skript ´funktioniert immerhin schonmal EINE Message. Aber die auch immer. Und zwar "Du brauchst einen gefüllten schwarzen Seelenstein". Egal ob tot oder lebendig, die bloppt immer auf.
Wobei ich nicht ganz verstehe woher das Spiel wissen soll was target ist. Ist ja momentan bei deinem Skript einfach nur ne Variable...Get Self sollte eigentlich funktionieren, habe ich auch schon bei der Modifikation meines Melonenzaubers verwendet. (da regnen Melonen aufs Ziel herab)
Was unnötig ist, sind die Klammern die du in die If-Sentence gesetzt hast
...
und genau so wenig braucht es absätze, tabulatorsprünge und dieses ganze zeug, das den script einfach ein wenig übersichtlicher machen.
schau dir mal nen mw-script an. da hat jede if-abfrage eine solche formatierung
Zitat
Warum denn "set target to getself" ? Damit wärst DU Ziel des Spruches
...
nö. es wäre doch sinnlos eine solche funktion ins spiel einzubauen, wenn als ref-var dann immer player rauskommen würde.
also eigentlich ist ein zauberscript ja wie ein localer script, der sich sozusagen an den npc bzw. an den actor dranhängt, der vom zauber betroffen ist.
wenn dann etwas steht wie resurrect (NICHT id.resurrect) müsste es eigentlich den betroffenen actor direkt betreffen, ohne dass man ein ziel deklarieren müsste; schließlich fungiert der zauberscript hier ja als eine art localer script (ich wiederhol mich ^^)
"und genau so wenig braucht es absätze, tabulatorsprünge und dieses ganze zeug, das den script einfach ein wenig übersichtlicher machen.
schau dir mal nen mw-script an. da hat jede if-abfrage eine solche formatierung"
kA, ich habe für Morrowind Scriptmäßig noch nix gemacht.
"also eigentlich ist ein zauberscript ja wie ein localer script, der sich sozusagen an den npc bzw. an den actor dranhängt, der vom zauber betroffen ist.
wenn dann etwas steht wie resurrect (NICHT id.resurrect) müsste es eigentlich den betroffenen actor direkt betreffen, ohne dass man ein ziel deklarieren müsste; schließlich fungiert der zauberscript hier ja als eine art localer script"
Ah ja, verstehe.
@Thorn
Der Grund warum du die Nachricht immer bekommst, ist wohl die "else" Sache.
versuche doch einfach mal hinter das else die Gegebenheiten zu hängen, die zutreffen müssen, damit man die Nachricht bekommt. Also z.B. player.GetItemCount ZDBlackSoulGemFilled == 0.
Ich weiß nicht, ob es den Befehl "elseif" gibt, ich denke schon.. den würde ich dann anstatt dem "else" nehmen.
Das hab ich mir auch schon gedacht.
Und das Resultat ist sehr interessant.
Wenn ich jetzt den Spell auf einen Toten mit den Steinen im Inventar wirke, stürzt das Spiel ab und ich höre gerade noch so das Geräusch, das erklingt wenn ein Item ausm Inventar entfernt wird.
EDIT
Ok, alles funktioniert.
Es lag am Ende am resurrect.
Mit dem normalen resurrect Befehl wird der NPC lediglich resetet, ohne Animation.
Das hat das Spiel wohl zum abstürzen gebracht.
Steht ein 1 dahinter, steht der NPC mit ner Animation wieder auf.
Jetzt funktioniert alles bestens.
Vielen Dank an alle die geholfen haben.
Welches Skript ist jetzt aktuell? Das hier? (Hinweis: [code][/code] Tag ist was feines. )
Und ich kann dir sagen, warum es knallt...target wird nie gesetzt, also versucht du etwas zu ressurecten, das gar nicht existiert. Boom.
An sich sollte man kein target brauchen, da das Skript direkt auf dem getroffen NPC/Monster ausgeführt wird. Sollte theoretisch so klappen:
resurrect 1 is ein bissi schöner, da steht der NPC auf und beamt sich nicht einfach in die aufrechte Position.
Äh ok, kommst ein bisschen zu spät, aber egal.
Wie im Edit zu lesen geht jetz alles.
Die reanimation Variable wurde überflüssig.
Wen interessiert, das finale Skript sieht so aus (mit [code] Tag ) :
Naja. Wie auch immer. Der target Kram ist imho trotzdem überflüssig. Du setzt target zwar per getSelf, benutzt es aber für resurrect gar nicht. Sollte auch für getDead so funzen. Hau wech den Scheiß.