Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 29 von 29
  1. #21
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    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.

  2. #22
    Newbie Avatar von shak-otay
    Registriert seit
    04.09.2012
    Beiträge
    39

    Standard

    Zitat Zitat von Wulfy301 Beitrag anzeigen
    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/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 23:25 Uhr)

  3. #23
    Let's Play-Gucker
    Registriert seit
    30.09.2010
    Beiträge
    108

    Standard

    @ 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...

  4. #24
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    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)

    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
    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.

    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
    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:
    Gesundheit:%.0f
    Torso:%.0f

    Würde das mal versuchen.
    No mods for Failout 76.

  5. #25
    Newbie Avatar von shak-otay
    Registriert seit
    04.09.2012
    Beiträge
    39

    Standard

    Zitat Zitat von Boïndil Beitrag anzeigen
    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%):

    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
    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...

  6. #26
    inaktiv
    Registriert seit
    27.07.2008
    Ort
    ...
    Beiträge
    3.044

    Standard

    Zitat Zitat von shak-otay Beitrag anzeigen
    Auch wenn der Rest deiner Analyse von fundiertem Wissen zeugt
    Boindil ist unser Forum-Scripting-Guru.
    Streng dich an, vieleicht verleihen wir dir dann ja irgendwann den Titel.

  7. #27
    Newbie Avatar von shak-otay
    Registriert seit
    04.09.2012
    Beiträge
    39

    Standard

    Zitat Zitat von tommyd2 Beitrag anzeigen
    Boindil ist unser Forum-Scripting-Guru.
    Streng dich an, vieleicht verleihen wir dir dann ja irgendwann den Titel.
    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

  8. #28
    Not my Fallout Avatar von Boïndil
    Registriert seit
    20.07.2008
    Ort
    Vaullt 101
    Beiträge
    12.122
    Gamer IDs

    Gamertag: PixelMurder

    Standard

    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.

  9. #29
    Let's Play-Gucker
    Registriert seit
    30.09.2010
    Beiträge
    108

    Standard

    [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...

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •