PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Actor-Effekt wird nicht ausgeführt



Boïndil
28.01.2011, 15:36
Hallo, ihr lieben Geckler,
ich hoffe, es kann mir jemand weiter helfen.

Ich bin dabei, einige Anpassungen vorzunehmen, die einige Features von Shootern beinhalten:
-Sicht wird Rot bei geringer Gesundheit(erledigt)
-Auto-Heilen mit Stimpack bei geringer Gesundheit(klappt nicht)

Das erste hat sofort geklappt, das zweite bereitet mir Kopfzerbrechen.

Wie man sieht, habe ich einen Actor-Effect, einen Base-Effekt und ein Script.

Das vollständige Script sollte etwa so aussehen, habe es testweise abgespeckt(siehe Screenshot):


scn BerserkerRestoreHealthEffect
begin ScriptEffectStart
If GetItemCount Stimpak == 0
ShowMessage BerserkerViewNoStimpacks
Else
CastImmediateOnSelf Stimpak
RemoveItem Stimpak 1 1
EndIf
end

Bedingungen:
-wenn Gesundheit geringer als 40%(ein sehr kritischer Zustand)
-wenn InCombat (muss ich austesten, wie genau das ist)

Ich wollte das mit der Stimpacks-Einnahme, statt RestoreHealth verbinden, damit die Werte von den Skills abhängig sind.
Es werden aber weder Stimpaks entfernt, noch eingenommen.
Verstehe ich das richtig, dass in solche Scripten kein "Player.GetItemCount" notwendig ist, da die Scripte automatisch auf Self wirken? Oder liegt da der Hund begraben?
Oder werden innerhalb solcher Actor-Effekte bestimmte Funktionen nicht ausgeführt?
Die GECK-Seite hilft mir auf jeden Fall nicht weiter.

Die Berserkersicht funktioniert einwandfrei: bei 40%, 30% und 20% wird der selbe ImageSpaceModifier mehrmals überlagert.

Hat jemand eine Idee?

Grüsse
Boïndil

Misantrooper
28.01.2011, 18:11
Versuschs mal mit:

CastImmediateOnSelf RestoreHealthEffect
denn du kannst keinen gegenstand casten, sondern nur einen effect/spell

Boïndil
28.01.2011, 18:36
Werde das so versuchen, auf der GECK-Seite (http://geck.bethsoft.com/index.php/CastImmediateOnSelf)hatte ich folgendes gelesen:
"This can also be used with ingestible items, by substituting the item's Form ID for the spell ID"

Kann den grundsätzlich ein Item entfernt werden, denn das funktioniert ja ebenfalls nicht? Oder wird der nachfolgende Befehl nicht ausgeführt, wenn der erst falsch war?
Ich habe nämlich den Verdacht, dass der ganze Block nicht ausgeführt wird, hatte dafür ja die Debug-Meldung definiert und die wurde mir ebenfalls nicht ausgeführt.

Misantrooper
28.01.2011, 18:56
items können grundsätzlich entfernt werden. es ist gut möglich, das es wegen einem logigfehler (script syntaktisch richtig, aber die logik eben nicht) zu einem stop des scripts kam, und das item deswegen nicht entfernt wurde.
denn was du geschrieben hast, entfernt 1 stimpak ohne rückmeldung. und die syntax ist auch richtig
seit FNV gugge ich nur noch selten in das wiki, weil sich einiges geändert hat mit FNV. da komme ich mit T&E besser klar

Boïndil
28.01.2011, 20:27
Ich habe da im Moment die verschiedenen Flags und verschachtelten Effekte noch nicht im Griff, ich kopiere jeweils Items, die möglichst nahe liegen und baue Effekte nach, die ich sehe, aber Sicherheit habe ich noch keine.

Weisst du übrigens, wie man am Besten einen Bild-Filter(Keinen ImageSpace) permanent über den Screen legt? Habe es mit Effect-Shader und einem Noise-Effekt-DDS versucht, aber der Filter wird auch noch nicht angezeigt. Wäre der Weg über Effect-Shader überhaupt der Richtige?
Ich möchte eine Art Filter über das Bild legen, wie den, den es in ME1 gab. Ausserderm habe ich an einen Mission-Failed-Screen gedacht, der Buchstaben über die blutige Szene legt, so in der Art "Very important Mission failed".

Misantrooper
28.01.2011, 21:15
hmmm.... da kann ich dir nicht helfen, ich fange bei mir gerade erst an mit shadereffecten zu experimentieren, da ich ich einen zentralrechner in meiner mod habe, der als sprachinterface ein hologram einer frau darstellt. ich hab schon 100mal den disintegratios-effect studiert, da dieser in etwa das macht (vor dem aschehaufen :P), was ich haben will. ich werde meine erkenntnisse mit dir teilen, wenn ich denn je welche gewinnen sollte.


€:
mir fällt grad ein, zu deinem spimpak-problem.

gugg dir mal im FO3-geck die medical-powerarmor an. die verabreicht dir ja medX, mit den spimpaks sollte das genauso funzen

Boïndil
28.01.2011, 22:39
Gute Idee, ich danke dir! Werde da nachsehen.
Falls ich Lösungen finde, werde ich die natürlich auch hier posten.

Muss jetzt zuerst das mit dem Stimpack verabreichen in den Griff kriegen und dann kommt das mit dem Shader.
Mir schwebt da was vor wie bei FEAR2, wo eine an sich billige Grafik mit einem perfekten Shader aus Blur- und Korn-Effekten überlagert wird, der eine einzigartige und gruselige Atmosphäre erzeugt, dann ein sehr schwaches PipBoy-Licht und fertig ist der Grusel-Shooter ;)

Boïndil
29.01.2011, 08:22
So, das hier läuft:


scn HardcoreShooterGameplayScript

short IMOverlayCounter

Begin GameMode

; Auto-Heilung mit Stimpacks
If Player.GetHealthPercentage <= 0.35 && Player.IsInCombat == 1
If Player.GetItemCount Stimpak > 0
Player.CastImmediateOnSelf Stimpak
Player.RemoveItem Stimpak 1 1
EndIf
EndIf

; Meldung Stimpaks ausgegangen
If Player.GetItemCount Stimpak == 0
ShowMessage BerserkerViewNoStimpacks
EndIf

;Visuelle Blut-Effekte
If Player.GetHealthPercentage <= 0.45
If IMOverlayCounter < 4
IMod BerserkerViewISFX
set IMOverlayCounter to IMOverlayCounter + 1
EndIf
ElseIf Player.GetHealthPercentage <= 0.25
If IMOverlayCounter < 4
IMod BerserkerViewISFX
set IMOverlayCounter to IMOverlayCounter + 1
EndIf
ElseIf Player.GetHealthPercentage <= 0.05
If IMOverlayCounter < 4
IMod BerserkerViewISFX
set IMOverlayCounter to IMOverlayCounter + 1
EndIf
Else
RIMod BerserkerViewISFX
set IMOverlayCounter to 0
EndIf
End

Alles in einem Script vereint, statt verteilt über verschiedene Ebenen.
Ist noch abzuklären, ob es einen DoOnce für die Message benötigt, wenn die Stimpack-Anzahl auf unter 1 fällt.

Und wie ich aus dem Script der Powerrüstung entnehmen konnte, darf man sehr wohl Ingestibles mit CastImmediateOnSelf aufrufen. Diese sind ja schlussendlich auch nur eine Liste von Effekten.

Dies hier hat jetzt den Vorteil, dass die Wirkung der Auto-Heilung vollständig von deinen Medizin-Kenntnissen und dem Hardcore-Modus abhängig ist. Man hat ausserhalb des Kampfes weiterhin die Möglichkeit, sich mit anderen Medikamenten zu heilen und auch Arzttaschen und Doktorbesuche behalten ihren Sinn.
Ich finde, das ist ein guter Kompromiss zwischen Shooter und Rollenspiel.
Man stirbt durch das nicht weniger, wie ich in Feldtests mit Banditen erfahren konnte.

Misantrooper
29.01.2011, 09:34
ich würd um die message aufjeden fall ein doOnce setzen, da "begin gamemode" mehrfach in der sekunde prüft ob die bedingung erfüllt ist. wenn du es so stehen lässt, wird die meldung solange aufploppen bis du wieder stimpaks am mann hast.
wenn es nur ne displaymeldung ist, könnte man damit leben, aber wenn es als popup gedacht ist, naja, dann wird spielen unmöglich

Boïndil
29.01.2011, 11:17
Genau deswegen meine verbessertes Script, funktioniert jetzt aus meiner Sicht genau so, wie es sollte:


scn HardcoreShooterGameplayScript

short IMOverlayCounter
short MSGCounter

Begin GameMode
; MSG Reset
If Player.GetItemCount Stimpak > 0
Set MSGCounter to 0
EndIf

; Auto-Heilung mit Stimpacks
If Player.HasMagicEffect RestoreHealthStimpak == 0
If Player.GetHealthPercentage <= 0.40 && Player.IsInCombat == 1
; Stimpaks verabreichen
If Player.GetItemCount Stimpak > 0
Player.CastImmediateOnSelf HardcoreShooterStimpak
Player.RemoveItem Stimpak 1 1
EndIf
; Meldung Stimpaks ausgegangen
If Player.GetItemCount Stimpak == 0 && MSGCounter == 0
ShowMessage BerserkerViewNoStimpacks
Set MSGCounter to 1
EndIf
EndIf
EndIf

; Visuelle Blut-Effekte
If Player.GetHealthPercentage <= 0.50
If IMOverlayCounter == 0
If Player.IsInInterior == 1 || (GetCurrentTime > 5.5 && GetCurrentTime < 18.5)
IMod BerserkerViewLightISFX1
Else
IMod BerserkerViewDarkISFX1
EndIf
Set IMOverlayCounter to IMOverlayCounter + 1
EndIf
ElseIf Player.GetHealthPercentage <= 0.30
If IMOverlayCounter == 1
If Player.IsInInterior == 1 || (GetCurrentTime > 5.5 && GetCurrentTime < 18.5)
IMod BerserkerViewLightISFX2
Else
IMod BerserkerViewDarkISFX2
EndIf
Set IMOverlayCounter to IMOverlayCounter + 1
EndIf
ElseIf Player.GetHealthPercentage <= 0.10
If IMOverlayCounter == 2
If Player.IsInInterior == 1 || (GetCurrentTime > 5.5 && GetCurrentTime < 18.5)
IMod BerserkerViewLightISFX3
Else
IMod BerserkerViewDarkISFX3
EndIf
Set IMOverlayCounter to IMOverlayCounter + 1
EndIf
Else
RIMod BerserkerViewDarkISFX1
RIMod BerserkerViewDarkISFX2
RIMod BerserkerViewDarkISFX3
RIMod BerserkerViewLightISFX1
RIMod BerserkerViewLightISFX2
RIMod BerserkerViewLightISFX3
Set IMOverlayCounter to 0
EndIf
End

Das hier verhindert jetzt auch, dass Stimpaks verbraucht werden, wenn der Stimpak-Effekt am Wirken ist.
Ausserdem kommt jetzt die Message ausschliesslich im Gefecht, nicht, wenn man Stimpaks wegschmeisst oder verkauft.

Misantrooper
29.01.2011, 11:30
die abfrage nach "isinInterior" würd ich noch um die option:

Player.GetInWorldspace Lucky38World == 0

erweitern. das penthouse im lucky38 ist ein worldspace, und keine interiorzelle
musste ich bei meiner automatischen nachtsicht in der rnk-nachtspäherrüstung feststellen.
und dort kann es ja unter umständen auch zu einem kampf kommen, wenn man nicht unbedingt mit impuls-waffen gesegnet ist

Boïndil
29.01.2011, 11:50
Ich glaube, diesen Spezialfall kann man unberücksichtig lassen.
Es geht nur darum, dass die ImageSpaceModifier eine andere Wirkung bei Dunkelheit oder Helligkeit aufweisen, d.h. am Tag muss er dunkler und intensiver sein, was in der Dunkelheit zu stark wäre.