Construction Set Brauche Dynamit!

Beolo

Abenteurer
Hallo Zusammen,

wie im Titel schon angedeutet, soll was in die Luft fliegen. Hintergrund ist der, der Spieler kann ein Höhlensystem nur wieder verlassen, wenn er ein paar Steine beiseite schafft, die den Weg blockieren.
Dazu habe ich mir folgendes ausgedacht, vor den Steinen habe ich ein kleines Fass platziert, in dieses der Spieler Dynamit in Pulverform legt. Dieses Pulver allein bewirkt erstmal überhaupt nichts, sondern kann nur mit einem speziellen Initialzündpulver zur Explosion gebracht werden. Das heisst, Dynamit und Zündpulver im gleichen Container... Bumm, also sollte der gleichzeitige Transport beider Substanzen tunlichst vermieden werden. Der Spieler kann beide Pulversorten im Höhlensystem finden, um aber die Sache noch etwas interessanter zu gestalten, ist dieses Zündpulver extrem instabil und verträgt keine großen Erschütterungen.

Mein Problem ist, wie gehe ich die Sache am Besten an. Zum Sprengen der Steine könnte ich vielleicht ein Skript auf das Fass legen, welches ständig überprüft ob beide Substanzen vorhanden sind und dann nach ein paar Sekunden die Explosion auslöst. Doch wie kann ich eine gewaltige Explosion optisch erzeugen? Leider hatte ich bisher noch nie einen Zauber bzw. einen Zaubereffekt erstellt und nach dem öffnen eines Shadereffects wurde ich von der Unmenge an Einstellmöglichkeiten geradezu erschlagen.

Wer kennt sich mit diesen Zauber und Effectshaders aus und kann mir sagen wie ich eine gewaltige Explossion erstellen kann? Vielleicht gibt es auch schon was Vorgefertigtes, welches ich verwenden könnte. Bin wirklich für jede Hilfe dankbar.
Die Sache mit dem Transport des Zündpulvers ist erstmal zweitrangig, vielleicht kann ich da mittels Skript die Sprunghöhe des Spielers auswerten und dann einen Feuerball o.ä. auslösen.

Viele Grüsse
Gert
 
Zuletzt bearbeitet:
Hab mir gerade mal die Spells angeschaut, alle die mit Explosion oder Feuer zu tun haben, beinhalten als Effekt "Feuerschaden". Wenn ich diesen wiederum öffne sind aber Einstellungen für die "Visuals Effect" nicht auswählbar. Irgendwo muß doch einstellbar sein welcher visuelle Effekt beim Zauberspruch abgespielt werden soll; und brauche ich überhaupt einen Spell, denn meine Statiksteine werden auch mit dem gewaltigsten Zauber nicht zu beeindrucken sein.
Eigentlich benötige ich nur einen visuellen Effekt, der das Entfernen der Steine verdeckt. Wobei ich mal hoffe das ich die Steine mit einen Disable Befehl zum verschwinden bringe, habs noch nie ausprobiert.
Was mir nicht ganz klar ist, muß ich für meine Explosion einen Spell erstellen, oder genügt es einen EffectShader in einem Skript aufzurufen und wenn ja, welcher Shader wäre dann geeignet? Einen neuen Shadereffekt zu erstellen, scheint nicht gerade einfache Hausmannskost zu sein. :D
 
Hi,
schnell mal getestet: ein Faß (Container-CGBarrel) hingestellt und mit diesem Skript versehen:
Code:
Scriptname apoExplosiveBarrelScript
ref myself
ref idiot
begin OnActivate
    Set myself to GetSelf
    Set idiot to GetActionRef
    Message "Kaboooom - you are dead!" 3
    PlaySound ENDTempleDagon
    myself.PlayMagicShaderVisuals effectFireDragon 6
    ; skipped: kill idiot
    ; Activate
end
Um das von Aussen zu steuern: das Pulverfass muss eine Reference-ID bekommen, diese muss eine "Persistant Reference" sein (Haken setzen!) und dann wie von Zerlix vorgeschlagen: ReferenceID.pms <your effect here>.

Grüße,
Andreas.
 
Zuletzt bearbeitet:
Vielen Dank für Euere Antworten.
Es ist schon erstaunlich, jedesmal wenn ich glaube mir allen Seiten des Wikis schon angeschaut zu haben, werde ich eines Besseren belehrt. Die Effekt Liste war mir noch gänzlich unbekannt.
Die Ref-Variablen Myself und Idiot scheinen geradezu für mich gemacht worden zu sein, :lol: ist mir doch bis heute nicht ganz klar was genau in dieser Variablenart abgelegt wird. Wird in dieser vielleicht die RefID abgelegt, also in Myself die des Objekts auf dem das Skript liegt und in Idiot die ID des Actors, also in diesem Fall die PlayerRef?

Ich hab vor die Steinbrocken, die dem Spieler den Weg versperren ein Fass gestellt, in dieses sollen dann die beiden Substanzen gelegt werden. Eventuell könnte ich das "Dynamit" schon vorher reinlegen, dann müsste nur noch das Zündpulver abgefragt werden. Wollte mir gerade ein Skript basteln, doch musste leider feststellen, daß ich keine Ahnung habe wie ich das Platzieren eines Items in einem Container abfrage. Das Ganze passiert ja im MenuMode, idealerweise sollte der Inhalts des Containers nach dem Schliessen auf das Zündpulver überprüft werden und falls vorhanden einen Timer starten der nach ein paar Sekunden die Explosion auslöst. Sprich, den Shader, den Sound, die Steine und das Fass disablen etc.

Wie müsste so ein Skript aufgebaut werden? Das einzige was mir einfällt ist ein "OnAdd" Block. Könnte das hier funktionieren?

Code:
scn DynamitFass

short Explosion
float Timer

Begin OnAdd

   if ( IsActionRef == Player ) && ( GetItemCount Dynamit > 0 ) && ( GetItemCount Zuendpulver > 0 )
       Set Explosion 1

   endif
end

; ########################################

Begin GameMode

     if ( Explosion == 1 ) 
          set timer to ( timer + GetSecondsPassed )
      
            if ( Timer > 5 )
                PlayMagicShaderVisuals xxxShaderID 5
                PlaySound ExplosionSoundID
                SteinHindernisRef.Disable
                Disable
                FassKaputtRef.Enable
            endif
    
     endif
End
 
Brandanus schrieb:
Hi,
schnell mal getestet: ein Faß (Container-CGBarrel) hingestellt und mit diesem Skript versehen:
Code:
Scriptname apoExplosiveBarrelScript
ref myself
ref idiot
begin OnActivate
    Set myself to GetSelf
    Set idiot to GetActionRef
    Message "[u]Kaboooom - you are dead![/u]" 3
    PlaySound ENDTempleDagon
    myself.PlayMagicShaderVisuals effectFireDragon 6
    ; skipped: kill idiot
    ; Activate
end
Um das von Aussen zu steuern: das Pulverfass muss eine Reference-ID bekommen, diese muss eine "Persistant Reference" sein (Haken setzen!) und dann wie von Zerlix vorgeschlagen: ReferenceID.pms <your effect here>.

Grüße,
Andreas.
Warum schreibt ihr eigentlich Alles auf Englisch, selbst dass was ihr nicht auf Englisch schreiben müsst.??

:D
 
Auf den ersten Blick hätte ich ja gesagt, aber beim näheren betrachten glaube ich nicht das das so funktioniert.

Code:
Begin OnAdd [Container]

end
Ich glaube der Block wird nur ausgeführt wenn du dein Fass in eine Container legst. Das kann eine Kiste oder auch das Inventory vom Player sein.

Warum machst du es nicht einfach so, das sollte wie gewünscht funktionieren.

Code:
Begin GameMode
	if  (GetItemCount Dynamit > 0) && ( GetItemCount Zuendpulver > 0 )
    	      set timer to ( timer + GetSecondsPassed )
              if ( Timer > 5 )
        	   PlayMagicShaderVisuals xxxShaderID 5
                   PlaySound ExplosionSoundID
                   SteinHindernisRef.Disable
                   Disable
                   FassKaputtRef.Enable
              endif
        endif
End
 
  • Like
Reaktionen: Beolo
Zerlix schrieb:
Code:
Begin GameMode
    if  (GetItemCount Dynamit > 0) && ( GetItemCount Zuendpulver > 0 )
              set timer to ( timer + GetSecondsPassed )
              if ( Timer > 5 )
               PlayMagicShaderVisuals xxxShaderID 5
                   PlaySound ExplosionSoundID
                   SteinHindernisRef.Disable
                   Disable
                   FassKaputtRef.Enable
              endif
        endif
End
ich denke auch, dass das so funktionieren sollte. Ich hatte vorhin versucht, das ganze etwas effektvoller zu machen und den player zurückzuschleudern. Leider habe ich nicht mehr geschafft, als ihn mit PlayGroup FastBackward rückwärts laufen zu lassen.
Leider läuft die Animation "Stagger" nur dann, wenn der Spieler eine Waffe gezogen hat. Ein "player.SetAlert 1", das einen NPC eine Waffe ziehen läßt, hat auf den Spieler leider keinen Effekt (an der Konsole nicht und in meinem Skript auch nicht). Ich habe es auch mit idiot, bzw."player.ForceAV Fatigue 0" und "SetUnconscious 1" probiert...nix, der Spieler fällt nicht mal um!
Ich habe zusätzlich einen Schadenszauber eingebaut (cast TRAPFireDamageSelf05 myself), und erst als der mich (also den Spieler) getötet hatte, kam der gewünschte Effekt "zurückschleudern".
Hm...weiss jemand, wie man diesen "Effekt"/diese Animation erzwingen kann, ohne dabei den Spieler zu töten? Im Prinzip wird die auch ausgelöst, wenn man eine "ForceAttack" mit einer Waffe reingewürgt bekommt.

Grüße,
Andreas.
 
Danke für den Tipp, Zerlix. Stimmt, der OnAdd Block bezieht sich auf das Fass und nicht auf die Items. Das hätte mich doch glatt wieder ein paar graue Haare gekostet. :)
Ich teste gleich mal deine Variante.

Eine andere Frage, beim Starten mäkelt das CS am fehlenden Effekt bei meinen erstellten Pulvern herum. Für mein Dynamit habe ich das Item "Frostsalze" kopiert und alle Effekte gelöscht, hat das Auswirkungen im Spiel, oder kommt die Fehlermeldung nur im CS?

Gibt es in Oblivion so einen Wackeleffekt, in Neverwinter konnte man so einen Effekt bei Steinschlag, Explosionen o.ä. bemischen. Würde sich bei meiner Explosion auch gut machen, kann mich jetzt aber nicht erinnern, so etwas in Oblivion schon gesehen zu haben.

@Frontschwein: Hast ja recht, immer diese verfluchten Anglizismen. :mad: :lol:
 
Beolo schrieb:
Gibt es in Oblivion so einen Wackeleffekt, in Neverwinter konnte man so einen Effekt bei Steinschlag, Explosionen o.ä. bemischen. Würde sich bei meiner Explosion auch gut machen, kann mich jetzt aber nicht erinnern, so etwas in Oblivion schon gesehen zu haben.
yep, hatte ich gerade eingebaut:
idiot.TriggerHitShader 2

@Frontschwein: Hast ja recht, immer diese verfluchten Anglizismen.
ähm...was ist an _komplett_ englisch kommentierten Skripten jetzt ein "Anglizismus"? Ich kommentiere _immer_ englisch und Debug-Messages sind auch englisch (berufliche Angewohnheit). Das macht es leichter, Skript-Schnipsel am offiziellen Forum zu diskutieren.

Grüße,
Andreas.
 
Das war jetzt überhaupt nicht böse gemeint, wenn ich hier jemandem auf den Schlips getreten sein sollte, entschuldige ich mich dafür.
Ich finde es bloß immer komisch, wie die Leute, selbst wenn es um ein Deutsches Plugin geht, dei Id's in Englisch schreiben, die Script-Kommentare in Englisch schreiben, und am Ende kommt dann so ein Mischmasch aus Englischer Sprache und deutscher Gramatik raus:-D

Ihr habt schon Recht, wahrscheinlich hab ich en bisschen gespammt, sorry:oops:
 
Frontschwein schrieb:
Das war jetzt überhaupt nicht böse gemeint, wenn ich hier jemandem auf den Schlips getreten sein sollte, entschuldige ich mich dafür.
nee, so war das nicht gemeint :) . Ich meine "Set Ausdauer to player.GetAV Fatigue" liest sich letzen Endes auch irgendwie komisch...
 
Vielen Dank Andreas, das mit dem TriggerHitShader wusste ich noch nicht. Aber stimmt, die Explosion ist für den Spieler völlig ungefährlich, nicht gerade Realismus in Reinformat. Vielleicht könnte man eine bestimmte Distanz zum Explosionsherd überwachen und sollte sich der Spieler, zum Zeitpunkt der Explosion noch in diesem Umkreis aufhalten, wird er mit Feuerbällen oder ähnlichem bedacht.

Übrigens, mein Spruch mit den "verfluchten Anglizismen" war überhaupt nicht auf Dich bezogen. Er war ironisch gemeint und ich hatte da eher Werbesendungen, Einkaufstrassen und dergleichen im Sinn. Wobei ich mich frage was die Generation meiner Eltern noch verstehen von diesem Kauderwelsch, aber vielleicht ist es auch ein Segen dies gerade nicht mehr zu verstehen. :D

Klar, in einem Forum in dem über ein englisches Programm diskutiert wird, würde der Verzicht der englischen Begiffe sofort zum Chaos führen. Stell dir nur mal eine eingedeutschte Skript Syntax vor.

Gruß, Gert
 
Hi,
ich hatte der Einfachheit halber einen Zauber mit Radius auf das Faß gezaubert ("cast TRAPFireDamageSelf05 myself", wobei myself die Referenz auf das Faß ist). Da in meinem Test das Faß sofort explodiert, steht der player direkt daneben und bekommt den Schaden ab. Erfolgt die Explosion verzögert, kann man natürlich weglaufen.
Das Zurückschleudern habe ich nicht hinbekommen, aber mit "player.ModAV Fatigue -9999" bricht der Spieler zusammen (und die Kamera schwenkt auf "3rd-person"), und nach Ablauf des Timers habe ich das mit "player.ModAV Fatigue 9999" zurückgesetzt . Dann steht der Spieler automatisch wieder auf. Die Ausdauer muß im Skript zurückgesetzt werden, da sich die Ausdauer nicht von alleine regeneriert, wenn sie mit ModAV gesenkt wurde.

Die Entfernung des Faßes (=Explosionsherdes) zum Spieler kann man recht leicht herausbekommen:
Code:
Set distance to Getdistance Player
Man könnte jetzt z.B. prüfen, ob "distance < 300" ist, und dann den Spieler zusammenbrechen lassen, und ihm einen Feuerball reinwürgen.

Die Animationen, die ich erzwungen habe, funktionieren ohnehin nur dann, wenn man in "3rd-person" ist. In "1st-person" hat "player.playgroup" anscheinend gar keinen Effekt.

Grüße,
Andreas.
 
Zuletzt bearbeitet:
Hallo,

jetzt hat mich doch dieser Explosionssound stundenlang aufgehalten. Erst habe ich bei den FX-Sounds was Brauchbares gesucht, doch diese Minenexplosion war das Einzige was ich entdeckte, doch da hören sich meine Geräusche beim Geschirrspülen besser an. Gut, ewig im Netz gesucht und festgestellt, entweder richtig tief in die Tasche greifen, oder sich mit verrauschten 20k Waves begnügen. Also da produzier ich mit Mikro und Bohnensuppe aber die besseren Explosionen. :lol: Bin dann doch noch zu meinem Sound gekommen und zwar im Ordner einer Flugsimulation auf meiner Platte.

Habe gerade versucht das Skript zu erweitern, bestimmt sind noch ein paar Fehler drinn, aber könnte es so in etwa funktionieren? Mit meinem Skriptverständnis produziere ich öfter mal Kot anstelle von Code. :-D

Code:
Scn DynamitFass

short Zufall
float Timer

Begin GameMode

    if  (GetItemCount Dynamit > 0) && ( GetItemCount Zuendpulver > 0 )
         Set Timer to ( Timer + GetSecondsPassed )
         Set Zufall to GetRandomPercent

               if ( Timer == 5 )
        	   PlayMagicShaderVisuals 00Explosion 4
                   PlaySound ExplosionSoundID
                   TriggerHitShader 2
                   SteinHindernisRef.Disable
                   Disable
                   FassKaputtRef.Enable

               elseif ( Timer > 5 ) && ( Timer < 8 ) && ( GetDistance Player < 512 )
                   Cast TRAPFireDamageSelf05 Player
                   Player.ModAV Fatigue -9999
                   
               elseif ( Timer < 10 ) && ( Zufall >= 50 )
                   Player.ModAV Fatigue 9999

               elseif ( Timer < 10 ) && ( Zufall < 50 )
                   Kill Player 
                   
               endif

    endif
End

Viele Grüsse
Gert
 
Hi,
ich fand als Sound "ENDTempleDagon" ganz passend.
Gut, ich habe das Skript nach meinem persönlichen Stil und meiner Interpretation umgeschrieben.
Wichtig: wenn die Zutaten beide im Faß sind, brennt die Lunte (läuft der Timer), und die Gegenstände können nicht mehr entfernt werden. Wenn Du möchtest, dass man die Explosion abbrechen kann, musst Du den Block "IsActivated==1" entsprechend ändern: vor dem "if (timer >= 5)" einfach nochmal prüfen und wenn nicht mehr beides da ist, dann isActivated auf 0 und Timer auf 0 setzen.
Das Skript ist bezüglich der Laufzeit evtl. etwas besser: es werden keine komplexen Eingangsbedingungen geprüft. Dann habe ich die einzelnen Phasen voneinander getrennt und und jeder Effekt am Ende der Phase kann so wirklich nur nur 1x auftreten (und ich behaupte, es sei übersichtlicher...). Selbstverständlich habe ich das Skript nicht getestet :D . Falls also was anderes explodiert...
Ich ordne Blöcke immer "rückwärts" an, damit nicht mehr als ein Block oder gar alle Blöcke innerhalb eines Frames durchlaufen werden, das ist hier evtl. überflüssig.
Timer sind floats, die sollte man niemals auf "==" prüfen. Das geht meistens schief, da z.B. Timer 4.9999 und im nächsten Durchlauf Timer 5.0001 beide nicht 5.0000 sind.

Code:
Scn DynamitFass
short Zufall
float Timer
short isActivated
float Distance

Begin GameMode
    ; Explosion ist vorbei
    if (isActivated == 2)
        Set Timer to ( Timer + GetSecondsPassed )
        if ( Timer >= 8 )
               if (Distance < 512)
                   Player.ModAV Fatigue 9999
                   if (Zufall < 50)
                     Kill Player
                   endif
               endif
               Set isActivated to 3
               Disable
               ; "disable" stoppt auch die Skriptausführung!
        endif
    endif
    ; Faß explodiert
    if (isActivated == 1)
        Set Timer to ( Timer + GetSecondsPassed )
        if ( Timer >= 5 )
            Set Distance to Getdistance Player
            Set Zufall to GetRandomPercent
            PlayMagicShaderVisuals 00Explosion 4
            PlaySound ENDTempleDagon
            Player.TriggerHitShader 3
            SteinHindernisRef.Disable
            FassKaputtRef.Enable
            if (Distance < 512)
                Cast TRAPFireDamageSelf05 Player
                Player.ModAV Fatigue -9999
            endif
            Set isActivated to 2
        endif
    endif
    ; Prüfen und ggf. Lunte entzünden
    if (isActivated == 0)
        if  (GetItemCount Dynamit > 0) && ( GetItemCount Zuendpulver > 0 )
            ; ab jetzt kann man das Faß nicht mehr benutzen:
            SetDestroyed 1
            Set IsActivated to 1
            Message "Die Lunte brennt.....",4
        endif
    endif
End

Grüße,
Andreas.
 
Zuletzt bearbeitet: