PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Schlaf Script



Wulfy301
22.10.2012, 10:26
Hallo Leute

ich brauche eure Hilfe bei einem Schlaf Script.

Unten sieht man das „A Good Nights Sleep“ Script von JoshNZ runter geladen vom newvegasNexus. Es bewirkt das man beim Schlafen langsamer heilt und keine Körperteile geheilt werden.
Das Script wird nur im Hardcore Modus aktiv, aber ich hätte es gern im normalen Spielmodus. Kann mir da bitte jemand weiter helfen, ich hab so gut wie keine Ahnung davon!

scn aaSleepHealth

Float FullHP
Float CurrentHP
Float Diff
Float HPPerHour
Float ResultHP
Float SleepTime

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0 && OncePer == 0
Set SleepTime to GetPCSleepHours
if SleepTime > 8
Set SleepTime to 8
endif
set fullHP to player.GetBaseActorValue Health
set CurrentHP to player.GetActorValue Health
Set Diff to fullHP - CurrentHP
Set HPPerHour to (Diff / 8)
Set ResultHP to HPPerHour * SleepTime
Player.RestoreActorValue Health ResultHP
Set OncePer to 1
Endif

End

Begin GameMode

If OncePer == 1
Set OncePer to 0
Endif

End


Mfg...

Aaaaaimbot
22.10.2012, 11:01
Das muß durch was anderes gesteuert werden, oder zumindest seh ich jetzt in diesem Skript keine Abfrage für den Hardcoremodus, also ob der an ist oder nicht... vielleicht mal das Basisobjekt anschauen, auf dem das Skript draufliegt?

Wulfy301
22.10.2012, 18:56
Hallo Aaaaaimbot
das einzige was ich noch gefunden habe ist die dazugehörige Questdatei.

16433

Mehr als die paar Einträge auf der erste Seite gibt es nicht. Ich werde nicht schlau daraus wie es gemacht wird, das es nur im Hardcore Modus funktioniert.
Kann man das Skript etwas umschreiben, damit es nur im normalen Modus läuft?

Mfg...

shak-otay
22.10.2012, 19:57
Das Script wird nur im Hardcore Modus aktiv, [...]
Diese Annahme ist naheliegend, aber leider falsch.

Als Beweis kannst du z.B. mal die Zeile ShowMessage AprilMartimerDead in den
If GetPCSleepHours != 0 && OncePer == 0
[...]
Endif
-Block einfügen und im Nicht-Hardcore-Mode auf einer Bettrolle schlafen.
Du wirst sehen: die Message wird eingeblendet.

Ich denke, das Heilen beim Schlafen ist hardcoded (Vermutung).
Diese Heilung "überlagert" im Normalmodus das aaSleepHealth-Script,
so dass man meint, es wäre nicht aktiv.

Im HC-Modus ist das hardcoded healing beim Schlafen ausgeschaltet und das
aaSleepHealth-Script kommt zum Tragen.

Tja, wie löst man nun dein Problem?
Du müsstest allen Bedrolls (improvisierte Schlafstellen), die kein Script haben,
das aaSleepHealth-Script zuweisen. (Habich aber nicht getestet.)

Bei Betten, die z.B. das PlayerBedSCRIPT benutzen, wird's etwa aufwändiger.

(Sollte das "Heilen durch Schlafen" doch nicht hardcoded sein, geht's vllt. einfacher.)

edit: ach ja, habich vergessen: das hardcoded healing muss natürlich iwie ausgeschaltet werden; hmm?

Wulfy301
22.10.2012, 20:25
Aha, danke erstmal für deine Antwort shak-otay!

Das bedeutet um mein Problem zu lösen, könnte ich mir genauso gut auch ins Knie schießen - mist!

Mfg...

shak-otay
22.10.2012, 20:36
Äh, nein - wozu gibt's denn das Internet?
Der user ziher hat eine "No healing on resting" mod gemacht; allerdings für Fallout 3:
http://fallout3.nexusmods.com/mods/752
Dort hat er netterweise auch das uncompiled script veröffentlicht (unterster Downloadbutton).

Die Zeile player.damageav health dhealth im gamemode dürfte die entscheidende sein...
Mfg...

PS: was macht dein Knie?,-)

Wulfy301
22.10.2012, 21:05
Wow, shak-otay das Skript funktioniert, beim schlafen wird weder die Gesundheit noch die Körperteile geheilt!
Wie muss man das Skript aber nun abändern das die Gesundheit geheilt wird aber die Körperteile nicht?
(Die Pistole liegt noch in griffweite)

scn NHsleep

float crleg
float drleg
float clleg
float dlleg
float crarm
float drarm
float clarm
float dlarm
float chead
float dhead
float ctorso
float dtorso
float chealth
float dhealth
short usedmenu

begin menumode 1012

if ispcsleeping==1
set chealth to player.GetAV health
set ctorso to player.GetAV EnduranceCondition
set chead to player.GetAV PerceptionCondition
set clarm to player.GetAV LeftAttackCondition
set crarm to player.GetAV RightAttackCondition
set clleg to player.GetAV LeftMobilityCondition
set crleg to player.GetAV RightMobilityCondition
set usedmenu to 1
endif

end

begin gamemode

if usedmenu == 1
set dhealth to player.getav health - chealth
set dtorso to player.getav EnduranceCondition - ctorso
set dhead to player.getav PerceptionCondition - chead
set dlarm to player.getav LeftAttackCondition - clarm
set drarm to player.getav RightAttackCondition - crarm
set dlleg to player.getav LeftMobilityCondition - clleg
set drleg to player.getav RightMobilityCondition - crleg
player.damageav health dhealth
player.damageav EnduranceCondition dtorso
player.damageav PerceptionCondition dhead
player.damageav LeftAttackCondition dlarm
player.damageav RightAttackCondition drarm
player.damageav LeftMobilityCondition dlleg
player.damageav RightMobilityCondition drleg
set usedmenu to 0
endif

end


Mfg...

shak-otay
22.10.2012, 21:44
Wow, shak-otay das Skript funktioniert,
Naja, müsste wohl heißen: "Wow, ziher", oder?;-)


beim schlafen wird weder die Gesundheit noch die Körperteile geheilt!
Wie muss man das Skript aber nun abändern das die Gesundheit geheilt wird aber die Körperteile nicht?
Einfach die Zeile "player.damageav health dhealth" weglassen?

Wenn du langsamere Heilung wie mit dem aaSleepHealth-Script meinst - das könnte etwas aufwändiger werden.

Leider habich gerade nicht so die Zeit dafür, da ich diverse andere Projekte code.

Aber mit ein bisschen Einarbeitung solltest du das selbst schaffen, oder?

Da gibt's ein Geck-Wiki, wo man z.B. nachlesen kann, dass menumode 1012 für SleepWait steht etc.

Dieses Tut (http://www.cipscis.com/fallout/tutorials/beginners.aspx) ist auch sehr fein gemacht; allerdings auf Englisch; (vllt. gibt's da ja 'ne deutsche Übersetzung von?)
http://www.cipscis.com/fallout/tutorials/beginners.aspx

Wulfy301
22.10.2012, 22:24
Super, danke für deine Hilfe!:)

So, momentan sieht es so aus -> das Skript funktioniert, die Körperteile werden nicht mit geheilt - sehr schön!

Nächster schritt wäre das zeitverzögerte Heilen der Gesundheit. Ich versuch mich mit dem Tut, aber jede Hilfe diesbezüglich, wäre mir lieber!

Hab mich ein wenig rein gelesen und hab etwas rumprobiert, aber es sieht nicht so aus, als wenn ich das kapieren würde.
Bitte helft mir!:(

Mfg...

shak-otay
23.10.2012, 09:13
Lass' erstmal die limbs-Geschichte außen vor und benutz' nur die Mod von JoshNZ.
Verschiebe dort die Player.RestoreActorValue-Zeile wie folgt:


Begin GameMode

If OncePer == 1
Set OncePer to 0
Player.RestoreActorValue Health ResultHP
Endif

End
Das wäre praktisch äquivalent zum ziher-script.
Am Anfang eines GameMode frames wirkt sich das automatisierte healing auf Health aus
und das wird dann von Player.RestoreActorValue überschrieben.

Das ist die Idee; testen musst du es selber...

MfG...

edit: hmm, das schien nicht zu funzen; hatte schon seinen Grund, weshalb ziher player.damageav
verwendete.

Hier das leicht geänderte Script von JoshNZ:


scn aaSleepHealth

Float FullHP
Float CurrentHP
Float Diff
Float HPPerHour
Float ResultHP
Float SleepTime

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0
if OncePer==0
Set SleepTime to GetPCSleepHours
if SleepTime > 8
Set SleepTime to 8
endif
;ShowMessage AprilMartimerDead
set fullHP to player.GetBaseActorValue Health
set CurrentHP to player.GetActorValue Health
Set Diff to fullHP - CurrentHP
Set HPPerHour to (Diff / 8)
Set ResultHP to (fullHP - HPPerHour * SleepTime)
Set OncePer to 1
Endif
Endif

End

Begin GameMode

If OncePer==1
player.damageav health ResultHP
Set OncePer to 0
Endif

End
Nach einer Stunde pennen gibt's etwas HP, nach 4h entsprechend mehr.

Nach 8h oder mehr gibt's allerdings keine full HPs.
Wenn man nach 8h pennen nochmal 1h pennt, reduzieren sich die HPs,
weil die Formeln nicht akkumulieren, sondern Absolutwerte generieren.

Ja, das sollte korrigiert werden, wenn's realistisch sein soll.

Man muss dazu CurrentHP subtrahieren; weißt du auch, wo?;-)

Wulfy301
23.10.2012, 18:28
Aber hallo, shak-otay du bist echt spitze!

Ich tippe mal bei "Set Diff to fullHP - CurrentHP", oder?

Mfg...

P.S. Habs gerade getestet und da stimmt was nicht! Wenn man nur eine Stunde schläft, wird die Gesundheit auf fast null reduziert, schläft man wieder eine Stunde wird man etwas geheilt, schläft man 8 Stunden ist man fast geheilt.

Kann man das nicht so einstellen, das man jede Stunde einen bestimmten Wert geheilt wird und gut?

shak-otay
23.10.2012, 21:02
Aber hallo, shak-otay du bist echt spitze!Naja, mein Chef sagt immer, ich bliebe unter meinen Möglichkeiten...:D


Ich tippe mal bei "Set Diff to fullHP - CurrentHP", oder?Knapp daneben.



P.S. Habs gerade getestet und da stimmt was nicht! Wenn man nur eine Stunde schläft, wird die Gesundheit auf fast null reduziert, schläft man wieder eine Stunde wird man etwas geheilt, schläft man 8 Stunden ist man fast geheilt.Ich schrieb ja, dass das Script noch korrigiert werden muss.


Kann man das nicht so einstellen, das man jede Stunde einen bestimmten Wert geheilt wird und gut?

Mit dieser Korrektur solltes passen:
Set ResultHP to (fullHP - CurrentHP - HPPerHour * SleepTime)

MfG...

Wulfy301
23.10.2012, 21:26
Das Skript sieht jetzt so aus, funktioniert aber nicht richtig.
Eine Stunde schlafen etwas Heilung (wie gewünscht), aber auch die Körperteile werden vollständig geheilt.
8 Stunden schlafen Heilung fast fertig, noch ne Stunde schlafen (auch mehrmals) Heilung bleibt bei etwa 90% stehen.

Skript ->

scn aaSleepHealth

Float FullHP
Float CurrentHP
Float Diff
Float HPPerHour
Float ResultHP
Float SleepTime

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0
if OncePer==0
Set SleepTime to GetPCSleepHours
if SleepTime > 8
Set SleepTime to 8
endif
;ShowMessage AprilMartimerDead
set fullHP to player.GetBaseActorValue Health
set CurrentHP to player.GetActorValue Health
Set Diff to fullHP - CurrentHP
Set HPPerHour to (Diff / 8)
Set ResultHP to (fullHP - CurrentHP - HPPerHour * SleepTime)
Set OncePer to 1
Endif
Endif

End

Begin GameMode

If OncePer==1
player.damageav health ResultHP
Set OncePer to 0
Endif

shak-otay
23.10.2012, 22:09
aber auch die Körperteile werden vollständig geheilt.Ja, ich schrieb doch, dass wir die limbs erstmal "außen vor" lassen. Für die Körperteile musst du die ziher-mod ohne die player.damageav health ...-Zeile aktivieren, denkich.


8 Stunden schlafen Heilung fast fertig, noch ne Stunde schlafen (auch mehrmals) Heilung bleibt bei etwa 90% stehen.
Naja, das Feintuning ist immer der aufwändige Part; da musst du schon selber tätig werden.

Am besten, du malst dir ein Achsenkreuz auf: y-Achse=HP, x-Achse= timeline, also die Stunden.

(Geradengleichungen y= mx+b (m=Steigung, b= y-Achsenabschnitt) sind ein Begriff, hoffich?)

SleepTime ist x, y dürfte health - ResultHP sein.
Stell die Geradengleichung auf berechne daraus die aktuelle Wertetabelle; zeichne die x/y-Paare in die x-y-Ebene ein.

Dann fülle die Wertetabelle mit den gewünschten Wertepaaren. Du brauchst aber nur 2 Wertepaare,
um die neue Geradengleichung zu bestimmen. (2-Punkte-Form der Geradengleichung; sollte Stoff der 8. oder 9. Klasse sein)

Wenn dir das zu kompliziert ist, kannst du die 3 8ten im Script auch mal testweise durch 10 oder 12 ersetzen.

PS: bitte setze Scripte beim Posten in code-tags (code)script(/code), damit die vernünftig formatiert sind.
"(", ")" durch "[","]" ersetzen

Wulfy301
23.10.2012, 23:27
Soweit bin ich jetzt:

Skript 1 (ziher-mod ) -> Körperteile werden durch Schlaf nicht mit geheilt - funktioniert

Skript 2 (JoshNZ-shak-otay-mod) -> Heilung erfolgt schrittweise, aber:

nach einer Stunde Schlaf hüpft der Grafikbalken der Gesundheitsanzeige von 100% Geheilt auf 30% Verletzt zurück. Wieder 1 Stunde schlafen, Balken hüpft von 100% auf 40% zurück, usw.
egal wie lange und in welchen Zeitabschnitten man schläft, man erreicht nicht mehr als 90% Heilung.

Handelt es sich hierbei um die erwähnte Feineinstellung?
Ein herumprobieren mit den 8ter Werten, hat keine sichtbare Besserung ergeben.


[QUOTE]scn aaSleepHealth

Float FullHP
Float CurrentHP
Float Diff
Float HPPerHour
Float ResultHP
Float SleepTime

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0
if OncePer==0
Set SleepTime to GetPCSleepHours
if SleepTime > 8
Set SleepTime to 8
endif
;ShowMessage AprilMartimerDead
set fullHP to player.GetBaseActorValue Health
set CurrentHP to player.GetActorValue Health
Set Diff to fullHP - CurrentHP
Set HPPerHour to (Diff / 8)
Set ResultHP to (fullHP - CurrentHP - HPPerHour * SleepTime)
Set OncePer to 1
Endif
Endif

End

Begin GameMode

If OncePer==1
player.damageav health ResultHP
Set OncePer to 0
Endif

End

Kann man das ganze nicht vereinfachen?

Wäre so was auch möglich:
- zum momentanen Gesundheitswert wird nach einer Stunde Schlaf, 50 Gesundheitspunkte dazu addiert.
- nach einer weiteren Stunde werden wieder 50 GP dazu addiert, usw.
- es ist egal ob man eine Stunde, oder acht Stunden am Stück schläft, es werden je Stunde 50 GP dazu addiert, bis halt die maximale Gesundheit erreicht ist.

Geht das auch, oder ist das noch komplizierter?

Mfg...

Boïndil
24.10.2012, 05:55
Wie wäre es damit?
Set ResultHP To GetPCSleepHours * 50
Player.RestoreActorValue Health ResultHP

shak-otay
24.10.2012, 11:15
[...]nach einer Stunde Schlaf hüpft der Grafikbalken der Gesundheitsanzeige von 100% Geheilt auf 30% Verletzt zurück. Wieder 1 Stunde schlafen, Balken hüpft von 100% auf 40% zurück, usw.
Kann ich so nicht nachvollziehen. Das automatische (oder hardcoded) Heilen ist ja nicht ausgeschaltet.
D.h., bevor player.damageav health ResultHP im GameMode "greift", haben wir natürlich erstmal
(sehr kurzfristig) 100% health. Vllt. ist dein PC/GraKa etwas träge, so dass du die Full Health Balken sehen kannst?


egal wie lange und in welchen Zeitabschnitten man schläft, man erreicht nicht mehr als 90% Heilung.
Bei mir sind's 95%; könnte ein Rundungsfehler sein.


Handelt es sich hierbei um die erwähnte Feineinstellung?
Ja, es handelt sich um ein Problem, das einer Feineinstellung bzw. genaueren Betrachtung bedarf.
Aber das wollte ich dir überlassen.;)

Hiermit kannst du dir die SleepTime (oder auch andere Variablenwerte) ausgeben lassen.
http://forums.nexusmods.com/index.php?/topic/483176-need-help-with-limb-condition-script/page__p__3953195#entry3953195

Der ganze thread dort ist hinsichtlich der SleepTime-Problematik sehr interessant; aber auf Englisch.

Wulfy301
24.10.2012, 19:23
Bevor es weiter geht, muss ich mich für deine große Geduld mit mir bedanken - DANKE!

Meine Prozentangaben sind nur grob geschätzt - sorry!

Hab die beiden abgeänderten Befehlszeilen eingefügt, aber entweder an die falsche Stelle, oder es stimmt irgendwas anderes nicht. Nach einer Stunde heilen, wird mein alter Ego komplett geheilt, sprich mehr als 50 HP.

Den SleepTime Link habe ich noch nicht genauer angesehen, komm gerade von der Arbeit, aber danke dafür!

Hier das neu geänderte Skript->


scn aaSleepHealth

Float FullHP
Float CurrentHP
Float Diff
Float HPPerHour
Float ResultHP
Float SleepTime

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0
if OncePer==0
Set SleepTime to GetPCSleepHours
if SleepTime > 8
Set SleepTime to 8
endif
;ShowMessage AprilMartimerDead
set fullHP to player.GetBaseActorValue Health
set CurrentHP to player.GetActorValue Health
Set Diff to fullHP - CurrentHP
Set HPPerHour to (Diff / 8)
Set ResultHP To GetPCSleepHours * 50
Set OncePer to 1
Endif
Endif

End

Begin GameMode

If OncePer==1
Player.RestoreActorValue Health ResultHP
Set OncePer to 0
Endif

End

Diese Script Abläufe sind mir einfach zu hoch, wieso muss man diese "wenn ich weniger als 8 Stunden schlafe, dann..." Zeilen einbauen? Wieso kann man nicht eine einfache Befehlsfolge wie, siehe nach wie hoch der aktuelle HP Wert ist, rechne pro Stunde 50 HP dazu und hör auf wenn der maximale HP Wert erreicht ist, programmieren?
Ich bin einfach zu alt für diese Programmart, ich bin mit Dos, Basic und etwas TurboPascal groß geworden!;(

Mfg...

Boïndil
24.10.2012, 19:58
Dieses Script ist auf jeden Fall nicht besonders elegant. Eine Abfrage, ob es weniger als 8 Stunden sind, braucht es gar nicht. Selbst wenn es 0 Stunden (*50) wäre, würde wahrscheinlich die Engine keinen Fehler machen.
Es braucht auch keine Obergrenze für Stunden, denn RestoreActorValue (http://geck.bethsoft.com/index.php/RestoreActorValue) Health füllt Werte auf, bis es nicht mehr geht und wenn es mehr als 100% ist, wird es einfach verworfen.
Im Prinzip reicht das aus:

scn aaSleepHealth

Float ResultHP

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0
if OncePer==0
Set ResultHP To GetPCSleepHours * 50
Set OncePer to 1
Endif
Endif

End

Begin GameMode

If OncePer==1
Player.RestoreActorValue Health ResultHP
Set OncePer to 0
Endif

End

Wulfy301
24.10.2012, 20:36
Wow, das ist jetzt aber klein geworden, danke Boïndil !

Aber (leider gibt es ein aber), es bleibt nach wie vor das Problem bestehen das nach einer Stunde schlafen bereits der maximale HP Wert erreicht ist.
Kann es an dem zweiten Script liegen, das die Heilung der Körperteile verhindert?


scn aaSleepHealthLimps

float crleg
float drleg
float clleg
float dlleg
float crarm
float drarm
float clarm
float dlarm
float chead
float dhead
float ctorso
float dtorso
float chealth
float dhealth
short usedmenu

begin menumode 1012

if ispcsleeping==1
set chealth to player.GetAV health
set ctorso to player.GetAV EnduranceCondition
set chead to player.GetAV PerceptionCondition
set clarm to player.GetAV LeftAttackCondition
set crarm to player.GetAV RightAttackCondition
set clleg to player.GetAV LeftMobilityCondition
set crleg to player.GetAV RightMobilityCondition
set usedmenu to 1
endif

end

begin gamemode

if usedmenu == 1
set dhealth to player.getav health - chealth
set dtorso to player.getav EnduranceCondition - ctorso
set dhead to player.getav PerceptionCondition - chead
set dlarm to player.getav LeftAttackCondition - clarm
set drarm to player.getav RightAttackCondition - crarm
set dlleg to player.getav LeftMobilityCondition - clleg
set drleg to player.getav RightMobilityCondition - crleg

player.damageav EnduranceCondition dtorso
player.damageav PerceptionCondition dhead
player.damageav LeftAttackCondition dlarm
player.damageav RightAttackCondition drarm
player.damageav LeftMobilityCondition dlleg
player.damageav RightMobilityCondition drleg
set usedmenu to 0
endif

end

Boïndil
24.10.2012, 21:37
Das andere Script sollte sich nur auswirken, wenn es auch an ein Bett angehängt ist.
Bist du jetzt im Hardcore-Modus?

shak-otay
24.10.2012, 22:22
Aber (leider gibt es ein aber), es bleibt nach wie vor das Problem bestehen das nach einer Stunde schlafen bereits der maximale HP Wert erreicht ist.Ich dachte, das wär' geklärt, dass das mit Player.RestoreActorValue (so) in der GameMode-Abfrage nicht geht?

Ich habe in diesem post http://www.globalgameport.com/showthread.php?50101-Hilfe-bei-Schlaf-Script&p=812428&viewfull=1#post812428 nicht umsonst auf player.damageav umgestellt.

Ich klink' mich hier dann mal aus.

MfG...

Wulfy301
24.10.2012, 23:27
@ Boïndil
Nein, immer noch im normal Modus!

@ shak-otay
Arggh, bitte nicht sauer sein! :eek:

Mit "Player.RestoreActorValue" bekommt man sofort volle HP Zahl und mit "Player.RestoreActorValue Health ResultHP" kommt man nicht auf die 100% HP.
Do soist ned narrisch wern! :scared

Mfg...

Boïndil
25.10.2012, 07:30
Um es nochmals zusammen zu fassen:

Die Schreibweise ist immer so:
"Referenz(Player).RestoreActorValue Health Wert" oder kürzer "Referenz(Player).RestoreAv Health Wert"
Mit RestoreActorValue kann man eine ganze Liste von Werten des Players ändern und natürlich muss die Funktion wissen, welche davon und um welchen Wert.

Da die Funktion den normalen Schlaf-Modus überschreiben muss, der alles heilt, verwendet man DamageAv und nicht RestoreAv, um das wieder rückgängig zu machen. Dazu muss man zu Beginn des Schlafens den Wert rausfinden, der vor der Heilung ist und die Differenz zur vollständigen Gesundheit des Players.
Da DamageAv Gesundheit abziehen soll, erklärt es auch, wieso das Schlafen intern eine Obergrenze haben muss. Wenn man nämlich zulange schläft, könnte der Player anschliessend sterben, wenn man einfach Schlafzeit * 50 rechnet.

Dass irgendwelche Dinge nicht funktionieren, könnte daran liegen, dass das Script nicht zum richtigen Zeitpunkt wirkt. Das oben ist nur die Theorie, aber es nützt nichts, wenn die Heilung durch das Script ausgelöst wird, bevor die Engine heilt.

Zur Theorie der GameMode-Blöcke (http://geck.bethsoft.com/index.php/Category:Blocktypes), die wichtig ist.
GameMode wird alle X Milisekunden durchlaufen und wird gestopt, wenn man sich im Menu befindet.
Dann greift MenuMode (http://geck.bethsoft.com/index.php/MenuMode), z.B. "Begin MenuMode 1012" (1012 = SleepWait)


begin menumode 1012
if ispcsleeping==1
; Start-Werte ermitteln
set chealth to player.GetAV health
set ctorso to player.GetAV EnduranceCondition
set usedmenu to 1
endif
end
Das Menu kann ja unbegrenzt offen bleiben und bleibt es auch, während der Player schläft.
Deshalb wartet das Script, bis der Player schläft und ermittelt dann die aktuellen Werte und setzt einen Marker usedmenu für GameMode, dass die Heilung oder Schädigung beginnen kann, was sofort ausgeführt wird, wenn MenuMode zu Ende ist.
Ich weiss eben nicht genau, zu welchem Zeitpunkt die Engine heilt, es könnte sogar sein, dass das Script als Startwerte den geheilten Player kriegt und dann stimmen die Werte nicht. Es könnte auch sein, dass die Engine da unabhängig von den regulären Blöcken arbeitet.

Wenn ich im Zweifel bin, setze ich Messageboxen ein, dir mir die Werte ausgeben und überprüfe dann, ob diese plausbel sind.


begin menumode 1012
if ispcsleeping==1
; Start-Werte ermitteln
set chealth to player.GetAV health
set ctorso to player.GetAV EnduranceCondition
ShowMessage (http://geck.bethsoft.com/index.php/ShowMessage) MessageSleepValues chealth ctorso
set usedmenu to 1
endif
end

Die Messagebox (http://geck.bethsoft.com/index.php/Message) sollte eine Infobox sein, dafür hat es eine Checkbox, dann sieht man den Wert oben links. Der Teext könnte so aussehen:
Gesundheit:%.0f
Torso:%.0f

Würde das mal versuchen.

shak-otay
25.10.2012, 11:56
Da DamageAv Gesundheit abziehen soll, erklärt es auch, wieso das Schlafen intern eine Obergrenze haben muss. Wenn man nämlich zulange schläft, könnte der Player anschliessend sterben, wenn man einfach Schlafzeit * 50 rechnet.Gut erkannt; vorher hast du das Script von JoshNZ noch als "unelegant" bezeichnet.;)


es könnte sogar sein, dass das Script als Startwerte den geheilten Player kriegt und dann stimmen die Werte nicht.
Von welchem Script redest du hier?
Geheilter Player bedeutet currentHP ist gleich fullHP.
Bei meiner Änderung von JoshNZ's script wird demzufolge fullHP-CurrentHP (und damit ResultHP) zu Null.
Also belibt der Player voll geheilt.

Auch wenn der Rest deiner Analyse von fundiertem Wissen zeugt, ist das Problem des "nicht auf 100%-Kommens"
mMn in der langsamen Konvergenz der "Gleichung" Set ResultHP to (fullHP - CurrentHP - HPPerHour * SleepTime)
für eine SleepTime von 1h begründet.

Das ist einfacher erkennbar, wenn man das mal umschreibt auf ResultHP= (fullHP - CurrentHP) * (1 - SleepTime / 8).

(Wenn man das ingame nachvollziehen will, sollte man die Variablenausgaben z.B. mit %4.3f formatieren,
da das Ergebnis der 2. Klammer (für SleepTime=1) 0.875 ist.)

Aber wie realistisch ist das überhaupt, dass sich jemand 4 x nacheinander für 1h Pennen legt?

Wenn ich mit 20.94 CurrentHP 8h Pennen lege, krieg' ich mit dem modifizierten JoshNZ-script FullHP (= 100%):


scn aaSleepHealth

Float FullHP
Float CurrentHP
Float Diff
Float HPPerHour
Float ResultHP
Float SleepTime

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0
if OncePer==0
Set SleepTime to GetPCSleepHours
if SleepTime > 8
Set SleepTime to 8
endif
set fullHP to player.GetBaseActorValue Health
set CurrentHP to player.GetActorValue Health
Set Diff to fullHP - CurrentHP
Set HPPerHour to (Diff / 8)
Set ResultHP to (fullHP - CurrentHP - HPPerHour * SleepTime)
Set OncePer to 1
Endif
Endif
End

Begin GameMode

If OncePer==1
player.damageav health ResultHP
Set OncePer to 0
Endif

End

Wenn ich mich 7h hinlege, gibt's 88%, nach weiteren 2h 3% mehr.
Wie ich schon vorschlug, wäre es das Beste, den gewünschten HP-Heilungsverlauf über die Zeit
per Wertetabelle vorzugeben und danach eine Formel zu modellieren.

Fehlt mir nur gerade die Lust dazu; aber rein aus mathematischem Interesse würde es mich schon reizen.

Dank' an Euch beide für das interessante Thema; vllt. ist die Lösung ja auch viel einfacher und ich mach's nur zu kompliziert...:D

tommyd2
25.10.2012, 12:19
Auch wenn der Rest deiner Analyse von fundiertem Wissen zeugt

Boindil ist unser Forum-Scripting-Guru. :P
Streng dich an, vieleicht verleihen wir dir dann ja irgendwann den Titel. :D

shak-otay
25.10.2012, 13:10
Boindil ist unser Forum-Scripting-Guru. :P
Streng dich an, vieleicht verleihen wir dir dann ja irgendwann den Titel. :DNönö, lass' man stecken.
Ich brauche keine Titel mehr; ich gönn' ihm den.

Trotzdem, natürlich völlig unabhängig von deiner Einlassung:D, habe ich das SleepScript nochmal leicht geändert:


scn aaSleepHealth

Float FullHP
Float CurrentHP
;Float Diff
Float HPPerHour
Float ResultHP
Float SleepTime

Int OncePer

Begin MenuMode

If GetPCSleepHours != 0
if OncePer==0
Set SleepTime to GetPCSleepHours
if SleepTime > 8
Set SleepTime to 8
endif
set fullHP to player.GetBaseActorValue Health
set CurrentHP to player.GetActorValue Health
Set HPPerHour to (fullHP / 8)
Set ResultHP to (fullHP - CurrentHP - HPPerHour * SleepTime)
if ResultHP < 0
Set ResultHP to 0
; elseif
Endif
Set OncePer to 1
Endif
Endif

End

Begin GameMode

If OncePer==1
player.damageav health ResultHP
Set OncePer to 0
Endif

End

Boïndil
25.10.2012, 14:12
Habe natürlich nicht immer die selbe Form, vor allem , wenn ich vor 6 Uhr morgens oder nach fünf Stunden Borderlands 2 poste :)

Sieht aber elegant aus, dein Script :D
Ich stehe nur darauf, möglichst wenige temporäre Variablen zu verwenden und möglichst wenige Zeilen, das meinte ich eigentlich mit Eleganz.

Wulfy301
25.10.2012, 15:12
[Dialekt ein]
Wurscht, Hauptsach geh duats!
[Dialekt aus]

shak-otay, du hast's geschafft, alles funktioniert wie gewünscht!:fest1
Nur ein kleines optisches Problem ist halt der Gesundheitsbalken der von 100% immer zurück springt, wenn man noch nicht ganz geheilt ist, aber egal.

Vielen Danke auch an Boïndil, falls du ein noch besseres Skript haben solltest, nur her damit!:)

Hab ich ein Glück das mir gleich zwei, fähige Skriptschreiber geholfen haben - DANKE!:right

Mfg...