Construction Set Der Scriptthread

Dieses Thema im Forum "[MW] Plugins und Mods" wurde erstellt von The Nici, 25. April 2006.

  1. VDMap

    VDMap Neuankömmling

    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 ;)
     
  2. £exa

    £exa Freund des Hauses

    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.
     
  3. VDMap

    VDMap Neuankömmling

    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.. :)
     
  4. £exa

    £exa Freund des Hauses

    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.
     
  5. VDMap

    VDMap Neuankömmling

    Ich schau mir das später mal an.., is bisschen wie Purchaseable Alchemy Laboratory von Cyrano, oder..?

    H1-N1 lawl..!
     
  6. Lyali

    Lyali Abenteurer

    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
     
  7. £exa

    £exa Freund des Hauses

    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.
     
    Lyali gefällt das.
  8. Lyali

    Lyali Abenteurer

    Super, funzt prächtig :).
     
  9. 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?
     
  10. Krschkr

    Krschkr Abenteurer

    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.
     
  11. £exa

    £exa Freund des Hauses

    Skaliere die Mesh. Erspart permanentes Neusetzen der Skalierung via Script und ist resourcenschonender.
     
  12. Soul-O-Eater

    Soul-O-Eater Neuankömmling

    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
     
  13. £exa

    £exa Freund des Hauses

    Hast du die globale Variable unter "Gameplay\Globals" deklariert? Die Fehlermeldung legt nämlich nahe, dass dem nicht so ist.
     
    Soul-O-Eater gefällt das.
  14. Soul-O-Eater

    Soul-O-Eater Neuankömmling

    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: 17. Januar 2018
  15. Soul-O-Eater

    Soul-O-Eater Neuankömmling

    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
     
  16. Krschkr

    Krschkr Abenteurer

    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.
     
    Soul-O-Eater gefällt das.
  17. Soul-O-Eater

    Soul-O-Eater Neuankömmling

    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
     
  18. Lyali

    Lyali Abenteurer

    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.
     
  19. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    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.
     
    Lyali gefällt das.
  20. Apsalar

    Apsalar Bürger

    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.
     
    Lyali gefällt das.
  21. Werbung (Nur für Gäste)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden