Construction Set Mein Script läuft nur in der Zelle, in der es gestartet wurde.

haholin

Abenteurer
Hi,
ich habe ein Script geschrieben, durch das nach berühren eines bestimmten Gegenstandes der Persönlichkeitswert für eine bestimmte Zeit angehoben wird. Dies habe ich durch "Player.addspell" gelöst. Die Zeit für die Dauer des Spell läuft auch brav herunter bis auf null, nur dann verschwindet der Spelleffekt nicht. Daraufhin habe ich durch einen Timer gesteuert ein "Player.RemoveSpell" eingefügt. Der Timer läuft aber nur solange ich mich in derselben Zelle befinde. Wenn der Timer abgelaufen ist, verschwindet der Spelleffekt.
Das ist jedoch nicht das was ich will. Der Spelleffekt soll auch nach Ablauf der Zeit verschwinden, wenn ich mich nicht in der Startzelle aufhalte.
Vielleicht weiß ja irgendjemand, wie das geht.
Gruß
haholin.
 
Kannst Du dein Skript mal posten? Anhand deines Textes kann ich eigentlich nur auf einen Skriptfehler schließen.
 
Kannst Du dein Skript mal posten? Anhand deines Textes kann ich eigentlich nur auf einen Skriptfehler schließen.
Hi,
folgend der Code des Scripts :

scn HHLNMWaschschüssel

short button
short doonce
short init
float timer



Begin OnActivate

if isActionRef player == 1
set doonce to 0
set init to 0
Messagebox "Willst Du Dich waschen?" ,"Ja", "Nein"
endif

end

begin GameMode

set button to getbuttonpressed
if button == 0 && doonce == 0
set doonce to 1
Player.AddSpell AbHHLNMWaschschuessel1
Messagebox "Du bist jetzt sauber. Dein Charisma ist kurzfristig erhöht."
endif
if init == 0 && doonce == 1
set timer to 100
set init to 1
else
if timer > 0
set timer to (timer - GetSecondsPassed)
set doonce to 1
endif
if timer <= 0 && doonce == 1
Player.RemoveSpell AbHHLNMWaschschuessel1
set doonce to 2
MessageBox "Deine Charisma ist wieder normal."
endif
endif

end


Wie gesagt, das Script funktioniert, aber leider nur in der einen Zelle.
Gruß
haholin.
 
Ein Script, das auf einem Item liegt, läuft natürlich nur, wenn der Spieler auch in der betreffenden Zelle ist (bei Interiors) oder die Zelle mit dem Item geladen ist (bei Exteriors).
 
Kurze Anmerkung: Scripte auf QuestItems laufen immer, egal wo sich das Objekt befindet. Das sollte aber aus Performance-Gründen vermieden werden und eher auf QuestScripts zurückgegriffen werden.

Die können nämlich via StopQuest beendet werden (erneut starten durch StartQuest), so dass sie, wenn geschickt gescriptet, nur dann laufen wenn sie auch benötigt werden.
Außerdem laufen sie auch nicht jeden Frame, sondern immer in einem gewissen Zeitabstand, der sich über die Variable fQuestDelayTime einstellen lässt (ohne Einstellung alle 5 Sekunden).




OnActivate-Blöcke und ähnliches laufen allerdings auch wenn das Objekt kein QuestItem ist und sich in einer anderen Zelle befindet.
 
hi haholin

warum so kompliziert?
Zauber sind doch so geschaffen, dass sie für eine bestimmte Zeit wirken und dann sowieso auslaufen.
Ich an deiner Stelle würde den gewünschten Effekt als Zauberspruch erschaffen und den Script dann so anlegen, dass - in deinem Beispiel - bei Aktivierung der Waschschüssel, bzw. bei Bestätigung zum Waschen, dieser Zauber auf den Spieler gewirkt wird (der Timer entfällt somit)... Dasselbe Prinzip wie bei Aktivierung eines Altars oder eines Wegschreins, da erhält der Spieler ja den Effekt, aber nicht den Zauberspruch selbst und nach einiger Zeit verschwindet der Effekt wieder.
(der Scriptbefehl dafür lautet, glaube ich: "cast deinZauberspruch player" Bin mir aber nicht sicher, vielleicht kennt sich damit jemand anderes besser aus. :?)

Aber vielleicht hilft dir diese Anregung bereits weiter...

mfG
Schattenkatze
 
hi haholin

warum so kompliziert?
Zauber sind doch so geschaffen, dass sie für eine bestimmte Zeit wirken und dann sowieso auslaufen.
Ich an deiner Stelle würde den gewünschten Effekt als Zauberspruch erschaffen und den Script dann so anlegen, dass - in deinem Beispiel - bei Aktivierung der Waschschüssel, bzw. bei Bestätigung zum Waschen, dieser Zauber auf den Spieler gewirkt wird (der Timer entfällt somit)... Dasselbe Prinzip wie bei Aktivierung eines Altars oder eines Wegschreins, da erhält der Spieler ja den Effekt, aber nicht den Zauberspruch selbst und nach einiger Zeit verschwindet der Effekt wieder.
(der Scriptbefehl dafür lautet, glaube ich: "cast deinZauberspruch player" Bin mir aber nicht sicher, vielleicht kennt sich damit jemand anderes besser aus. :?)

Aber vielleicht hilft dir diese Anregung bereits weiter...

mfG
Schattenkatze
Hi Schattenkatze,

als Denkansatz war Deine Idee gut.
Ich habe es ausprobiert, aber mit cast funktioniert das leider bei Eigenschaften nicht, sprich, der gewünschte Effekt passiert nicht.
Gruß
haholin.
 
Hiho,

ist das nicht

Code:
player.addspell
wenn mein so etwas hinzufügen will? :huh:

GreeZ,
Suchan
 
Hiho,

ist das nicht

Code:
player.addspell
wenn mein so etwas hinzufügen will? :huh:

GreeZ,
Suchan


hi Suchan

Ja, schon, wenn man einen Zauberspruch hinzufügen will. Aber haholin will nur einen Effekt, der auf den Spieler einwirkt und der nach einiger Zeit wieder verschwindet. Und meiner Meinung nach müsste das möglich sein, OHNE einen Zauberspruch hinzuzufügen und nachher wieder per Script zu entfernen.

mfG
Schattenkatze
 
Sorry für Doppelpost, wollte aber nicht, dass das hier untergeht.

Und hier meine etwas unkonventionelle Lösung, die aber funktionieren sollte. :)

Du brauchst dazu: Einen Script und eine Flasche (Potion)

In meinem Beispiel habe ich das vorhandene Bier als WaschGlanz neu erstellt und den gewünschten Effekt kreiert (Persönlichkeitserhöhung 5 Punkte für 100 sec).
Dann den Script geschrieben und den auf die Waschschüssel (oder wo auch immer du den haben willst) gelegt... und fertig.

hier der Script:

Scriptname WaschScript

short button
short doOnce

begin OnActivate
if doOnce == 0
MessageBox "Möchtest du dich waschen?", "Ja", "Nein"
set doOnce to 1
endif
end

begin GameMode
if doOnce == 1
set button to GetButtonPressed
if button == 0
player.additem WaschGlanz 1
player.EquipItem WaschGlanz
Messagebox "Du bist jetzt sauber. Dein Charisma ist für kurze Zeit erhöht."
set doOnce to 0
elseIf button == 1
set doOnce to 0
return
endif
endif
end


Ich weiss zwar nicht, ob dir das so gefällt, aber zumindest wird der gewünschte Effekt erzielt... ;)

mfG
Schattenkatze
 
  • Like
Reaktionen: haholin