Construction Set Level-Up feststellen

IvanDaVile

Abenteurer
Das Problem: Ich hab mich an einem kleinen PI versucht, dass den HP-Bonus durch Ausdauer beim Level-Up aufsummiert, d.h. man soll soviele Trefferpunkte haben als hätte man immer den Momentan Ausdauerwert. (so wie z.B. bei Oblivion Improved möglich falls das jemanden was sagt)
Nun kann man leider nicht leicht feststellen, wieviel Ausdauer der Char wirklich hat und was von Tränken und Zaubern kommt. Ich stelle das fest, indem ich dem HP zuwachs beim Levelup messe und dann durch 10 teile (~fLevelUpHealthEndMult)

EDIT: ich multiplizieren natürlich mit 10, die konstande entspricht im Vanilla-Game 1/10

Code:
begin LevelUp

short lvl
short doOnce
short endu
float h1
float h2

If ( charGenState != -1 )
	return
Endif

If ( lvl == 0 )
	set lvl to ( Player->GetLevel )
	return
Endif

If ( GetPCSleep == 1 )
	set doOnce to 1
	return
elseif ( doOnce == 1 )
	if ( Menumode == 0 )
		if ( ( Player->GetLevel ) > lvl)
			set lvl to ( Player->GetLevel )
			set endu to ( 10 * ( h2 - h1 ) + .5 )
			set h1 to ( .1 * ( ( endu - IDV_oldEndu ) * ( lvl - 2) ) )
			set IDV_oldEndu to endu
			set IDV_totHealthBonus to ( IDV_totHealthBonus + h1 )
			Player->ModHealth, h1
			MessageBox, "Level: %g, +HP: %g", lvl, h1
		endif
		set doOnce to 0
	else
		set h1 to h2
		set h2 to ( Player->GetHealth )
	endif
endif

end

was eingentlich auch wunderbar geht

fall nun aber ein anderes Script den Char weckt (TR assasine, Vampirtraum oder Sleeper), schlägt das fehl und mir scheint Scripts die aus den esm Files kommen werden immer zuerst ausgeführt.

also hab ich ein weiters geschrieben:

Code:
Begin WakeupScript

;call StartScript, WakeupScript instead of WakeUpPC to fix  other Scripts that use GetPCSleep

WakeUpPC
StopScript, WakeupScript


End

und rufe dass in den oben genannt als Ersatz auf, was gut geht (der aufwecker wird um 1 Frame verzögert)

das finde ich aber nicht ideal, weil es 3 Scripts modifiziert die nicht damit zu tun haben was ich eigentlich wollte :?

mein "sicherer" Ausweg ist:

Code:
begin LevelUp

short lvl
short doOnce
short endu
float h1
float h2

If ( charGenState != -1 )
	return
Endif

If ( lvl == 0 )
	set lvl to ( Player->GetLevel )
	set h2 to 0.0
	return
Endif

If ( Menumode == 1 )
	set h1 to h2
	set h2 to ( Player->GetHealth )
	set doOnce to 1
	return
elseif ( doOnce == 1 )
	if ( ( Player->GetLevel ) > lvl)
		set lvl to ( Player->GetLevel )
		set endu to ( 10 * ( h2 - h1 ) + .5 )
		set h1 to ( .1 * ( ( endu - IDV_oldEndu ) * ( lvl - 2) ) )
		set IDV_oldEndu to endu
		Player->ModHealth, h1
		MessageBox, "Level: %g, +HP: %g", lvl, h1
	endif
	set doOnce to 0
endif

end

der läuft aber immer im Invantar usw. und ist somit etwas performance-kritisch.

Weiss jemand wie man sich da anderweitig helfen kann oder ob ich vielleicht einen ganz andere Methode nehmen sollte den Levelup festzustellen?
 
Zuletzt bearbeitet:
ok, nach etwas Testen bin ich mir jetzt recht sicher, dass alle laufenden Scripts in einer Liste stehen, die jeden Frame abgearbeitet wird und die folgendermaßen aufgebaut ist:

1. länger laufende scripts stehen vor neu gestarteten scripts

2. noch nicht laufende Startscripts, die zu ersten mal aktiviert werden, werden auf folgende weise angefügt

a) Reihenfolge der Mods i.e. esm > esp, jüngeres Datum später
b) mod-interne alphabetische Reihenfolge

3. später aktivierte Scripts stehen weiter hinten

Durch

StopScript, ScriptName
StartScript, ScriptName

landet z.B. ein Script am ende dieser Liste

Damit löse ich meine Probleme von oben:

StartScript:
Code:
begin RHPI_Setup

short state
short button

if ( charGenState != -1 )
	return
endif

StartScript, RHPI_LevelUp

if ( ScriptRunning, VampireCheck == 1 )
	StopScript, VampireCheck
	StartScript, VampireCheck
endif
if ( ScriptRunning, dbattackScript == 1 )
	StopScript, dbattackScript
	StartScript, dbattackScript
endif

StopScript, RHPI_Setup

end

Code:
begin RHPI_LevelUp

short doOnce
short endu
short lvl
float h1
float h2

if ( lvl == 0 )
	set lvl to ( Player->GetLevel )
	return
endif

if ( GetPCSleep == 1 )
	set doOnce to 1
	return
elseif ( doOnce == 1 )
	if ( Menumode == 0 )
		if ( ( Player->GetLevel ) > lvl )
			set lvl to ( Player->GetLevel )
			set endu to ( 10 * ( h2 - h1 ) + .5 )
			if ( oldEndurance != 0 )
				set h1 to ( .1 * ( ( endu - oldEndurance ) * ( lvl - 2) ) )
				set totalBonusHP to ( totalBonusHP + h1 )
				Player->ModHealth, h1
			endif
			set oldEndurance to endu
		endif
		set doOnce to 0
	else
		set h1 to h2
		set h2 to ( Player->GetHealth )
	endif
endif

end