PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Skript Problem



|Thorn|
16.05.2006, 18:10
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:

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. :)

MfG,
Thorn

The Flo
16.05.2006, 18:21
scn ZDtotenbeschwoerung

ref target

begin ScriptEffectStart

if player.GetItemCount ZDBlackSoulGemFilled >= 1

player.removeitem ZDBlackSoulGemFilled 1
set target to GetSelf
target.resurrect

else

message "Du brauchst einen gefüllten schwarzen Seelenstein"
endif

end wieso einfach, wenn es doch auch kompliziert geht;)

sollte ich den script jetzt verschlechtbessert haben, dann sry. bin halt ein etwas schlampiger scripter

edit: ich glaub, das ganze geht auch ohne das id-speichern und dann target.resurrect
scn ZDtotenbeschwoerung


begin ScriptEffectStart

if player.GetItemCount ZDBlackSoulGemFilled >= 1

player.removeitem ZDBlackSoulGemFilled 1
resurrect

else

message "Du brauchst einen gefüllten schwarzen Seelenstein"
endif

end

|Thorn|
16.05.2006, 18:25
RemoveItem :D ich wusste doch das an Disable was nicht optimal ist. Naja ich probiers mal aus und meld dann mal das Ergebnis.

EDIT
Ergebnis: Unbefriedigend
Da funktioniert auch nichts...

Lagerhaus_Jonny
16.05.2006, 18:32
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..... ^^

|Thorn|
16.05.2006, 18:42
Ja ich denk halt manchmal zu kompliziert. :D
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)

The Flo
16.05.2006, 18:44
Was unnötig ist, sind die Klammern die du in die If-Sentence gesetzt hastund 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:rolleyes:

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 ^^)

Sumbriva
16.05.2006, 18:47
gibt es eigentlich schon im original oblivion einen spell mit dem man tote zum lebenerwecken kann? ohne seelensteine?

Lagerhaus_Jonny
16.05.2006, 18:50
"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.

|Thorn|
16.05.2006, 18:55
:D
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. :D

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. :)

Gorkon
16.05.2006, 19:29
Welches Skript ist jetzt aktuell? Das hier? (Hinweis:
[/B]] Tag ist was feines. ;))

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
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:


scn ZDtotenbeschwoerung

begin ScriptEffectStart

if ( getDead == 0 )
messagebox "Lebende Wesen kann man nicht wiederbeleben"
elseif ( player.getItemCount ZDBlackSoulGemFilled == 0 )
messagebox "Du brauchst einen gefüllten schwarzen Seelenstein"
else
player.removeitem ZDBlackSoulGemFilled 1
resurrect 1
endif
end
resurrect 1 is ein bissi schöner, da steht der NPC auf und beamt sich nicht einfach in die aufrechte Position.

|Thorn|
16.05.2006, 19:35
Äh ok, kommst ein bisschen zu spät, aber egal. :D
Wie im Edit zu lesen geht jetz alles.
Die reanimation Variable wurde überflüssig.
Wen interessiert, das finale Skript sieht so aus (mit
Tag ;) ) :
[code]scn ZDtotenbeschwoerung

ref target

begin ScriptEffectStart

set target to GetSelf
if { player.GetItemCount ZDBlackSoulGemFilled >= 1 && target.getdead == 1 }
player.removeitem ZDBlackSoulGemFilled, 1
resurrect 1

elseif { target.getdead == 0 }
messagebox "Lebende NPCs kann man nicht wiederbeleben"
elseif { player.GetItemCount ZDBlackSoulGemFilled == 0 }
messagebox "Du brauchst einen gefüllten schwarzen Seelenstein"

endif
end

Gorkon
16.05.2006, 19:42
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. :p Sollte auch für getDead so funzen. Hau wech den Scheiß. ;)

|Thorn|
16.05.2006, 19:47
Dann benutz ich es halt für resurrect! :D
Ich mag mein target und steh dazu!
Das lässt das ganze komplizierter wirken. ;)