Construction Set Der Scriptthread

nein, der punkt war beabsichtigt:
killfetzer schrieb:
. (Variablenaufruf)

Mit diesem Befehl kann man auf die lokalen Variablen eines anderen Scripts zugreifen. Auch hierzu mehr in Lektion 3.

Code:
set a to "Object_ID".state

set a to "Global_Script_ID".state

war allerdings nur eine idee, da ich fand, der pfeil sei falsch...
 
GetHealth ist aber keine Variable, sondern eine Funktion. Und Funktionen werden mit dem Pfeil aufgerufen.

Der Befhel müsste genauso aussehen, wie Kallor geschrieben. Allerdings würde ich eine andere Variante bevorzugen. Die Barriere sollte reference persistent sein, dann kannst du sie vom Gegner aus eleminieren:

Code:
if ( OnDeath == 1 )
  "my_barriere"->Disable
endif
 
Nun brauche ich eine Vorlage für diverse scripts, welche abfragen sollen, ob eine bestimmte kreatur einen bestimmten zauber gewirkt hat. Am liebsten wäre es mir, wenn ich das jeweils über das script der Kreatur regeln könnte(natürlich nur wenns das ganze nicht zu sehr verkompliziert). Also, wenn kreatur xx zauber yy wirkt soll zz passieren (zusätzlich zum zaubereffekt)
 
Zuletzt bearbeitet:
Hab nun herausgefunden, wie ich die Zauberabfrage machen muss, nämlich mit getspelleffects. nun habe ich aber zwei weitere Probleme:
Der Daedroth soll nach Wirken eines Zaubers sechs Minen beschwören, ähnlich wie die von der Verrückten in Gramfeste. Nun, die Minen haben fehlerhaftes Aussehen (rotes Schimmern, statt Dwemerdetektoren) und reagieren nicht auf mich. Ach ja und der explodespell des Daedroths geht immer noch nicht.

Script des daedroths:
Code:
begin boHe_ar_daedrothfire_script

short state

if ( state == 0 )
    if ( getdistance, player < 1024) ; füge den gewünschten Wert hier ein.
        ExplodeSpell, "BoHe_ar_daedroth_fireball"
        set state to 1
        set fight to 100
    endif
endif

if ( state == 1 )
    if ( "BoHe_ar_daedrothfire"-> GetSpellEffects "bohe_ar_daedrothspell" == 1 )
        set BoHe_ar_daedrothfire_spellcast to 1
        set state to 2
    endif
endif

if ( ondeath == 1 )
    "BoHe_ar_kraftfeld1"->disable
endif

end
BoHe_ar_daedrothfire_spellcast ist eine globale

script der minen:
Code:
begin bohe_feuermine01script

short state

if ( state == 0 )
    disable
    set state to 1
endif

if ( state == 1 )
    if ( bohe_ar_daedrothfire_spellcast == 1 )
        set state to 2
        enable
    endif
endif


if ( state == 2 )
    if ( getdistance, player < 512 )
        explodespell "bohe_ar_daedroth_fireball"
        set state to -1    
        disable
    endif
endif

end
Das war problem 1
Problem 2 ist, dass ich beim betreten der zelle diese fehlermeldung bekomm:
Creature "bohe_ar_erdwall00000000" has no animation groups.
Morrowind will crash!

Die bedeutung der fehlermeldung ist mir klar, nur soll die Erdwand (mesh: x\terrain_volcano.nif) eben gar keine animation sein, es ist nur ein überdimensionierter felsklotz, welcher den weg versperrt und nach dem "sterben" verschwinden soll. für die dies interessiert noch das script:
Code:
begin bohe_ar_erdwall_script

short state

if ( state == -1 )
    return
endif

if ( state == 0 )
    disable
    set state to 1
endif

if ( state == 1 )
    if ( "bohe_ar_ogrimearth_spellcast" == 1 )
        enable
        set state to 2
    endif
endif

if ( state == 2 )
    if ( ondeath == 1 )
        disable
        set state to -1
    endif
endif

end
Neues problem:
bisher hab ich die erdwand noch nicht zum einsatz kommen lassen, doch der ogrim, der sie beschwört (als schutzwand) macht auch nicht was er soll:
Ich hab ihm einen lastspruch (99999 Stärke, immer aktiv) gegeben, doch der läuft einfach weiter...

Noch eine frage: ist es möglich, dass ein objekt UNTER dem player erscheint.
Der Ogrim hat drei spezielle eigenschaften:

1. Er kann sich nicht bewegen (klappt nicht)
2. Er kann eine erdwand beschwören (kreatur mit volcanomesh, bringt fehlermeldung)
3. Nachdem er einen zauber gewirkt hat, soll alle 5 sekunden ein stalakmit unter dem player spawnen und nach oben fahren (aus dem boden raus) Z koordinate ist dabei immer die gleiche, x und y müssen denen des players entsprechen. Nach erscheien fahren die Stalakmiten nach oben (das bring ich hin, keine angst^^) und ausserdem sind sie mit einem HurtCollidingActor, 50 script ausgestattet (machbar?)
 
Zuletzt bearbeitet:
1. ExplodeSpell funktioniert nur mit Activatoren. Verwende die Funktion Cast. und gib als Ziel den aufrufenden Daedroth an.

2. Lege ihm statt dem Lastzauber ein Item mit gigantischem Gewicht ins Inventar und entferne es, wenn er stirbt, damit es der Spieler nicht findet.

3. Natürlich ist das möglich. Die Position des Spielers bekommst du mit "Player"->GetPos, X (bzw. Y und Z) raus. Damit kannst du die Startposition des Stalagmits berechnen und ihm mit PlaceItem an dieser Stelle platzieren. Dort übernimmt das ein Bewegungs- und Schadensscript auf dem Stalagmit selbst.
 
  • Like
Reaktionen: BoneHead
So, weiter gehts:
Ist es möglich, dem spieler sein gesamtes Inventar wegzunehmen und es in einem Container zu verstauen (dieser befindet sich in der gleichen Zelle wie der Spieler).
Alternativ auch:
Alles unequippen (wie mans auch immer schreibt) und Inventarmenü sperren.
 
Da muss ichs (leider) etwas genauer haben:
NAgenommen, ich hab einen schild ausgerüstet, der mir 50 Punkte Feder, 10 Punkte Stärke festigen und 5 Punkte Feuerschild gibt, also insgesamt +100 auf die tragkraft. Wenn ich jetzt RemoveEffects für diese beiden effekte mache, was passiert dann?
 
Hi, ich bräuchte 3 zusammenhängende Scripts für 2 NPCs und einen "unsichtbaren" Gegenstand. Das ganze sollte dann so funktionieren:

wenn NPC1 den unsichtbaren Gegenstand berührt (oder durch läuft) soll er von NPC2 angegriffen werden. es wird aber viele NPC1 und viele NPC2 geben und wenn nur einer der NPC1 den Gegenstand berührt, soll er von allen NPC2 angegriffen werden

ich wäre euch sehr dankbar wenn ihr mir helfen könntet
 
Ich denke der Grundaufbau müsste so aussehen:
Code:
start skirmish_script
 
if ( GetDistance, "NPC1" <= 100 ) ; du müsstest noch mit dem Wert rumprobieren was am besten passt
      "NPC2"->StartCombat, "NPC1" ; bewirkt, dass alle mit der ID "NPC2" alle "NPC1" angreifen
endif
Der Script müsste auf dem unsichtbaren Objekt liegen. Vielleicht müssen die verschiedenen NPC's auch noch verschiedene Fraktionen haben, musst du ausprobieren.

Wenn du willst, dass nur ein NPC1 engegriffen wird, musst du ihm eine seperate ID geben. Ansonsten ist es das gleiche.
 
Das wird nicht klappen. Du musst jedem NPC1 eine eigene ID geben und ihn Corpse Persist machen (glaub ich). Dann musst du auf jeden abfragen. So sähe es bei je zwei NPC1 und NPC2 aus:

Code:
begin scriptname

short state
;state ist 0 wenn keiner bekämpft wird, 1 wenn NPC1_01 bekämpft wird, 2 wenn NPC1_02 bekämpft wird usw.
if ( state == 0 )
    if ( GetDistance "NPC1_01" <= 100 ) ;ca. 1 Meter
        if ( "NPC1_01" -> OnDeath == 0 ) ;verhindert, dass das script auf Tote reagiert
            "NPC2_01" -> setfight 100
            "NPC2_01" -> startcombat "NPC1_01"
            "NPC2_02" -> setfight 100
            "NPC2_02" -> startcombat "NPC1_01"    
            set state to 1
        endif
    endif
    
    if ( GetDistance "NPC1_02" <= 100 ) ;ca. 1 Meter
        if ( "NPC1_02" -> OnDeath == 0 ) ;verhindert, dass das script auf Tote reagiert
            "NPC2_01" -> setfight 100
            "NPC2_01" -> startcombat "NPC1_02"
            "NPC2_02" -> setfight 100
            "NPC2_02" -> startcombat "NPC1_02"    
            set state to 2
        endif
    endif
elseif ( state == 1 )
    if ( "NPC1_01" -> OnDeath == 1 )
        "NPC2_01" -> setfight 30
        "NPC2_02" -> setfight 30
    endif
elseif ( state == 2 )
    if ( "NPC1_02" -> OnDeath == 1 )
        "NPC2_01" -> setfight 30
        "NPC2_02" -> setfight 30
    endif
endif

end
Möglicherweise können die NPC2 auch alle die gleiche ID haben, die NPC1 müssen jedoch Unique sein
 
Zuletzt bearbeitet:
Stimmt "SetFight" und "OnDeath" habe ich ganz vergessen... aber eine Verständnisfrage von mir: Warum müssen die NPC's alle unique sein?
Würde das Script nicht auf etwas reagieren, dass "mehrere" ist?

Denn wie ich das verstanden habe, will Cody doch nur, dass wenn NPC1 nahe kommt, NPC2 diese angreift. Da müsste theoretisch doch eine ID reichen.
 
Zuletzt bearbeitet von einem Moderator:
Ganz sicher bin ich mir auch nicht, aber ich glaube, das game würde crashen, wenn ein NPC zwei oder mehere NPC's angreifen will. Sicher bin ich mir aber nicht.
Ausserdem hab ICH Cody so verstanden, dass die NPC2's "Wächter" sind und die NPC1 "Angreifer".
Die Wächter ignorieren die Angreifer solange, bis sie nichts "böses" getan haben, aber wenn einer etwas "böses" tut, wird er zerstückelt.
 
  • Like
Reaktionen: 1 Person
ja NPC1 sind sklaven, und wenn die ihren bereich verlassen (durch eine kleine tür wo das unsichtbare objekt ist) werden sie von den wachen platt gemacht

//EDIT: kann ich den sklaven auch ein script geben, dass sie "zufällig" auf einen bestimmten punkt (oder ein anderes unsichtbares objekt außerhalb ihres "gefängisses") zu laufen?

//EDIT2: ich hab hier mal mit einem Kampf zwischen imperialen angreifern und hlaalu-verteidigern rum gespielt und mir da ein script von ald daedroth als vorbild genommen, aber die schützen tun nix und bei den nahkämpfern funktioniert das script einwand frei:
begin fightImperialEliteArcher

short counter
Short NoLore
short doonceA1
short doonceA2
short doonceA3
short doonceA4
short doonceA5
short doonceA6
short doonceA7
short doonceA8
short doonceB

if ( CellChanged == 0 )
Return
endif

if ( counter < 20 )
Set counter to counter + 1
Return
;for speed...
endif

Set counter to 0

if ( doonceA1 < 3 )
if ( GetDeadCount "Necrom guard1" == 0 )
if ( GetDistance "Necrom guard1" < 1000 )
StartCombat "Necrom guard1"
set doonceA1 to 1
endif
endif
endif


if ( doonceA2 < 3 )
if ( GetDeadCount "Necrom guard2" == 0 )
if ( GetDistance "Necrom guard2" < 1000 )
StartCombat "Necrom guard2"
set doonceA2 to 1
endif
endif
endif

if ( doonceA3 < 3 )
if ( GetDeadCount "Necrom guard3" == 0 )
if ( GetDistance "Necrom guard3" < 1000 )
StartCombat "Necrom guard3"
set doonceA3 to 1
endif
endif
endif

if ( doonceA4 < 3 )
if ( GetDeadCount "Necrom guard4" == 0 )
if ( GetDistance "Necrom guard4" < 1000 )
StartCombat "Necrom guard4"
set doonceA4 to 1
endif
endif
endif

if ( doonceA5 < 3 )
if ( GetDeadCount "Necrom guard5" == 0 )
if ( GetDistance "Necrom guard5" < 1000 )
StartCombat "Necrom guard5"
set doonceA5 to 1
endif
endif
endif

if ( doonceA6 < 3 )
if ( GetDeadCount "Necrom guard6" == 0 )
if ( GetDistance "Necrom guard6" < 1000 )
StartCombat "Necrom guard6"
set doonceA6 to 1
endif
endif
endif

if ( doonceA7 < 3 )
if ( GetDeadCount "Necrom slave-guard1" == 0 )
if ( GetDistance "Necrom slave-guard1" < 4000 )
StartCombat "Necrom slave-guard1"
set doonceA7 to 1
endif
endif
endif

if ( doonceA8 < 3 )
if ( GetDeadCount "Necrom elite-guard1" == 0 )
if ( GetDistance "Necrom elite-guard1" < 4000 )
StartCombat "Necrom elite-guard1"
set doonceA8 to 1
endif
endif
endif


if ( doonceB < 3 )
if ( GetDeadCount "Necrom Guard-Sniper" > 0 )
if ( GetDistance "Necrom Guard-Sniper" < 400 )
StartCombat "Necrom Guard-Sniper"
set doonceB to 1
endif
endif
endif


end fighImperialEliteArcher

begin fightImperialEliteSoldier

short counter
Short NoLore
short doonceA1
short doonceA2
short doonceA3
short doonceA4
short doonceA5
short doonceA6
short doonceA7
short doonceA8
short doonceB

;if ( CellChanged == 0 )
; Return
;endif

if ( counter < 20 )
Set counter to counter + 1
Return
;for speed...
endif

if ( doonceA1 < 3 )
if ( GetDeadCount "Necrom guard1" == 0 )
if ( GetDistance "Necrom guard1" < 400 )
StartCombat "Necrom guard1"
set doonceA1 to 1
endif
endif
endif


if ( doonceA2 < 3 )
if ( GetDeadCount "Necrom guard2" == 0 )
if ( GetDistance "Necrom guard2" < 400 )
StartCombat "Necrom guard2"
set doonceA2 to 1
endif
endif
endif

if ( doonceA3 < 3 )
if ( GetDeadCount "Necrom guard3" == 0 )
if ( GetDistance "Necrom guard3" < 400 )
StartCombat "Necrom guard3"
set doonceA3 to 1
endif
endif
endif

if ( doonceA4 < 3 )
if ( GetDeadCount "Necrom guard4" == 0 )
if ( GetDistance "Necrom guard4" < 400 )
StartCombat "Necrom guard4"
set doonceA4 to 1
endif
endif
endif

if ( doonceA5 < 3 )
if ( GetDeadCount "Necrom guard5" == 0 )
if ( GetDistance "Necrom guard5" < 400 )
StartCombat "Necrom guard5"
set doonceA5 to 1
endif
endif
endif

if ( doonceA6 < 3 )
if ( GetDeadCount "Necrom guard6" == 0 )
if ( GetDistance "Necrom guard6" < 400 )
StartCombat "Necrom guard6"
set doonceA6 to 1
endif
endif
endif

if ( doonceA7 < 3 )
if ( GetDeadCount "Necrom slave-guard1" == 0 )
if ( GetDistance "Necrom slave-guard1" < 4000 )
StartCombat "Necrom slave-guard1"
set doonceA7 to 1
endif
endif
endif

if ( doonceA8 < 3 )
if ( GetDeadCount "Necrom elite-guard1" == 0 )
if ( GetDistance "Necrom elite-guard1" < 4000 )
StartCombat "Necrom elite-guard1"
set doonceA8 to 1
endif
endif
endif


if ( doonceB < 3 )
if ( GetDeadCount "Necrom Guard-Sniper" == 0 )
if ( GetDistance "Necrom Guard-Sniper" < 400 )
StartCombat "Necrom Guard-Sniper"
set doonceB to 1
endif
endif
endif



end fightImperialEliteSoldier



Begin fightNecromGuard

short counter
short doonceA
short doonceA2
short doonceA3
short doonceA4
short doonceA5
short doonceA6
short doonceA7
short doonceB
short doonceB2
short doonceB3
short doonceB4
short doonceB5
Short NoLore

;if ( CellChanged == 0 )
; Return
;endif

if ( counter < 20 )
Set counter to counter + 1
Return
;for speed...
endif

Set counter to 0

if ( doonceA < 3 )
if ( GetDeadCount "Imperial elite-soldier" == 0 )
StartCombat "Imperial elite-soldier"
Set doonceA to 1
endif
endif

if ( doonceA2 < 3 )
if ( GetDeadCount "Imperial elite-soldier2" == 0 )
StartCombat "Imperial elite-soldier2"
Set doonceA2 to 1
endif
endif

if ( doonceA3 < 3 )
if ( GetDeadCount "Imperial elite-soldier3" == 0 )
StartCombat "Imperial elite-soldier3"
Set doonceA3 to 1
endif
endif

if ( doonceA4 < 3 )
if ( GetDeadCount "Imperial elite-soldier4" == 0 )
StartCombat "Imperial elite-soldier4"
Set doonceA4 to 1
endif
endif

if ( doonceA5 < 3 )
if ( GetDeadCount "Imperial elite-soldier5" == 0 )
StartCombat "Imperial elite-soldier5"
Set doonceA5 to 1
endif
endif

if ( doonceA6 < 3 )
if ( GetDeadCount "Imperial elite-soldier6" == 0 )
StartCombat "Imperial elite-soldier6"
Set doonceA6 to 1
endif
endif

if ( doonceA7 < 3 )
if ( GetDeadCount "Imperial elite-soldier7" == 0 )
StartCombat "Imperial elite-soldier7"
Set doonceA7 to 1
endif
endif





if ( doonceB < 3 )
if ( GetDeadCount "imperial elite-archer" == 0 )
if ( GetDistance "imperial elite-archer" < 400 )
StartCombat "imperial elite-archer"
Set doonceB to 1
endif
endif
endif

if ( doonceB2 < 3 )
if ( GetDeadCount "imperial elite-archer2" == 0 )
if ( GetDistance "imperial elite-archer2" < 400 )
StartCombat "imperial elite-archer2"
Set doonceB2 to 1
endif
endif
endif

if ( doonceB3 <3 )
if ( GetDeadCount "imperial elite-archer3" == 0 )
if ( GetDistance "imperial elite-archer3" < 400 )
StartCombat "imperial elite-archer3"
Set doonceB3 to 1
endif
endif
endif

if ( doonceB4 < 3 )
if ( GetDeadCount "imperial elite-archer4" == 0 )
if ( GetDistance "imperial elite-archer4" < 400 )
StartCombat "imperial elite-archer4"
Set doonceB4 to 1
endif
endif
endif

if ( doonceB5 < 3 )
if ( GetDeadCount "imperial elite-archer5" == 0 )
if ( GetDistance "imperial elite-archer5" < 400 )
StartCombat "imperial elite-archer5"
Set doonceB5 to 1
endif
endif
endif


End fightNecromGuard
 
Zuletzt bearbeitet:
Wenn du jemanden zu einem bestimmten Punkt reisen lassen willst, bräuchtest du die Funktion "AITravel".
"Actor_ID"->AITravel, xpos, ypos, zpos[, reset]

Der aufrufende Actor geht zur angegebenen Position in der aktuellen Zelle. Die angegebene Position muss über Pathgrids mit seiner aktuellen Position verbunden sein und die Entfernung sollte nicht zu groß gewählt werden.
[...]
Beispiel:
Code:
[LEFT]begin something_script[/LEFT]
 
[LEFT]short doonce[/LEFT]
 
[LEFT]if ( doonce == 0 )
      set doonce to 1
      AITravel, -628, -1080, -754e
endif[/LEFT]
 
end

Könntest du deine restlich geposteten Scripts bitte vernünftig einrücken? Das würde ungemein helfen, denn so wie es jetzt ist kann ich schwerlich etwas daraus lesen
 
Zuletzt bearbeitet von einem Moderator:
Zufällig reisen. Aha. Soll der punkt wirklich ganz total zufällig sein? Das geht soweit ich weiss nicht, wegen den pathgrids. ehrlich gesag hab ich keine Ahnung, wie man sich die anzeigen lassen kann. Aber wenn du dir die Pathgridpunktepositionen aufschreibst, kannst du einen auslosen lassen, etwa so:

Code:
float rand

set rand to Random 100

if ( rand < 33.33 )
 AITravel zielpunkt1
elseif ( rand < 66.66 )
 AITravel zielpunkt2
else
 AITravel zielpunkt3
endif