Skript-Problem: Einfrieren

Moderator: Moderatoren

3 Beiträge Seite 1 von 1
Tealor Arantheal
Hoher
Hoher
Beiträge: 1319
Registriert: 04.01.2013 16:45
Hat sich bedankt: 122 Mal
Danksagung erhalten: 150 Mal


Wie bei den Nehrim Bugs bereits erwähnt, ist die Wahrscheinlichkeit, einen Gegner durch einen erneuten Eisangriff mit Einfrierungseffekt wieder aufzutauen sehr hoch.

Hier eines der Einfrierungsskripts:
[+]
scn SpellEinfrieren18Prozent

Short Wahrscheinlichkeit
Ref Target

begin ScriptEffectStart

;Initialisierung

Set Target to GetSelf


;Kontrolle

if (Target.isActor == 0) || (Target.getDead == 1) || (Target.isRidingHorse == 1)
Return
endif


;Start
Set Wahrscheinlichkeit to 1 + GetRandomPercent

If ( Wahrscheinlichkeit <= 18 )
; Target.Setghost 1
SetRestrained 1
Target.PlayMagicShaderVisuals effectGefrohren
endif

end

begin ScriptEffectFinish

SetRestrained 0
;Target.Setghost 0
Target.StopMagicShaderVisuals effectGefrohren

end
Das Problem ist, dass "ScriptEffectFinish" immer ausgeführt wird, wenn der Zauber erneut auf ein Ziel gesprochen wird.
Wenn man diesen Block allerdings abändert, besteht die Gefahr, dass das Ziel ewig eingefroren bleibt.

Mein Gedanke war eine Timer-Variable einzubauen.
Mein Kollege meinte zuerst es würde reichen, wenn man im StartBlock bei der Abfrage einfach "|| GetRestrained" einfügt, allerdings funktioniert das wie zu erwarten nicht.
Denn schließlich wird der Restrained-Zustand mit ScriptEffectFinish wieder aufgehoben und dieser Block wird bei jedem neuen Treffer durch diesen Zauber ausgeführt, sofern der Einfierungseffekt noch Wirkung zeigt.
Außerdem wird durch das Return-Statement der Finish-Block nicht ausgeführt was wiederum im ewig gefrorenen Zustand endet.

Das mit der Timer-Variable ist allerdings auch recht knifflig umzusetzen. Die bisherigen Versuche führten auch zu einem unendlich eingefrorenen Zustand des Gegners.
Der Timer wurde im neuen Block "ScriptEffectUpdate" berechnet, allerdings war diese Lösung eben keine Lösung :roll:

Wer Vorschläge hat, nur raus damit :D

Ansonsten wird dieses Skipt wohl so bleiben wie es ist.
Tealor Arantheal
Hoher
Hoher
Beiträge: 1319
Registriert: 04.01.2013 16:45
Hat sich bedankt: 122 Mal
Danksagung erhalten: 150 Mal


Lösung gibt es noch keine, aber in der neuen ESP, die ich erhalten habe, wird eine Message ausgeworfen wenn man etwas erfolgreich einfriert.
Code: Alles auswählen
MessageEX "%n wurde eingefroren." Target
Sinnvoll, da man dann weiß, dass ein weiterer Eiszauber mit Einfrierungschance den Effekt wieder aufheben würde.
War allerdings nicht meine Idee...
Tealor Arantheal
Hoher
Hoher
Beiträge: 1319
Registriert: 04.01.2013 16:45
Hat sich bedankt: 122 Mal
Danksagung erhalten: 150 Mal


Inzwischen wurde das Problem gelöst.

Das Auslösen des "Restrained"-Effekts direkt im Skript des Zaubers und auch das Erlöschen dieses Effekt am Ende des Skripts waren für das Auftauen verantwortlich.

Stattdessen wird je nach angewendeten Eiszauber eine Krankheit mit Skript auf den Getroffenen angewandt.

Es gibt Krankheiten für drei, vier, fünf, sechs, und acht Sekunden langes Einfrieren.
Wird ein Gegner mit dem Schneesturm eingefroren bleibt er immer drei Sekunden lang gefroren.
Das Ziel eines Frostpfeils wird bis Zaubergrad II, vier Sekunden lang eingefroren.
Ab Zaubergrad III bis IV wird das Ziel fünf Sekunden lang eingefroren.
Alles an Zaubergrad V sorgt dann für ein sechs Sekunden lang gefrorenes Ziel.

Die acht Sekunden stehen für die Frostfaust, die es eigenartigerweise nur bis Rang II gibt.

Diese Lösung ist zwar rustikal, funktioniert aber einwandfrei (auch für oder besser gesagt gegen den Spieler).

Hier das Beispielsskript zum Frostpfeil:
[+]
Code: Alles auswählen
scn SpellEinfrieren18Prozent

Short Wahrscheinlichkeit
short ZeigeErfolg
Ref Target 

begin ScriptEffectStart 

;Initialisierung

Set Target to GetSelf


;Kontrolle

if (Target.isActor == 0) || (Target.getDead == 1)  || (Target.isRidingHorse == 1)
	Return
endif


;Start
Set Wahrscheinlichkeit to 1 + GetRandomPercent

If ( Wahrscheinlichkeit <= 18 )
;	Target.Setghost 1
	if Target.IsSpellTarget 1Frostpfeil || Target.IsSpellTarget 2Frostpfeil
		Target.AddspellNS Eingefroren4Sek
		Set ZeigeErfolg to 1
	elseif Target.IsSpellTarget 3Frostpfeil || Target.IsSpellTarget 4Frostpfeil
		Target.AddspellNS Eingefroren5Sek
		Set ZeigeErfolg to 1
	elseif Target.IsSpellTarget 5Frostpfeil || Target.IsSpellTarget 6Frostpfeil || Target.IsSpellTarget 7Frostpfeil
		Target.AddspellNS Eingefroren6Sek
		Set ZeigeErfolg to 1
	endif
	if Zeigeerfolg
		Target.PlayMagicShaderVisuals effectGefrohren
		if Target == Player
			Message "Sie wurden eingefroren!"
		else
			MessageEX "%n wurde eingefroren." Target
		endif
		Set ZeigeErfolg to 0
	endif
endif
end
Und das ist das Skript für das viersekündige Einfrieren:
[+]
Code: Alles auswählen
scn SpellEingefroren4SekEffekt

float Erstarrungsdauer
Ref Target 

begin ScriptEffectStart 

;Initialisierung
Set Erstarrungsdauer to 0
Set Target to GetSelf
;Start
SetRestrained 1
	if Target == Player
		DisableControl 15
		DisableControl 18
		DisableControl 19
		DisableControl 20
		DisableControl 20
		DisableControl 21
		DisableControl 22
		DisableControl 23
		DisableControl 25
	endif
End

Begin ScriptEffectUpdate
	if Erstarrungsdauer < 4
		Set Erstarrungsdauer to Erstarrungsdauer + ScriptEffectElapsedSeconds
	else
		if Target == Player
			EnableControl 15
			EnableControl 18
			EnableControl 19
			EnableControl 20
			EnableControl 21
			EnableControl 22
			EnableControl 23
			EnableControl 24
			EnableControl 25		
		endif
		SetRestrained 0
		Target.StopMagicShaderVisuals effectGefrohren
		Target.RemoveSpell Eingefroren4Sek
	endif
End
3 Beiträge Seite 1 von 1

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste