Construction Set Der Scriptthread

Hallo zusammen, ich bräuchte mal wieder Hilfe.

Ich habe auf einen NPC ein Skript gelegt, so dass er sich bei Angriff auf ihn selbst oder seinen Begleiter in einen Werwolf verwandelt. Nun möchte ich aber, dass er sich bei Ende des Kampfes wieder zurückverwandelt und seine ursprüngliche Ausrüstung wieder anlegt.
Das Verwandeln und Zurückverwandeln habe ich hinbekommen. Allerdings ist mein NPC nach der Rückverwandlung so wie Gott ihn schuf.
Das Skript sieht wie folgt aus:
Begin _ly_werewolfguard_areas

short attackstate
short OnPCHitMe
short doonce
short temp
float xpos
float ypos
float zpos
float zrotpos

set temp to GetWeaponDrawn
set temp to ( temp + GetSpellReadied )

if ( "areas thonro"->IsWerewolf != 1 )
if ( "areas thonro"->GetItemCount "BM wolf boots" == 0 )
"areas thonro"->AddItem "BM wolf boots" 1
"areas thonro"->Equip "BM wolf boots" 1
"areas thonro"->AddItem "BM wolf left gauntlet" 1
"areas thonro"->Equip "BM wolf left gauntlet"
"areas thonro"->AddItem "BM wolf right gauntlet" 1
"areas thonro"->Equip "BM wolf right gauntlet"
"areas thonro"->AddItem "common_pants_04_b" 1
"areas thonro"->Equip "common_pants_04_b"
"areas thonro"->AddItem "common_shirt_04_b" 1
"areas thonro"->Equip "common_shirt_04_b"
endif
endif
if ( OnPCHitMe == 1 )
Set xpos to ( GetPos X )
Set ypos to ( GetPos Y )
Set zpos to ( GetPos Z )
Set zrotpos to ( GetAngle Z )
PlaceItem bm_wereeffect xpos ypos zpos zrotpos
BecomeWerewolf
set attackstate to 1
set OnPCHitMe to 0
endif

if ( doonce == 0 )
if ( "fedave nirith"->GetAttacked == 1 )
Set xpos to ( GetPos X )
Set ypos to ( GetPos Y )
Set zpos to ( GetPos Z )
Set zrotpos to ( GetAngle Z )
PlaceItem bm_wereeffect xpos ypos zpos zrotpos
BecomeWerewolf
set attackstate to 1
set doonce to 1
endif
endif

if (attackstate == 1)
StartCombat, player
set attackstate to 0
endif

if (GetHealth == 0 )
UndoWerewolf
endif

if ( temp == 0 )
if ( GetTarget, Player == 0 )
Undowerewolf
set attackstate to 0
set doonce to 0
endif
endif
End
Wie müsste ich das Skript anpassen, so dass es wie gewünscht funzt?
 
Probier mal:

Code:
Begin _ly_werewolfguard_areas
short attackstate
short OnPCHitMe
short doonce
short temp
float xpos
float ypos
float zpos
float zrotpos

set temp to GetWeaponDrawn
set temp to ( temp + GetSpellReadied )

if ( IsWerewolf != 1 )
    if ( GetItemCount "BM wolf boots" == 0 )
        AddItem "BM wolf boots" 1
        AddItem "BM wolf left gauntlet" 1
        AddItem "BM wolf right gauntlet" 1
        AddItem "common_pants_04_b" 1
        AddItem "common_shirt_04_b" 1
    endif
    if ( HasItemEquipped "BM wolf boots" == 0 )
        Equip "BM wolf boots"
        Equip "BM wolf left gauntlet" 
        Equip "BM wolf right gauntlet"
        Equip "common_pants_04_b"
        Equip "common_shirt_04_b"
    endif
endif

if ( doonce == 0 )
    if ( OnPCHitMe == 1 )
        set attackstate to 1
        set OnPCHitMe to 0
        set doonce to 1
    endif
    if ( "fedave nirith"->GetAttacked == 1 )
        set attackstate to 1
        set doonce to 1
    endif
endif

if (attackstate == 1)
    Set xpos to ( GetPos X )
    Set ypos to ( GetPos Y )
    Set zpos to ( GetPos Z )
    Set zrotpos to ( GetAngle Z )
    PlaceItem bm_wereeffect xpos ypos zpos zrotpos
    BecomeWerewolf
    StartCombat, player
    set attackstate to 0
endif

if (GetHealth == 0 )
    UndoWerewolf
endif

if ( temp == 0 )
    if ( GetTarget, Player == 0 )
        Undowerewolf
        set attackstate to 0
        set doonce to 0
    endif
endif

End
Ich sehe noch ein Problem: Die Rüstungsteile können, wenn sie zu stark beschädigt sind, nicht mehr angelegt werden.
 
Ich sehe noch ein Problem: Die Rüstungsteile können, wenn sie zu stark beschädigt sind, nicht mehr angelegt werden.

Das ließe sich mit einem automatischen Remove / Add Folge realisieren. Dann wären immer neue Rüstungsteile vorhanden.

Was auch ein Problem sein könnte, dass der NPC nur Ausrüstung anzieht, die seinen Fertigkeiten entspricht. Also wenn zum Beispiel seine Ohne Rüstung höher ist als die Rüstungsfertigkeiten, wird er niemals eine Rüstung anziehen.
 
@£exa: Hat leider auch nicht funktioniert.

Allgemeine Frage: Da er ja wieder die gleiche Ausrüstung anziehen soll, wie er sie vorher getragen hat (und er hat sie richtig getragen), müssten die Rüstungswerte doch eigentlich stimmen. Und normale Kleidung ziehen die NPCs doch immer an, egal welche Rüstungswerte sie haben, oder irre ich mich?

Edit: Hab gerade mal per Konsole dem NPC nach der Rückverwandlung die Wolfsstiefel hinzugefügt und der hatte plötzlich wieder die gesamte Ausrüstung an. Kann es vielleicht Probleme bei dem Skript geben, weil ich bei der Kampfabfrage ein Menü-Fenster (nämlich das Dialog-Fenster) offen habe? Ich teste das Skript immer so, dass ich den NPC angreife, dann bei der Wache in der gleichen Zelle die Strafe zahle und so den Kampf beende.
 
Zuletzt bearbeitet:
Mit dem MenuMode kann das eigentlich nichts zu tun haben, denn dagegen spricht, dass du es mit der Console hinzufügst und die AI dann direkt greift und die Teile angelegt werden. Ich vermute eher, dass die Inventar-AI spinnt, weil das Spiel nicht damit rechnet, dass ein NPC-Werwolf sich zurückverwandelt ohne getötet zu werden und dann die normalen Aktionen einfach nicht ausgeführt werden, bis man sie manuell anstößt, indem man den Ist-Zustand (Inventar) ändert.

Du könntest bei der Verwandlung zum Werwolf manuell die Rüstungs- und Kleidungsteile aus dem Inventar entfernen. Dadurch sollten sie direkt nach einer Rückverwandlung durch das Script als "nicht vorhanden" detektiert und damit wieder eingefügt werden. Vielleicht behebt das dein Problem. Ich kann hier leider nichts testen, mein Notebook hat kein MW drauf und bin erst am WE wieder an meiner eigentlichen Maschine.
 
Ich hab's nun zum Laufen gebracht, indem ich den Additem und Equip Teil des Skripts ausgelagert habe, sprich ich hab in die Zelle einen Aktivator mit Skript eingefügt, der abfragt, ob der NPC einen der Ausrüstungsgegenstände besitzt und wenn nicht, die Gegenstände hinzufügt und ausrüstet.
 
Morgen,

es ist zwar nicht direkt ein Scriptproblem, aber irgendwie doch schon..okay, wie auch immer :-D

ich hab in meinem Script ein
begin kartoffel

Forcegreeting
AiTravel "Position eines Objekts ausserhalb der Zelle"

end

Der NPC soll nach einem Dialog sofort drauf loslegen und zu den angegebenen Koordinaten laufen..tut er aber nicht. Bin leider echt ratlos, weiß wer was da los ist?
 
Ich glaube, dafür brauchts du kein Skript. Schau dir mal die Einstellungen bei Mehra Milo im Dialog Editor an (Greeting 5, vorletzter Eintrag). Außerdem muss man, glaube ich, den gewünschten Weg mit Path Grids abstecken.
 
So bringt das nichts, Senture. Meiner Meinung nach unterbricht ForceGreeting den AITravel bevor der überhaupt wirken kann - der Grund dafür kann allerdings auch sonstwas sein. Nur um das klar zu analysieren fehlen entscheidende Informationen:

1. reden wir von Interiors oder Exteriors?
2. wie lautet das Script exakt?
3. was genau macht der Dialog?
4. welche AISettings hat die betroffenen NPC?
5. hat die Zelle Pathgrids? (OK, hast du beantwortet)

AI-Befehle in Morrowind sind ziemlich störanfällig. Mal ein Beispiel, was schief gehen kann: AITravel bewegt eine NPC von A nach B, jedoch wird diese anhalten und den Spieler abhängig von den Hello-Settings grüßen oder sogar stehenbleiben und ihn dumm angucken, wenn die Idles reinpfuschen. Es kann vorkommen, dass die NPC das AITravel nach so einem Break vergißt. Es ist also wichtig, die genauen Umstände zu kennen.
 
hm tut mir leid, bin schon etwas verschlafen, hier genaue Infos:

das Script:

begin vf_svushscript

short doonce


if ( doonce == 0 )
if( GetDistance Player <= 128 )
Forcegreeting
ForceRun
set doonce to 1
endif
endif


end

Im Dialog wird etwas Text angezeigt und dann in der Resultzeile

goodbye
AiTravel, 272, 1591, 323

Es handelt sich um eine Exterior-Zelle, gewünscht wäre aber dass der NPC über eine Zelle hinweg läuft. Testhalber sind die Koordinaten aber in der gleichen Zelle.

Der NPC hat keine Packages drin, er steht also nur in ner Ecke und wartet auf den Spieler.
Die Zelle hat eigens erstellte Pathgrids
 
Nun, dann schau dir noch mal Mehra's Script und den von Lyali erwähnten Dialog genau an. Du wirst zwei Dinge feststellen:

1. setzt du AITravel nach Goodbye - mach es anders herum.
2. modifiziert Mehra's Script ihren "Hello" Wert. Das machen die nicht grundlos, ich hatte es schon erwähnt.

Versuche Script und Dialog entsprechend anzupassen, dann probier es noch mal. Am Exterior liegt es nicht. Später, wenn die Distanz zu groß ist, kann das schon problematisch werden, aber grundsätzlich sollte es gehen.
 
Hallo,

also ich hab jetzt sämtliche Variationen von allem probiert und es geht immernoch nicht :(
Das Script von MehraMilo habe ich bei meinem angepasst und das ganze sieht insgesamt so aus:

begin vf_svushscript

short doonce
short travelDone
short travelNow
short noLore


if ( MenuMode == 1 )
return
endif


if ( travelDone == 1 )
return
endif


if ( doonce == 0 )
if ( GetDistance Player <= 128 )
ForceGreeting
ForceRun
set doonce to 1
endif
endif


if ( GetCurrentAiPackage == 1 )
set travelNow to 1
setHello 0
AiTravel, 3626, 4053, 205
MESSAGEBOX "ICH BIN JETZT BEI GETCURRENTAIPACKAGE" "OK"
if ( GetAiPackageDone == 1 )
set travelDone to 1
set travelNow to 0
AiWander 0 5 0 0 0 0 0 0 0 0 0 0
SetHello 30
endif


else
set travelNow to 0
endif


end

Nachdem mich der NPC anspricht wird das Travelpackage von ihm ausgelöst, was zum bestätigen der Messagebox im Script führt. Das einzige was der NPC danach macht ist allerdings kurz zucken, er bewegt sich keinen Meter weiter und GetAiPackageDone ist sofort auf true. Gebe ich dem NPC das Travelpackage über die Konsole passiert auch nichts. Er steht allerdings vogelfrei auf normalem Boden und könnte ungehindert die 10 Meter laufen, auf die ich die Teststrecke mittlerweile gesetzt habe. Die Koordinaten des Zielortes habe ich von einem Pathgrid-Punkt.
 
1. Achte drauf ob der Gridpoint evtl. genau am Boden ist, addiere dann evtl ca 80-120 zur Z-Koordinate beim AiTravel so das der Reisende ihn mit der Körpermitte trifft.
2. Ausserdem sollte die Entfernung pro Etappe nicht mehr als 800-1000 Einheiten sein sonst gehen sie garnicht erst los.

3. ForceRun nach AiTravel

4. wenn die Entfernung so gross ist das Du mehrere Etappen brauchst:
Code:
begin ...

short state           ; gegenwärtiger Status
short hasPackage  ; wenn 1 dann hat er wohl eins

short nolore        ; no local response

if ( menumode )
  return
endif

if ( state == -1 )
  ; fertig...
  return
elseif ( state == 0 )
  if ( GetDistance Player <= 128 )
    set state to 1
    ForceGreeting 
 
   ; setze im Dialog-Result im Gespräch irgendwo vor Goodbye unbedingt
   ; set state to 2 !!! (kann bereits bei der Begüssung sein - hauptsache das Dialog-Menu ist wiklich offen)

   ; bis der dialog geöffnet wurde ist dieses Script wahrscheinlich schon 5 mal
   ; mit dem state-Wert 1 durchgelaufen

elseif ( state >= 2 )
   
   if ( hasPackage )
      ; hat noch ein paket abzuarbeiten...
      set hasPackage to ( hasPackage - GetAiPackageDone )
      ; raus hier
      return
   endif

   setHello 0
   set state to  ( state + 1 )
   
   if ( state == 3 ) 
     Messagebox "Ich starte jetzt Etappe 1"
     AiTravel <Ziel Etappe 1 einsetzen>
   elseif ( state == 4 )
     Messagebox "Ich starte jetzt Etappe 2"
     AiTravel <Ziel Etappe 2 einsetzen>
   ;...
   else
      ; am Endziel...
      set state to -1
      ClearForceRun
      AiWander 0 5 0 0 0 0 0 0 0 0 0 0
      SetHello 30
      return
   endif
   forceRun
   set hasPackage to 1
endif

end
 
Zuletzt bearbeitet:
Eure Behandlungsmethoden schlagen leider fehl :(
an was kann das denn im allgemeinen liegen, dass aitravel nicht greift? Die Insel ist ziemlich weit von der Zelle 0,0 entfernt, kann das die Ursache sein?
 
AiTravel, 3626, 4053, 205
Ehm... ich glaube es liegt an diesen Zielkoordinaten. Warum? Nun...

Die Insel ist ziemlich weit von der Zelle 0,0 entfernt

Wenn das stimmt, welches Worldmap-Square hat dein Exterior?

Deine Koordinaten liegen nämlich in der Haupttreppe von Assarnatamat (Exterior 0|0) - da sind Probleme vorprogrammiert (im wahrsten Sinne des Wortes) :-D
 
Also ich hab schon Reisende über viele Kilometer u.a. in Dauerschleife oder endlosem hin- und herpendeln geschrieben. Wenn mal einer stehenblieb dann entweder weil die Gridpoints selbst weiter als NPCVoiceDistance (750) auseinander waren oder weil die zurückzulegende Distanz zu gross war. Maximal wie gesagt 800-1000 - ich hab auf nummer sicher lieber 750 - 800 angesteuert weil dies die häufigste Ursache für's unterwegs steckenbleiben war.
Ach ja- einmal hatte ich vergessen die Gridpunkte richtig zu verbinden oder nicht die Punkte zweier aneinander grenzender Zellen dicht genug aneinander gelegt und einmal hatte mein Reisender plötzlich zuviel Gepäck weil er wohl dem Zauber eines Knochenläufers zum Opfer fiel und seine Tragkraft dann zu gering war.
Wenn also nicht das Problem die Verzögerung beim Öffnen des Dialogs nach "ForceGreeting" ist dann hab ich auch keinen anderen Rat mehr.

PS. £exa hats geschrieben: Du hast die Gridpoint-Koordinaten verwendet... platziere einen Dummy-NPC ans Ziel und lies die Koordinaten an der Statusleiste ab.
 
Zuletzt bearbeitet:
daher müssten Deine Koordinaten einige hundertzehntausender Werte haben. Die GridPoint-Koordinaten sind aber jeweils nur in der Zelle und reichen von 0- 8192 - Du brauchst aber World-Coords - also - Pathgrid-Editor aus, einen NPC direkt ans Ziel stellen und unten in der Statusleiste die Koordinaten ablesen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Senture