Construction Set Der Scriptthread

Aber wie kann man das ohne große Scripterei mit Morrowind lösen?

Nicht.

Ein Tagesablauf in Morrowind wird immer mit einem massivem Scriptingaufwand einhergehen. Vor allem, wenn man bedenkt, dass du nur sehr weniger Animationen hast und du diese nicht einmal ordentlich steuern kannst.

Du kannst mit begrenztem Aufwand den NPC in einem Gebiet "fangen", in dem du ihn ab und zu mal auf den richtigen Ort zurückteleportierst.
 
  • Like
Reaktionen: Freelancer_T
Ich komme noch mal auf dieses Script zurück:
begin my_ForceGreeting_script

if ( MenuMode == 1 )
return
endif

if ( GetJournalIndex, "DB_Bookhunt" < 10 )
if ( GetDistance Player < 512 )
ForceGreeting
SetJournalIndex, "DB_Bookhunt", 20
endif
endif

end
So wie es da steht macht es genau was es soll. Das andere hätte es übrigens auch so gelöst. Aber jetzt kommt es. Eine Funktion die vorher funktionierte geht nicht mehr.
Nur kurz:
Der NPC hat etwas an Dialog den er mit dem Spieler führt, übergibt ihm im Result dann 50 Draken, einen Lieferschein und es wurden ein paar Topics freigeschaltet. Dann wurde der Dialog mit Goodbye beendet und ein Befehl disable NPC <ID> ließ ihn dann verschwinden.
Der Dialog stammte noch aus der Vorgängermod zur jetzigen und es funktionierte alles. Jetzt mussten noch ein paar Ergänzungen ium Dialog vorgenommen werden damit es nicht ohne Zusammenhang zu folgenden Ereignissen führte. Da aber nur eiune begrenzte Anzahl von Zeichen zur Verfügung steht wurde die <choice Function Weiter eingesetzt.
Ab jetzt läuft zwar der Dialog und auch das andere wird abgearbeitet aber der Befehl disable wird nicht ausgeführt. Was läuft da falsch?
Ich habe noch 2 weitere NPC die auch auf diese Art aus dem Game genommen werden nachdem man mit ihnen gesprochen hat aber die haben keine Choice Option und es läuft da alles wie gewollt

Das hier steht im Dialog Fenster als Result:
Es steht bei der Choice Auswahl des Dialoges oder ist das da falsch? Es wird ja im Dialog erst der Anfang eingegeben, dort im Result dann Choice "Weiter" 1 anschließend über diesem der Teil des Dialoges der mit anklicken von weiter abgearbeitet wird. In dem Teil habe ich dann als Result das hier:
Player->AddItem "DG_Balmora_LS1" 1
Player->AddItem "Gold_001" 50
Journal "DB_Bookhunt" 20 <----könnte eventuell weg da das im Script bereits enthalten
Journal "DB_Bookhunt" 30
Journal "DB_Bookhunt" 40
AddTopic "Andule"
AddTopic "Ashur"
goodbye <----bis hier funktioniert es aber das nächste wird nicht abgearbeitet obwohl es bei den anderen beiden genauso funktioniert und zwar in der Reihenfolge
"DG_Citizen1"->disable
 
Hallo zusammen.
Nach langer Zeit habe ich mal wieder die Zeit gefunden um Morrowind zu installieren. Natürlich mit 1000 Mods, sonst wärs nicht Morrowind. Nun hat aber eine davon einen Scriptfehler und obwohl ich mich seit Tagen hineinfuchse komme ich nicht drauf, was falsch ist. Das CS zeigt keine Fehler an, aber im Spiel kommt immer die Fehlermeldung EXPRESSION. Wäre für eure Hilfe sehr dankbar.
Hier das Script:
Begin RM_Naspis_chest
Short once
If ( MenuMode )
Return
Endif

If ( OnActivate == 1 )
Activate
Endif
If (= 0 )
If ( GetJournalIndex "RM_GwenMain" == 201 )
If ( GetDistance, RM_Gwen <= 256 )
Set once to 1
Messagebox "Gwen: Quickly ^PCName, look around while they're busy"
Endif
Endif
Endif
End RM_Naspis_chest
 
Also die Zeile If (= 0 ) ist schon mal definitiv falsch. Ich nehme an, das sollte if ( once == 0 ) heißen.

Weiterhin sehe ich Probleme mit If ( GetDistance, RM_Gwen <= 256 ). Hier überprüft das Script ob ein NPC (ich nehme mal an, dass RM_Gwen ein NPC ist), nahe genug an der Truhe steht. Da das etwas ist, was der Spieler nicht wirklich direkt beeinflussen kann, könnte es hier also durchaus Probleme geben, dass die Messagebox nicht korrekt auslöst.
 
Wie konnte ich DAS übersehen. Ich hab mir das ganze mindestens 15 mal durchgelesen, danke dafür, aber leider funktionierts immer noch nicht, auch den fehler bei MenuMode habe ich jetzt behoben, nun siehts so aus:
Begin RM_Naspis_chest

Short once
If ( MenuMode == 1)
Return
Endif

If ( OnActivate == 1 )
Activate
Endif


If ( once == 0 )
If ( GetJournalIndex, RM_GwenMain == 201 )
If ( GetDistance, RM_Gwen <= 256 )
Set once to 1
Messagebox "Gwen: Quickly ^PCName, look around while they're busy"
Endif
Endif
Endif

End RM_Naspis_chest
Danke auch für die schnelle Antwort.

Sollte da nicht auch eine Else return schleife sein?
Eigenlicht ist das ganze Script doch ziemlich fürn Hugo. Es soll nur diese eine Messagebox wiedergeben, die dich daran erinnert diese Kiste zu durchsuchen, was man aber kurz zuvor in einem Dialog erfährt. Ich überlege langsam ob ichs nicht einfach rausschmeisse. Sowas kostet doch nur sinnlos rechenleistung.


Die Distanz zum entsprechenden Objekt wird, so wie ich das inzwischen herausgemausert habe, durch ein anderes Script geregelt, dass Gwen zwingt ihren Weg an der Truhe vorbei zu gehen.
Es ist gar nicht so leicht die Scripts eines anderen zu durchblicken, vor allem wenn man, so wie ich, gleich mehrere Mods zusammengewürfelt hat. War im Nachhinein eine blöde Idee.
 
Zuletzt bearbeitet:
auch den fehler bei MenuMode habe ich jetzt behoben

War in so fern eigentlich kein Fehler. Entspricht zwar nicht der Scrpting-Konvention, sollte aber trotzdem funktionieren.

Sollte da nicht auch eine Else return schleife sein?

Muss nicht. Das Script wird ja jeden Frame neu gestartet, unabhängig davon ob es im Frame davor beim End oder bei einem Return angekommen ist. Da du hier tatsächlich nur eine Bedingung abprüfst, kannst du das einfach so lassen.

Wenn es nach wie vor nicht funktioniert, aber keinen Fehler mehr ausgibt, würde ich tatsächlich mal den Abstand per Konsole überprüfen.[/Quote]
 
Das Problem ist nicht, dass es nicht funktioniert, beziehungsweise weiß ich gar nicht ob es funktioniert, denn im Spiel schreibt es immer "EXPRESSION in script...", während im CS kein Fehler auftaucht.
Habe gerade gelesen, dass solche Scripts an Containern nicht funktionieren. Liegt es daran?
 
RM_Naspis ist nicht als References Persist gelegt, also der Container auf dem das Script liegt.
RM_Gwen ist ein NPC und corpses persist ist nicht markiert.
 
Ich habe eine kurze Frage zu einem Script das ich bereits vor längerer Zeit genutzt hatte aber ich kann es nicht mehr finden da die Mod in der es enthalten war von mir gelöscht wurde (warum auch immer)
Es war folgendes:
Klangereignisse zu denen dann auch die InGame Aktivatoren erstellt wurden sollten nur bei einer bestimmten Entfernung des Spielers zu einem Bauwerk/Gegenstand ausgelöst werden
Das erste Ereignis sollte dann getriggert werden wenn sich der Spieler einem Bauwerk nähert und dann nur einmal pro Ereignis ausgelöst werden (kein Loop aber wenn der Spieler sich entfernt und später wiederkommt neu starten)

Das zweite Ereignis soll dann eintreten wenn der Spieler direkt neben einem Gegenstand steht, ihn quasi berührt (kein on activate erwartet Entfernung sollte reichen)
Konditionen weiter wie im ersten Ereignis beschrieben

Ich wäre sehr dankbar wenn ich eine Antwort vor dem 24.12.20 erhalte denn die Ereignisse sollen in eine Mod für den Adventskalender :):)
 
Hey, ich bräuchte Hilfe bei einem Script.
Ich habe versucht, das ganze auf zwei verschiedene Arten zu lösen, beide scheitern beim gleichem teil der Script, bzw. bei dem Part, wo beide das gleiche machen sollen.


Code:
begin Soul_IronForgeScript

short state
short button
short buttonA
short apprantice
short journeyman
short master
short grandmaster

if ( MenuMode == 1 )
    return
endif

if ( state == 0 )
    if ( OnActivate == 1 )
        if ( Player->GetItemCount, "Soul_Iron_Schematic" < 1 )
            MessageBox, "You do not have the schematics to use this."
            return
        else
            set state to 1
        endif
    endif
elseif ( state == 1  )
    MessageBox, "What is your Armorer Level?", "Apprantice", "Journeyman", "Master", "Grandmaster"
    set state to 2
elseif ( state == 2 )
    set button to GetButtonPressed
        if ( button == 0 )
            if ( Player->GetArmorer < 25 )
                MessageBox, "You are not an Armorer Apprantice!"
                set state to 0
                set button to -1
                return
            else
                set apprantice to 1
                set state to 0
                set button to -1
            endif  
        elseif ( button == 1 )
            if ( Player->GetArmorer < 50 )
                MessageBox, "You are not an Armorer Journeyman!"
                set state to 0
                set button to -1
                return
            else
                set journeyman to 1
                set state to 0
                set button to -1
            endif
        elseif ( button == 2 )
            if ( Player->GetArmorer < 75 )
                MessageBox, "You are not an Armorer Master!"
                set state to 0
                set button to -1
                return
            else
                set master to 1
                set state to 0
                set button to -1
            endif
        elseif ( button == 3 )
            if ( Player->GetArmorer < 100 )
                MessageBox, "You are not an Armorer Grandmaster!"
                set state to 0
                set button to -1
                return
            else
                set grandmaster to 1
                set state to 0
                set button to -1
            endif
        endif
endif

if ( apprantice == 1 )
    MessageBox, "What would you like to upgrade?", "Iron Helm", "Iron Cuirass", "Iron Pauldron Right", "Iron Pauldron Left", "Iron Gauntlet Right", "Iron Gauntlet Left", "Something else", "Nothing"
    set buttonA to GetButtonPressed
        if ( buttonA == 0 )
            if ( Player->GetItemCount, "iron_helmet" < 1 )
                if ( Player->GetItemCount, "Soul_RawIron" < 5 )
                    MessageBox, "You do not have the required armor!"
                    set apprantice to 0
                    set buttonA to -1
                endif
            else
                Player->RemoveItem, "iron_helmet", 1
                Player->RemoveItem, "Soul_RawIron", 5
                Player->AddItem, "Soul_A iron_helmet", 1
                PlaySound, "Repair"
                set apprantice to 0
            endif
        elseif ( buttonA == 2 )
            set apprantice to 0
            set buttonA to -1
            return
        elseif ( buttonA == 3 )
            set apprantice to 0
            set buttonA to -1
            return
        elseif ( buttonA == 4 )
            set apprantice to 0
            set buttonA to -1
            return
        elseif ( buttonA == 5 )
            set apprantice to 0
            set buttonA to -1
            return
        elseif ( buttonA == 6 )
            set apprantice to 0
            set buttonA to -1
            return
        elseif ( buttonA == 7 )
            set apprantice to 0
            set buttonA to -1
            return
        endif
endif



end Soul_IronForgeScript

Code:
begin Soul_ForgeScript_Iron

short state
short button
short apprentice
short journeyman
short master
short grandmaster

if ( MenuMode == 1 )
    return
endif

if ( OnActivate == 1 )
    if ( Player->GetItemCount, "Soul_Iron_Schematic" < 1 )
        MessageBox, "You do not have the schematics to use this."
        return
    else
        set state to 1
    endif
endif

if ( state == 1 )
    if ( Player->GetArmorer < 25 )
        MessageBox, "You are not skilled enough to upgrade your armor."
    else
        set apprentice to 1
        set state to 2
;    elseif ( Player->GetArmorer >= 50 )
;        set journeyman to 1
;        set apprentice to 0
;        set state to 2
;    elseif ( Player->GetArmorer >= 75 )
;        set master to 1
;        set journeyman to 0
;        set apprentice to 0
;        set state to 2
;    elseif ( Player->GetArmorer >= 100 )
;        set grandmaster to 1
;        set master to 0
;        set journeyman to 0
;        set apprentice to 0
;        set state to 2
    endif
endif

if ( state == 2 )
    MessageBox, "What would you like to upgrade?", "Iron Helm", "Iron Cuirass", "Iron Pauldron Right", "Iron Pauldron Left", "Iron Gauntlet Right", "Iron Gauntlet Left", "Something else", "Nothing"
    set button to GetButtonPressed
        if ( button < 0 )
            return
        elseif ( button == 0 )
            if ( apprentice == 1 )
                if ( Player->GetItemCount, "iron_helmet" < 1 )
                    MessageBox, "You do not have the required armor!"
                    set state to 0
                    set apprentice to 0
                    set button to -1
                elseif ( Player->GetItemCount "Soul_RawIron" < 5 )
                        MessageBox, "You do not have the required materials!"
                        set state to 0
                        set apprentice to 0
                        set button to -1
                else
                    Player->RemoveItem, "iron_helmet", 1
                    Player->RemoveItem, "Soul_RawIron", 5
                    Player->AddItem, "Soul_A iron_helmet", 1
                    PlaySound, "Repair"
                    set apprentice to 0
                    set state to 0
                    set button to -1
                    return
                endif
            elseif ( journeyman == 1 )
                if ( Player->GetItemCount, "iron_helmet" < 1 )
                    if ( Player->GetItemCount, "Soul_RawIron" < 5 )
                        MessageBox, "You do not have the required materials!"
                        set state to 0
                        set journeyman to 0
                        set button to -1
                    endif
                else
                    Player->RemoveItem, "iron_helmet", 1
                    Player->RemoveItem, "Soul_RawIron", 5
                    Player->AddItem, "Soul_J iron_helmet", 1
                    PlaySound, "Repair"
                    set journeyman to 0
                    set state to 0
                    set button to -1
                    return
                endif
            endif
        elseif ( button == 2 )
            return
        elseif ( button == 3 )
            return
        elseif ( button == 4 )
            return
        elseif ( button == 5 )
            return
        elseif ( button == 6 )
            return
        elseif ( button == 7 )
            return
        endif
endif


end Soul_ForgeScript_Iron

Beim zweitem MessageBox, bzw bei der Ersten in der zweitem Scriptvarriante, wo sich die Fragen welche Rüstung man nun verbessern will, "iron_helmet" etc. hängt das die MessageBox sich auf, egal was ich anklicke, sie verschwindet nicht, oder gibt mir, die Items raus. Einziger Ausweg ist aus dem Spiel zu gehen und es zu beenden. Habe schon divers Sachen versucht, den Code umzustellen, so ist dann auch die zweite Varriante rausgekommen. Komme leider mit meinem Wissen, was scripten angeht nicht weiter. Brauche hilfe.

Falls nicht ersichtlich, hier nochmal was der Script machen soll:
Man hat einen Activator, der wenn man ihn anklickt, frägt, welches "Level" man upgraden will. Sofern man nicht die "schematics" hat, kann man es nicht benutzen. In der zweiten Varriante wird diese Frage übersprungen und das Level wird automatisch gesetzt.
Anschließend kommt eine zweite Frage, welches Rüstungsteil man upgraden will. Wenn man nicht die Teile dafür hat, wird gesagt, dass man diese nicht hat, wie mans kennt, ansonsten werden die Items auf dem Inventar entfernt und das neue Item wird dem Inventar hinzugefühgt. Die noch nicht zugewiesenen buttons in beiden Varrianten sind bislang nur Placeholder, bis ich weis, woran es in meinem script scheitert, weiter zu kommen.

So sieht es aus für den Moment, über Hilfe würde ich mich freuen.


Gruß: Soul
 
begin Soul_IronForgeScript

short state
short Level
short Upgrade

if ( state == 0 )
if ( OnActivate == 1 )
if ( Player->GetItemCount, "Soul_Iron_Schematic" < 1 )
MessageBox, "You do not have the schematics to use this."
else
MessageBox, "What is your Armorer Level?", "Apprantice", "Journeyman", "Master", "Grandmaster"
set state to 1
endif
endif
return
elseif ( state == 1 )
set Level to GetButtonPressed
if ( Level == -1 )
return
endif
if ( Level == 0 )
if ( Player->GetArmorer < 25 )
MessageBox, "You are not an Armorer Apprantice!"
set state to 0
return
endif
elseif ( Level == 1 )
if ( Player->GetArmorer < 50 )
MessageBox, "You are not an Armorer Journeyman!"
set state to 0
return
endif
elseif ( Level == 2 )
if ( Player->GetArmorer < 75 )
MessageBox, "You are not an Armorer Master!"
set state to 0
return
endif
else
if ( Player->GetArmorer < 100 )
MessageBox, "You are not an Armorer Grandmaster!"
set state to 0
return
endif
endif
MessageBox, "What would you like to upgrade?", "Iron Helm", "Iron Cuirass", "Iron Pauldron Right", "Iron Pauldron Left", "Iron Gauntlet Right", "Iron Gauntlet Left", "Something else", "Nothing"
set state to 2
return
elseif ( state == 2 )
set Upgrade to GetButtonPressed
if ( Upgrade == -1 )
return
endif
set state to 0
if ( Upgrade == 0 )
if ( Player->GetItemCount, "iron_helmet" >= 1 )
if ( Player->GetItemCount, "Soul_RawIron" >= 5 )
Player->RemoveItem, "iron_helmet", 1
Player->RemoveItem, "Soul_RawIron", 5
Player->AddItem, "Soul_A iron_helmet", 1
PlaySound, "Repair"
return
endif
endif
MessageBox, "You do not have the required armor!"
elseif ( Upgrade == 1 )
elseif ( Upgrade == 2 )
elseif ( Upgrade == 3 )
elseif ( Upgrade == 4 )
elseif ( Upgrade == 5 )
elseif ( Upgrade == 6 )
else
endif
endif

end Soul_IronForgeScript
 
  • Like
Reaktionen: Soul-O-Eater
Ich habe ein Problem mit PlaySound, PlaySound3D und ähnlichen Befehlen. Nehmen wir ein Beispielscript:

Code:
begin beispielscript

if ( MenuMode == 1 )
   return
endif

if ( OnActivate == 0 )
   return
endif

PlaySound3D "woodchimes"

end beispielscript

Also einfach eine Kopie des normalen Glockenskripts. Dabei ist woodchimes.wav eine Sounddatei, die standardmäßig in Data Files\Sound\Fx\envrn vorhanden ist. Trotzdem erhalte ich den Fehler:

Code:
Script beispielscript
Sound woodchimes was not found on line 11.
Compiled script not saved!

Das passiert mir mit dem Großteil der Sounddateien, die ich probiert habe, interessanterweise aber nicht mit allen. Ich kann zum Beispiel Fx\envrn\SothaBlade.wav abspielen lassen (PlaySound "SothaBlade"), aber nicht Fx\envrn\watrfallSML.wav oder Fx\boo.wav (PlaySound "boo"). Dateien, die nicht zum Spiel selbst gehören, haben bislang noch kein einziges Mal funktioniert. Möchte ich also per Skript die Datei Sound\kr_tn\bsp.wav abspielen lassen (Playsound "bsp"), erhalte ich garantiert o.g. Fehler. Ein System dahinter erkenne ich nicht. Was mache ich falsch bzw. wie muss ich vorgehen, damit ich PlaySound erfolgreich nutzen kann?
 
say, "Fx\envrn\woodchimes.wav", "Klopfen..."


PlaySound3D "woodchimes"

Sie müssen den Ton unter Gameplay->Sounds hinzufügen:
ID: woodchimes "Fx\envrn\woodchimes.wav"
 
Hallo Ihr Script-Pros,

ich wäre Euch sehr verbunden wenn sich vielleicht nochmal jemand den Post #2107 ansehen könnte.
Bei £exa's Antwort funktioniert leider nur eine einzelne Flasche füllen, und das ganze Fass leeren.

Danke im voraus

P.S. Ich weiß das ich etwas spät bin.., ich sag ma so: Back to Morrowind! :)
 
Hallo, ich bräuchte Hilfe bei ein paar Scripts.

Ich möchte einen Container erscheinen lassen, wenn man ein bestimmtes Buch gelesen hat. Im Moment habe ich so versucht, dass wenn man das Buch liest, einen Journal entry bekommt. Dies wäre mein erstes Script gewesen und dann ein zweites, welches auf dem Container liegt, der diesen erscheinen lässt, wenn man diesen Journal entry hat. Bislang gibt mir das Script keinen Journal entry aus. Das Script wird mehr oder weniger genau so in anderen Scripts vom Spiel so verwendet, daher denke ich, dass ich irgendetwas am Journal falsch gemacht habe?

Code:
begin Soul_RawAdamantium_Enable

short done

if ( done == 0 )
    enable
endif


if ( GetJournalIndex "Soul_RawAdamantium_1" >= 10 )
    enable
    set done to 1
endif

end

Code:
begin Soul_RawAdamantium_Node

short done

if ( done == 1 )
    return
endif


if ( OnActivate == 1 )
    if ( player->GetItemCount Soul_Schematic_Adamantium > 0 )
        Journal "Soul_RawAdamantium_1" 10
        activate
        set done to 1
    endif
endif


end

Ich denke mal, dass man das auch mit nur einem Script lösen kann. Mir war es nur wichtig, dass man den Container immer sehen kann, wenn man das Buch gelesen hat, damit man diesen nicht immer dabei haben muss. Der Journal entry wäre auch schön, damit der Spieler weiß, dass er ab diesem Moment aus, nach den Container suchen kann, der vorher nicht sichtbar war.

Wäre nett, wenn man mir dabei helfen kann.

Gruß: Soul
 
Das erste Skript ist komisch. Bevor der Tagebucheintrag da ist, wird auf das Objekt, auf dem das Skript liegt, jede Sekunde ein enable-Befehl ausgeführt. Sobald der Tagebucheintrag da ist, wird ebenfalls in jedem Frame enable ausgeführt und zusätzlich die lokale Variable done auf 1 gesetzt, was aber keinen Effekt hat, weil in der unteren Hälfte des Skripts ja genau das gleiche passiert wie in der oberen. Wolltest du das Skript vielleicht so haben?

Code:
begin Soul_RawAdamantium_Enable

short done

if ( done == 1 )
   return
endif

if ( GetDisabled == 0 )
   if ( GetJournalIndex "Soul_RawAdamantium_1" < 10 )
       disable
   endif
else
   if ( GetJournalIndex "Soul_RawAdamantium_1" >= 10 )
       enable
       set done to 1
   endif
endif

end Soul_RawAdamantium_Enable

Damit sollte der Container, auf dem das Skript liegt, erst erscheinen, sobald der Tagebucheintrag da ist.

Beim zweiten Skript: Hast du beim Test denn auch den Gegenstand Soul_Schematic_Adamantium im Inventar gehabt?
 
  • Like
Reaktionen: Soul-O-Eater