Construction Set Der Scriptthread

Hallo, ich bins mal wieder..

Ich hab mir nen Sorter gebastelt, funzt auch alles so weit ganz gut. Auf den Containern liegen Skripte die die jeweiligen Items zählen,
und zur Optik paar Sachen enabeln bzw. disablen, so weiß man immer was man im Haus hat. :)
Ungefähr so..

Code:
begin cont_xyz_sc

if ( menumode == 1 )
        return
    endif

    if ( GetItemCount "xxx" > 0 )
        "_vdm_sort_xxx"->Enable
  set xxxCount to ( GetItemCount, "xxx" )
    else
        "_vdm_sort_xxx"->Disable
  set xxxCount to ( GetItemCount, "xxx" )
    endif

    if ( GetItemCount "yyy" > 0 )
        "_vdm_sort_yyy"->Enable
  set yyyCount to ( GetItemCount, "yyy" )
    else
        "_vdm_sort_yyy"->Disable
  set yyyCount to ( GetItemCount, "yyy" )
    endif

    if ( GetItemCount "zzz" > 0 )
        "_vdm_sort_zzz"->Enable
  set zzzCount to ( GetItemCount, "zzz" )
    else
        "_vdm_sort_zzz"->Disable
  set zzzCount to ( GetItemCount, "zzz" )
    endif

end

Jetzt is meine frage, wie könnte ich die ganzen Items zählen?
Ich weiß mit den vielen Globalen ist das so ne Sache.., vllt ne andere Idee?

Danke ;)
 
Das Problem ist dreiteilig. Zum einen ist eine große Anzahl an Globalen selten eeine gute Idee. Eine potentiell zu große Menge an Script-Holdern in der gleichen Zelle auch nicht. Und zum dritten die ganzen If-Else-EndIF Blöcke und enable/disable Vorgänge, die der Performance auch nicht zuträglich sind. Man sollte sich nicht zu viel vornehmen.

Prinzipiell würde ich mit einer begrenzten Zahl lokaler Scriptholder beginnen, die jeweils einige Variablen enthalten und eine bestimmte Menge von Containern in zyklischen Abständen simultan überwachen. Die Gesamtzahl aller Scriptholder ist dabei so weit als möglich zu begrenzen - umso weniger Ärger hat man.

Aber um das optimieren zu können, wäre definitiv wichtig zu wissen, was genau in die Behälter sortiert wird, wie es geschieht und ob mehrere verschiedenartige Items in einem Container gelagert sind, sowie ebenfalls ob es möglich ist, die Items manuell wieder zu entnehmen oder nur per Script. Weiter wäre noch interessant, wieviele Container es gibt und wieviele verschiedene Objekte enabled/disabled werden und was genau diese Objekte bewirken. Das Beispielscript von dir hilft mir nicht sonderlich, die Gesamtlage zu verstehen.
 
Der Sorter ist für die Küche, es werden nur NOM Sachen sortiert.
Sortiert wird via NPC Resultbox...

Code:
goodbye
set "_vdm_sort_nom_state" to 1
startscript "_vdm_sort_nom_script"
startscript "_vdm_sort_nom_stop_script"

Die sortier Scripte...

Code:
begin _vdm_sort_nom_script

if ( MenuMode == 1 )
    return
endif

if ( "_vdm_sort_nom_state" == 0 )
    return
endif

; NOM >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if ( player->getitemcount "NOM_food_a_apple" > 0 )
    player->removeitem "NOM_food_a_apple" 1
    "_vdm_cont_fruits"->additem "NOM_food_a_apple" 1
endif

>>>>>>>>>>>>>> USW


Code:
begin _vdm_sort_nom_stop_script

short stop

if ( MenuMode == 1 )
    return
endif

if ( "_vdm_sort_nom_state" == 0 )
    return
endif

; NOM >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if ( player->getitemcount "NOM_food_a_apple" <= 0 )

if ( stop == 0 )
set stop to ( stop + 1 )

endif
endif

if ( stop  == 1 )
      MessageBox "Crap sorted."
    set "_vdm_sort_nom_state" to 0
    set stop to 0
endif

>>>>>>>>>>>>>> USW

Das Container Script...

Code:
Begin _vdm_cont_fruits_script

    if ( menumode == 1 )
        return
    endif

    if ( GetItemCount "NOM_food_a_apple" > 0 )
        "_vdm_sort_apple"->Enable ; Apfel activator wird enabled, wenn Apfel/Äpfel im Container
  set appleCount to ( GetItemCount, "NOM_food_a_apple" )
    else
        "_vdm_sort_apple"->Disable ; Apfel activator wird disabled, wenn kein Apfel im Container
  set appleCount to ( GetItemCount, "NOM_food_a_apple" )
    endif

>>>>>>>>>>>>>> USW

Der Container, auf dem der PC frei zugreifen und Sachen rausholen kann, ist in diesen Fall eine Obstschale.
Der Apfel activator: _vdm_sort_apple liegt dann oben auf der Obstschale, und appleCount lass ich mir in einen Bestandsbuch anzeigen.
Einen Scriptholder für _vdm_sort_nom_script und _vdm_sort_nom_stop_script hab ich nicht, funktioniert iwie auch so.
Es wird sämtliches Obst in die Obstschale sortiert, das gleiche hab ich noch für ne Käseplatte usw.

Obst alleine sind 6 zähl Globale + die sortier Globale, Käse sind 5 usw..


Ich hoffe das hilft weiter.. :)
 
Wenn du ohnehin eine NPC in der Zelle hast (Küchenhilfe, oder so was), dann hätte ich eine Alternative:

Kennst du meinen Alchemie-Sorterbot aus Tara's Carpetarium II bzw. £exa's Dwemer Alchemy II?

Der sortiert alle 100+ Zutaten in einzelne Container, mit ein paar Klicks, ohne dass ein Hintergrundscript jeden Stack jeder Zutat einzeln entfernt. Was du vorhast, dürfte sich auf ähnliche Art realisieren lassen. Im Prinzip erlauben Add- und RemoveItem globale Variablen in einer Dialogresultbox, so dass man das benutzen kann. Ich habe NoM leider nie benutzt, also nicht auf dem System, so dass ich nicht abschätzen kann, wie viele Globalen es insgesamt wären. Hört sich nach einer ganzen Menge an, also über wie viele Globalen reden wir hier im Ganzen? Und lassen die sich alle zu Klassen grupperen, wie Obst, Käse, etc. Wenn ja, was wäre das Maximum an Elementen pro Objektklasse und wie viele unterschiedliche Klassen gibt es im ganzen, eine Sammelklasse wie "sonstiges" eingerechnet?

In der Liste sehe ich die größte Schwierigkeit. Man könnte z.B. eine Liste je Klasse machen und eine fixe Zahl von Globalen immer bei Aktivieren einer Liste mit lokalen Variablen auf dem Listenobjekt ersetzen. Dann hätte man eine übersichtliche Anzahl von Globalen, aber halt ein paar Listen.
 
Ich schau mir das später mal an.., is bisschen wie Purchaseable Alchemy Laboratory von Cyrano, oder..?

H1-N1 lawl..!
 
Hallo, hab mal wieder ein kleines Skript-Problem.

Folgende Situation: Der Spieler soll einen NPC finden, der bewusstlos am Boden liegt (habe ich mit SetFatigue 0 hinbekommen). Nach Aktivierung soll ein Dialog erscheinen (bekomme ich auch noch hin). Jetzt das Problem: Nach dem Dialog soll der NPC endgültig sterben. Ich habe schon vieles versucht (SetHealth 0, hinzufügen eines Spruchs der permanent Leben entzieht). Der NPC fällt auch um, gibt aber andauernd die Sprachboxen aus, als würde er permanent sterben. Hat einer vielleicht ein Lösung?

Hier mein Versuch:
short startgreet
short died

if ( menumode == 1 )
return​
endif

setfatigue 0 ; damit NPC bewusstlos am Boden liegt

if ( OnActivate == 1 )
if ( startgreet == 0 )
"Actor2_ID"->ForceGreeting; neuer Actor, da bei Fatigue 0 kein ForceGreeting, Dialog liefert neuen Journaleintrag
set startgreet to 1​
endif​
endif

If (GetJournalIndex "XY" == 10 )
if ( died == 0 )
SetHealth 0
Set died to 1​
endif​
endif

End
 
Probier es mal so - von Script her müsste es eigentlich passen:

Code:
short DoOnce

IF ( MenuMode )
  return

ElseIF ( DoOnce == -1 )
  return

ElseIF ( DoOnce == 0 )
  SetFatigue 0 ; damit NPC bewusstlos am Boden liegt
  IF ( OnActivate == 1 )
    Set DoOnce to 1
    "Actor2_ID"->ForceGreeting
  EndIF
  return

EndIF

IF ( GetJournalIndex "XY" == 10 )
  Set DoOnce to -1
  SetHealth 0
EndIF
Ich kann momentan nichts testen, weil ich unterwegs bin und kein Morrowind auf meinem Notebook habe.
 
  • Like
Reaktionen: Lyali
Hi,

ich habe folgendes Problem:
Im CS kann ich Gegenstände (Statics) irgendwie nur auf die Hälfte der Ursprungsgröße bringen. Jetzt hab ich gedacht ich mach aus einem Static Objekt (angenommen Statue der Azura) ein Misc Objekt und lege ein Script drauf.
Funzt aber nicht. Bleibt bei 0.5 und wird nicht kleiner. Ich möchte aber gerne bei einigen Teilen bis auf Spielzeuggröße
Begin ScaleScript
short DoOnce
if ( doOnce == 1 )
return
endif
SetScale x
set DoOnce to 1
end ScaleScript

Wobei x hier als Platzhalter für die Größe fungiert.
Wo ist mein Gedankenfehler?
 
Ich meine mich zu erinnern, dass die Skalierung nicht unter 0.5 und nicht über 2.0 greift. Man kann zwar im Spiel per Konsolenbefehl andere Werte eingeben, aber ich meine, dass die beim nächsten Laden des Spielstands in den 0.5–2.0-Rahmen zurückgezwängt werden.

Wenn das stimmen sollte, kann man vielleicht die Meshes selbst herunterskalieren und als neue ins Spiel einbinden, um das Objekt kleiner darzustellen.
 
Hallo,

ich habe folgendes Problem:
Ich versuche gerade einen keening, sunder, wraithguard - ähnlichen Script zu erstellen. Die jeweiligen Waffen und der wraithguard-ersetzenden Ring habe ich auch schon drin. Allerdings zeigt mir das CK einen Syntax error an, wenn ich das Script speichern will.

''Syntax Error Line 29
Could not find variable or function ''AAA_ringofsoulsEquipped'' ''

Ich bin kein Scripter oder Programmierer und arbeite nach dem monkey see, monkey do Prinzip. Ich kenne einen Script, der was macht, was ich will und schaue mir diesen dann an und weis ungefähr was er macht, bzw wie er aufgebaut ist. Einen selber schreiben kann ich allerdings nicht.

Gefunden habe ich also den keening Script, allerdings gibt es noch zwei weitere Scripts die damit in Verbindung stehen, wraithguard und eine Globale mit wraithguardEquipped, wie sie im orginal Script zu finden ist. Weswegen ich annehme, dass ich eine Globale brauche, die ringofsoulsEquipped heißt.

Hier mein Scriptversuch:
Code:
Begin AAA_ouch_fireslayer

;hurt PC as long as it is equipped, and ring of souls is not equipped

short extraDamage
short OnPCEquip
short doOnce
float timer
short messageOnce
;global short AAA_ringofsoulsEquipped

if ( MenuMode == 1 )
    return
endif

if ( Player->GetHealth <= 0 )
    return
endif

if ( OnPCEquip == 1 )

    if ( timer < 1 )
        set timer to ( timer + GetSecondsPassed )
        return
    endif

    set timer to 0

     if ( AAA_ringofsoulsEquipped == 0 )
          Set extraDamage to Random 75
          Set extraDamage to ( 0 - extraDamage )
        Set extraDamage to ( extraDamage - 50 )
          player->ModCurrentHealth extraDamage
        if ( messageOnce == 0 )
            Set messageOnce to 1
            MessageBox "Souls trapped inside this weapon are tearing you apart."
        endif
     endif
endif

if ( doOnce == 1 )
    return
endif

if ( Player->GetItemCount "AAA_glass_daedricspider" == 0 )
    return
endif

Set doOnce to 1

End

Wie gesagt, der Script soll quasi das gleiche machen wie Keening und Wraithguard. Hat man den Ring an passiert nichts, hat man den Ring nicht an, macht einem die Waffen schaden und es wird ein Text gezeigt, wie oben im Script vermerkt. Dazu sollen dann noch andere Waffen von dem Set, aber ich denke, dass das dann nur noch Plug and play ist, wenn mein jetziges Problem gelöst ist.

Ich hoffe ihr könnt mir helfen und werde vermutlich in nächster Zeit noch ein paar male auf diesen Thread zurückgreifen.


Gruß: Soul
 
Das habe ich in der Tat nicht.

Das Äquivalent des Originalscripts wäre dann ''wraithguardEquipped'' nehme ich an?

Habe versucht alleine eine Globale zu machen, bin aber beim Suchen nicht fündig geworden oder habe einfach nach den falschen Sachen gesucht. Vermutlich ist es in Wirklichkeit recht einfach und ich nur zu dumm um es zu finden >_>. Denn für die meisten oder alle NPC-bezogene Scripts braucht man glaube ich eine Globale.

Wenn mir da noch jemand helfen könnte wäre das sehr hilfreich und es würde mich auch erst einmal zufrieden stellen was Scripts angeht. Für den nächsten versuch werde ich mir mal das Scripting in Morrowind etwas genauer anschauen. Sollte ja genügend ''Kurse'' zu finden sein, unter anderem hier wie ich gesehen habe.


Gruß: Soul

EDIT:
Sorry, ich bin einfach nur dumm gewesen >_>. Danke für die Hilfe. Ich hoffe ich werde was Globale betrifft keine Hilfe mehr brauchen.
 
Zuletzt bearbeitet:
Hey,

Ich bräuchte Hilfe bei ein paar Scripts.

Zum einen habe ich im Moment Schwierigkeiten einen Script ans Laufen zu bringen der einen NPC ständig wieder belebt.
Mehr soll er eigentlich nicht machen. Ein NPC soll, wenn dieser stirbt, einfach wieder aufstehen.
Versucht habe ich den Ressurect Script aus dem Torspuk aus Sadrith Mora zu nutzen, ohne erfolg und mit dem Spriggan Script bin ich leider auch nicht richtig klar gekommen, um einen Loop zu erzeugen, dass dieser auch immer wieder kommt und nicht nur die drei mal.

Am schönsten wäre es, wenn der NPC wieder auferstehen würde, wenn der Spieler sagen wir mal 5m, so etwas in dem Abstand weg ist, um die Überraschung etwas größer zu machen.


Das war der kleinere Teil denk ich, nun zum zweitem Anliegen.

Ich brauche einen Script, den ich auf einen Gürtel legen kann. Jedes mal wenn der Spieler nun etwas zu sich nimmt, in Form von Essen (Brot, andere Zutaten, die essbar sind, Wasser etc.), soll er einen Zauber abbekommen. Dieser Zauber soll ihn Heilen und Ausdauer wiederherstellen. Oder der Script heilt ihn einfach so, aber ich glaube das es besser wäre, wenn er einfach den Zauber auf den Spieler casten würde.
Falls es ginge, wäre es auch gut, wenn man an für sich etwas zu sich nimmt. Also die komplette Zutaten- und Tränkeliste. Aber ich nehme an, es ist einfacher nur bestimmt Zutaten zu integrieren.

Das 'wäre' es dann auch schon für den Moment.
Ich hoffe ihr könnt mir helfen.

Gruß: Soul
 
[...]mit dem Spriggan Script bin ich leider auch nicht richtig klar gekommen, um einen Loop zu erzeugen, dass dieser auch immer wieder kommt und nicht nur die drei mal.

Ich bin selbst ein grottiger Skripter, aber das Spriggan-Skript würde ich versuchsweise so anpassen:
Code:
begin SOE_rez
;soll NSC endlos wiederbeleben 6 bzw 10 Sekunden nach Tod


short deathvar
short playonce
float time
float xpos
float ypos
float zpos
short doonce

If (MenuMode==1)
   Return
Endif

elseif (deathvar < 1)
   If (ondeath==1)
       set deathvar to 1 
   endif
   Return

elseif (deathvar==1)
   If (onactivate==1)
       return
   endif
   If (playonce==0)
           If (doonce==0)
               set xpos to ( GetPos, X )
               set ypos to ( GetPos, Y )
               set zpos to ( GetPos, Z )
               set zpos to (zpos +30)
               set doonce to 1
           endif
           set time to ( time + GetSecondsPassed )  
           If (time>=6)
               Resurrect
               Startcombat Player
               Set playonce to 1
               Set time to 0
           endif
   endif


   If (ondeath==1)
       set deathvar to 2
   endif
   Return

elseif (deathvar==2)
   If (onactivate==1)
       return
   endif
   if (playonce==1)
           If (doonce==1)
               set xpos to ( GetPos, X )
               set ypos to ( GetPos, Y )
               set zpos to ( GetPos, Z )
               set doonce to 0
           endif
           set time to ( time + GetSecondsPassed )  
           if (time>=10)
               Resurrect
               Startcombat Player
               Set playonce to 0
               Set deathvar to 0
               Set time to 0
           endif
       endif
   endif

end SOE_rez

Wenn ich nichts übersehen habe, müsste der NSC damit nach einem Tod abwechseln nach 6 und 10 Sekunden wiederbelebt werden, was den Spieler dann schön verwirrt. Distanz ist damit zwar nicht unbedingt gegeben, aber der normale Spieler rennt ja eh weiter wie ein Bekloppter. Vielleicht hilft das, bis ein echter Skripter Zeit hat, dir zu helfen.
 
  • Like
Reaktionen: Soul-O-Eater
Danke, funktioniert genau wie es soll. Den Timer passe ich wohl noch was an, aber sonst alles gut.

Ich weis jetzt auch warum meine versuche nicht funktioniert haben. Aus irgendeinem Grund ist der NPC nicht dort gespawnt wo er sollte. Heißt er war erst garnicht dort, wo er im CS plaziert wurde. (Das gleiche auch als ich deinen Script ausprobiert hatte). Darum wurde ich etwas stutzig und habe mal eine neue bzw. ein interior genutzt und nicht ein exterior und siehe da, es funktioniert.

Warum der NPC in der exteriorcell nicht gespawnt ist weis ich zwar immer noch nicht. Vor allem da die 'neue' cell auch eine als exteriorcell geltende interiorcell war. Aber der Script funktioniert und das ist was zählt.

Wenn mir noch wer mit der Gürtel weiterhelfen könnte, wäre das noch eine Ecke besser.


Gruß: Soul
 
Nach langer Inaktivität bin ich mal wieder am Modden und hab natürlich wieder prompt ein paar Fragen, vor allem zu den Leveled Creature:

1.) Ich habe beispielsweise folgendes Leveled Creature erstellt:
PC Level 1 = Kreatur A
PC Level 4 = Kreatur B
PC Level 10 = Kreatur C
Einstellungen: Wahrscheinlichkeit, dass keine Kreatur erscheint 0; kein Häckchen im ersten Kasten bei Calculate etc.

Nun meine eigentliche Frage: Wird mit den obigen Einstellungen immer Kreatur A erscheinen, wenn mein Charakter Level 1 bis 3 ist, Kreatur B bei Level 4 bis 9 und Kreatur C ab Level 10 oder immer nur, wenn mein Charakter genau den angegebenen Level hat? Müsste ich dann jeden Level einzelnen eintragen mit der entsprechenden Kreaturzuweisung? Mein Ziel ist es, dass abhängig vom Charakterlevel garantiert eine ganz bestimmte Kreatur erscheint.

2.) Respawnen Leveled Creature automatisch beim Neuladen der Zelle oder nur, wenn die enthaltenen Kreaturen auf Respawnen eingestellt sind?

3.) Kann man bei Kreaturen mithilfe eines Scripts bestimmte Stats ändern (ähnlich wie bei den NPCs) und wenn ja, welche? Das es nicht 1 zu 1 wie bei den NPCs geht, vermute ich mal aufgrund der unterschiedlichen Fenster im CS bei der jeweiligen Erstellung.
 
1) Zu 1 kann ich so nichts sagen, ich selbst habe nie mit Leveled Listen gearbeitet.

2) Die Kreatur sollte mit Standardeinstelungen beim Respawn der Zelle (ich glaube, das waren 20 Ingametage) wieder erscheinen, wenn ich mich richtig erinnere.

3) Ja, kannst du. Du kannst entsprechend die Werte ändern, die du auch in der Eingabemaske ändern kannst: Level, Health, Fatigue, Magicka, ... Ich glaube, ihre Angriffskraft kannst du nicht ändern.
 
  • Like
Reaktionen: Lyali
Zu 1) Die Tiere aus Level 1 erscheinen immer ab Level 4 us. zusätzlich die weiteren. Die List wird von oben nach unten abgearbeitet und die Leveleingabe bedeutet so viel wie ab.
 
  • Like
Reaktionen: Lyali