Construction Set Fernzauber im Wasser ermöglichen

Fellan

Freund des Hauses
Ich bin gerade dabei, einen Zitteraal zu erstellen. Der soll natürlich einen Schock-Zauber von sich geben. Einen Berühren-Zauber fand ich aber zu unspektakulär, der Fisch soll seine Gegner also auch aus der Distanz mit dem Zauber treffen können.

Da Fische sich aber nunmal im Wasser aufhalten und bei Oblivion keine Fernzauber im Wasser sind möchte ich gerne wissen, wie ich es dem Fisch ermögliche, den Distanzzauber trotzdem zu wirken. Ist das überhaupt möglich? Und wie kann ich die Distanz des Zaubers auf einen bestimmten Wert beschränken?

Wie lasse ich den Fisch den Zauber, wenn er denn erstmal funktioniert, dann benutzen? Sobald ein Feind in der Nähe ist, soll er diesen zwar auch "normal" angreifen, aber auch sehr häufig den Zauber einsetzen. Während eines Kampfes soll er den mindestens ein Mal verwenden. Aber wie geht das? Beim Kampfverhalten "DefaultSlaughterfish" werden doch wahrscheinlich keine Zauber benutzt?
 
Hmmm, ich selber bezweifle, dass es möglich ist, dem Fisch einen Zauber zu geben. Ich denke, es ist bei allen Kreaturen ausgeschlossen. Jedenfalls fällt mir gerade keine Kreatur ein, die jemals einen Zauber gewirkt hat (außer ein Lich....). Den soweit ich weiß brauchen Zauber Animationen... Deshalb würde ich es einfach mit dem entsprechenden Script probieren, was man in etwa so machen könnte.:
Code:
scn FNZitterAalSCRIPT

short ready
float timer

Begin GameMode

If GetDistance player < 700 && ready == 0
Cast [SpellID] target
set timer to 3
set ready to 1
Endif

If timer <= 0 && ready == 1
set ready to 0
Endif

If timer >= 0 && ready == 1
set timer to timer -getsecondspassed
Endif

End

Ganz sicher bin ich mir nicht.
Ist wahrscheinlich nicht das, was du dir eigentlich vorgestellt hast, aber nur das oder etwas ähnliches käme mir in den Sinn. :?

MfG Gildur
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fellan
ö_ö
Wieso gibst du einer Reference ("target") eine Zahl ("Getplayablerace")? Wie soll deiner Meinung nach der Zitteraal eine 0 oder 1 angreifen?

Nun ja, ich hab keine Ahnung, wie das mit dem "cast"-Befehl ist, also ob da auch die Unterwasserbeschränkung ist oder nicht.

Nun, wenn wir aber davon ausgehen, dass allein der Spieler (mal wieder) das Opfer sein wird, kann ja folgendes Skript nützen:

Code:
scn 000Zitteraalscript

short Doonce
Begin Gamemode

if GetDistance player < (keineAhnungwasfüreinenmaßstabdiebenutzen) && DoOnce != 1
player.addspell Zitterallspell (den dann auf, sagen wir mal, 3-5 Schockschaden pro Sekunde und Dauer 10-20 Sekunden stellen; den Spell außerdem als "Eigenschaft" definieren)
SetDoOnce to 1

End
Damit wird der Spieler für die ungefähre Dauer des Kampfes elektrisiert.
 
  • Like
Reaktionen: Fellan
So, ich habe den Script nich ein mal umgeschireben.

@ Oberscht: Ich hätte ja auch den player genommen. Jedoch sagte Fellan, dass der Zauber auf jeden Gegner gezaubert werden soll.
Mit dem "GetIsPlayableRace", da merke ich gerade, dass es schwachsinn ist^^
Danke für die Korrektur.
Ich ändere es oben im Script

MfG Gildur
 
Zuletzt bearbeitet:
Hmmm, ich selber bezweifle, dass es möglich ist, dem Fisch einen Zauber zu geben. Ich denke, es ist bei allen Kreaturen ausgeschlossen. Jedenfalls fällt mir gerade keine Kreatur ein, die jemals einen Zauber gewirkt hat (außer ein Lich....).

doch es ist möglich
ich hab des mal mit nem wolf probiert und der hat mich dann "geblitzt"


@Edit: mein 400 hunderster beitrag :-D
 
  • Like
Reaktionen: Fellan
Das ist natürlich ein Ansatz. Würde denn der Blitz vom Aal auf den Spieler "fliegen"? Das ganze soll ja nicht einfach nur Lebenspunkte nehmen sondern auch nach etwas aussehen.

Dein Timer-Script war aber falsch, ich habe den mal abgeändert. Ist zwar ungetestet, dürfte aber funktionieren.

Code:
scn FNZitterAalSCRIPT

short init
float timer

begin GameMode

if GetDistance Player < 700 && init == 0
   Cast [SpellID] target
   set timer to 3
   set init to 1
endif

if init == 1
   set timer to 5
   set init to 2
elseif init == 2
   if timer > 0
      set timer to timer - GetSecondsPassed
   else
      set init to 0
   endif
endif

end

Das dürfte funktionieren. Da bleibt aber immer noch meine Frage: Würde der Blitz so vom Aal auf den Spieler "fliegen", es also so aussehen, als würde der Aal angreifen? Der Aal soll mit dem Blitz außerdem nicht nur den Spieler, sondern auch andere Fische angreifen, oder wenn er z.B. von einem Schlachterfisch angegriffen wird, soll er sich mit dem Blitz wehren.
 
Ährmm, was ist bitte schön an meinem Script falsch?
Alle 3 Sekunden feuert der einen Blitz ab.
Dagegen würde ich mir deinen noch mal ganz genau angucken...
Wozu ist in deinem Script der Timer?
Außerdem setzt der Script die short init immer wieder auf 0, bis du in den Radius von 700 kommst:
if init == 1
[...]
elseif init == 2
[...]
else
set init to 0
[...]
Die short init ist zwar schon zu Beginn 0, doch das heißt nicht, dass er dann mit dem Wert-setzen auf 0 aufhört...
Ich kann mich aber auch irren :?

MfG Gildur
 
Zuletzt bearbeitet:
Jop, der Script von dir (Fellan) könnte auch so aussehen:
Code:
scn FNZitterAalSCRIPT

begin GameMode

if GetDistance Player < 700 && init == 0
   Cast [SpellID] target
   set timer to 3
endif
Dann musst du nicht so viel schreiben ^^
Wahrscheinlich has du auch nur etwas übersehen oder so. Kann ja jedem mal passieren. ;)

MfG Gildur
 
Mein Script müsste alle 3 Sekunden einen Blitz abfeuern, solange sich der Spieler im Radius befindet. Hier mal mit Erkläring:

Code:
scn FNZitterAalSCRIPT

short init
float timer

begin GameMode

if GetDistance Player < 700 && init == 0 [I];init == 0 MUSS gegeben sein![/I]
   Cast [SpellID] target
   set init to 1 [I];damit das nicht sofort, sondern erst in fünf Sekunden wieder passiert[/I]
endif

if init == 1
   set timer to 5
   set init to 2 [I];der Timer wird nur ein Mal gesetzt[/I]
elseif init == 2
   if timer > 0
      set timer to timer - GetSecondsPassed
   else
      set init to 0 [I];init wird wieder auf 0 gesetzt, damit das ganze wieder funktionieren kann[/I]
   endif
endif

end

Das müsste absolut problemlos funktionieren, die Frage ist ja nur, ob der Aal dann den Blitz wirklich auf den Spieler "wirft" oder ob der Spieler einfach so Schaden erleidet?
 
Wie gesagt, das würde nicht klappen:
[...]
if init == 1
set timer to 5
set init to 2 ;der Timer wird nur ein Mal gesetzt
elseif init == 2
if timer > 0
set timer to timer - GetSecondsPassed
else
set init to 0 ;init wird wieder auf 0 gesetzt, damit das ganze wieder funktionieren kann
endif
endif
Das dick gedruckte trifft doch niemals ein.
Das heißt übersetzt:
;-----------------------
Wenn init ==1
[...]
wenn sonst init == 2
[...]
sonst
set init to 0
[...]
;-----------------------
Siehst du, was ich meine? die init ist niemals 3 oder größer oder so was. Nur wenn die Init nicht 1 oder 2 ist, dann wird die init auf 0 gesetzt.
Deswegen wird der Aal den Zauber nie noch mal abfeuern. Nur ein mal.
Sollte ich falsch liegen korrigiert mich bitte.

MfG Gildur
 
Zuletzt bearbeitet:
Du kannst es auch einfach so machen, dass der Aal wellenförmig um sich herum Schockwellen verteilt... ein Zitteraal kann die Stromrichtung ja auch nicht bestimmen.
Ich weiß grad nich, wie das Skript dafür heißt, aber du kannst einen Berührungszauber mit der entsprechenden Reichweite machen, die du willst und dem Aal am besten 250% Schockresistenz oder so verpassen (250, weil der Spieler die Resistenz ja mit Anfälligkeit und so verringern kann, also am besten noch weit über 250 setzten).
Das Skript bewirkt dann, dass eiN Activator direkt auf die Position des Aals gesetzt wird, der dann diesen Berührungszauber auf den Aal castet. Dem macht das nix aus, aber alle anderen Wesen in einem bestimmten Umkreis nehmen Schaden.

Das komplizierteste wird sein, dass nur Wesen im Wasser getroffen werden. Vllt kann man eine Abfrage für den Z-Wert der Opfer einstellen...

Aber: Das mit dem optischen Effekt musst du ausprobieren, bei dem Berührungszauber siehst du vllt was...
 
  • Like
Reaktionen: Fellan
Ähm. Nö. Kein Berührungszauber von nem Activator. Einfach Schockzauber auf Selbst mit soundsoviel Umkreis. Den kann er dann selbst casten. Eigentlich sogar ne gute Idee.
 
  • Like
Reaktionen: Fellan
Das ist eine gute Idee, das werde ich ausprobieren.

Wo wir gerade bei Fischen sind: Ich habe einige neue Fisch-Meshes eingebaut. Die schwimmen zwar friedlich umher, wie sie sollen, leider sind die, die in Strandnähe platziert wurden auch manchmal am Strand und hüpfen dann ins Landesinnere...wie kann ich das vermeiden?
 
Wie gesagt, das würde nicht klappen:
[...]
if init == 1
set timer to 5
set init to 2 ;der Timer wird nur ein Mal gesetzt
elseif init == 2
if timer > 0
set timer to timer - GetSecondsPassed
else
set init to 0 ;init wird wieder auf 0 gesetzt, damit das ganze wieder funktionieren kann
endif
endif
Das dick gedruckte trifft doch niemals ein.
Das heißt übersetzt:
;-----------------------
Wenn init ==1
[...]
wenn sonst init == 2
[...]
sonst
set init to 0
[...]
;-----------------------
Siehst du, was ich meine? die init ist niemals 3 oder größer oder so was. Nur wenn die Init nicht 1 oder 2 ist, dann wird die init auf 0 gesetzt.
Deswegen wird der Aal den Zauber nie noch mal abfeuern. Nur ein mal.
Sollte ich falsch liegen korrigiert mich bitte.

MfG Gildur


Das würde schon funktionieren; du musst eine unterscheidung zwischen if und elseif machen, mit if wird nähmlich eine neue Abfrage dazugefügt (quasi && , nur dass man bei der neuen Abfrage noch Unterscheidungen macht). Das else bezieht sich auf das timer > 0. Man könnte das alles zwar auch in einem If-Block machen, allerdings muss man dann bei 2 (oder mehr) Bedingungen eine Abfrage zusätzlich dazu schreiben; außerdem ist es auf die Art (mehrere If-Blöcke) imho übersichtlicher.
Ich schreib mal im Originalskript als Kommentar die Bedeutung der If/Elseif/Endif dazu (das Fettgeschriebene ist von mir).
Code:
scn FNZitterAalSCRIPT

short init
float timer

begin GameMode

if GetDistance Player < 700 && init == 0 [I];init == 0 MUSS gegeben sein![/I]
[B];neuer If-Block
;falls der Player näher als 700 Einheiten ist [I]und[/I] init null ist:[/B]
   Cast [SpellID] target
   set init to 1 [I];damit das nicht sofort, sondern erst in fünf Sekunden wieder passiert[/I]
endif
[B];If-Block Ende[/B]

if init == 1
[B];neuer If-Block
;falls init eins ist:[/B]
   set timer to 5
   set init to 2 [I];der Timer wird nur ein Mal gesetzt[/I]
elseif init == 2
[B];ansonsten, falls init zwei ist:[/B]
   if timer > 0
[B];neuer If-Block, zusätzlich(&&) zur Bedingung init == 2
;falls timer größer als null ist (init == 2 && timer < 0):[/B]
      set timer to timer - GetSecondsPassed
   else
[B];sonst (init == 2 && timer <= 0):[/B]
      set init to 0 [I];init wird wieder auf 0 gesetzt, damit das ganze wieder funktionieren kann[/I]
   endif
[B];If-Block Ende
;jetzt könnte noch ein allgemeiner Befehl kommen, der immer ausgeführt wird, falls init zwei ist.[/B]
endif
[B];If-Block Ende[/B]

end

Ist das soweit klar?
Oder bist du immer noch anderer Meinung?
 
Zuletzt bearbeitet: