Das andere Script sollte sich nur auswirken, wenn es auch an ein Bett angehängt ist.
Bist du jetzt im Hardcore-Modus?
Das andere Script sollte sich nur auswirken, wenn es auch an ein Bett angehängt ist.
Bist du jetzt im Hardcore-Modus?
No mods for Failout 76.
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/showth...l=1#post812428 nicht umsonst auf player.damageav umgestellt.
Ich klink' mich hier dann mal aus.
MfG...
Geändert von shak-otay (24.10.2012 um 22:25 Uhr)
@ Boïndil
Nein, immer noch im normal Modus!
@ shak-otay
Arggh, bitte nicht sauer sein!
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!
Mfg...
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, die wichtig ist.
GameMode wird alle X Milisekunden durchlaufen und wird gestopt, wenn man sich im Menu befindet.
Dann greift MenuMode, z.B. "Begin MenuMode 1012" (1012 = SleepWait)
Das Menu kann ja unbegrenzt offen bleiben und bleibt es auch, während der Player schläft.Code: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
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.
Die Messagebox sollte eine Infobox sein, dafür hat es eine Checkbox, dann sieht man den Wert oben links. Der Teext könnte so aussehen:Code:begin menumode 1012 if ispcsleeping==1 ; Start-Werte ermitteln set chealth to player.GetAV health set ctorso to player.GetAV EnduranceCondition ShowMessage MessageSleepValues chealth ctorso set usedmenu to 1 endif end
Gesundheit:%.0f
Torso:%.0f
Würde das mal versuchen.
No mods for Failout 76.
Gut erkannt; vorher hast du das Script von JoshNZ noch als "unelegant" bezeichnet.
Von welchem Script redest du hier?es könnte sogar sein, dass das Script als Startwerte den geheilten Player kriegt und dann stimmen die Werte nicht.
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%):
Wenn ich mich 7h hinlege, gibt's 88%, nach weiteren 2h 3% mehr.Code: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
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...
Nönö, lass' man stecken.
Ich brauche keine Titel mehr; ich gönn' ihm den.
Trotzdem, natürlich völlig unabhängig von deiner Einlassung, habe ich das SleepScript nochmal leicht geändert:
Code: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
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
Ich stehe nur darauf, möglichst wenige temporäre Variablen zu verwenden und möglichst wenige Zeilen, das meinte ich eigentlich mit Eleganz.
No mods for Failout 76.
[Dialekt ein]
Wurscht, Hauptsach geh duats!
[Dialekt aus]
shak-otay, du hast's geschafft, alles funktioniert wie gewünscht!
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!
Mfg...