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

    Es sind Kreaturen, und keine NPC's. Es passiert nur innerhalb der Zelle wo auch die Activators sind. Nach dem aktivieren gibt es noch genau zwei Kreaturen mit einem Script, ForceGreeting usw., nur bei denen werden mir die Sachen, beim Greeting aus dem Inventar entfernt. Alles was bei den zwei Kreaturen im Dialogue bzw. Result steht hat keine Verbindung mit den Activatoren.

    Die Aktivator Scripts:
    Code:
    begin _vdm_tomb_door_script_01
    
    
    short timer
    short moving
    short state
    
    if ( MenuMode == 1 )
      Return
    endif
    
    if ( OnActivate == 1 )
      if ( state == 0 )
        if ( Player->GetItemCount, "_vdm_stone_plate_01" > 0 )
          Set moving to 1
          Set state to 10
          Set timer to 0
        Move y 30
          PlaySound3D "Door Stone Open"
        else
          MessageBox "plate?"
        endif
      endif
    endif
    
    if ( moving == 1 )
        "_vdm_act_stone_plate_01"->enable
        "_vdm_red_01"->enable
        Player->RemoveItem "_vdm_stone_plate_01" 1
    set timer to ( timer + GetSecondsPassed )
        if ( timer < 5 )
        "_vdm_metal_bars_02"->MoveWorld Z -50
    elseif ( timer > 15 )
        "_vdm_metal_bars_02"->SetAtStart
        set State to 0
        set timer to 0
    elseif ( timer > 10 )
        "_vdm_metal_bars_02"->MoveWorld Z 50
        endif
    endif
    
    End
    
    Ich glaub die "bars" bewegen sich unendlich, könnte vllt auch noch verbessert werden. :)
     
  2. £exa

    £exa Freund des Hauses

    Versuch das mal:
    Code:
    
    begin _vdm_tomb_door_script_01
    short Timer
    short State
    
    IF ( MenuMode == 1 )
      return
    EndIF
    
    IF ( State == 0 )
    
      IF ( OnActivate == 1 )
        IF ( Player->GetItemCount, "_vdm_stone_plate_01" > 0 )
          set State to 1
          set Timer to ( 0 * GetSecondsPassed )
          Move Y 30
          PlaySound3D "Door Stone Open"
        ELSE
          MessageBox "plate?"
        EndIF
      EndIF
    
    ELSE
    
      IF ( State == 1 )
        "_vdm_act_stone_plate_01"->enable
        "_vdm_red_01"->enable
        Player->RemoveItem "_vdm_stone_plate_01" 1
        set State to 2
      EndIF
    
      set Timer to ( Timer + GetSecondsPassed )
    
      IF ( Timer < 5 )
        "_vdm_metal_bars_02"->MoveWorld Z -50
      ElseIF ( Timer > 15 )
        "_vdm_metal_bars_02"->SetAtStart
        set State to 0
      ElseIF ( timer > 10 )
        "_vdm_metal_bars_02"->MoveWorld Z 50
      EndIF
    
    EndIF
    
    end
    Ich hab allerdings noch ein Problem mit der Zeile "Move Y 30" - wird der Aktivator bewegt? Falls ja, müsste man das wohl noch überarbeiten und auch am Ende ggf. wieder rückgängig machen. Da ich nicht weiß, was du da vorhast, habe ich das erstmal ignoriert.
     
    VDMap gefällt das.
  3. VDMap

    VDMap Neuankömmling

    Ja, er wird bewegt, nur ein müh in die Wand für den visuellen Effekt. :) Ich check das später.
     
  4. VDMap

    VDMap Neuankömmling

    LOL, die Sachen werden nicht mehr nochmal aus dem Inventar entfernt, weiß auch nich was das soll... :D Hab es nur mit einen von den vieren probiert.
    Die "bars" bewegen sich immer noch unendlich durch die zelle, und die enableten Objekte verschwinden sofort wieder. Die sollten schon bleiben.

    An was lag's..?
     
  5. £exa

    £exa Freund des Hauses

    Das ist völlig klar, weil dein Script ziemlich vermurkst war. Du hast nämlich die (unnütze) Variable moving verwendet, um den unteren Scriptteil zu aktivieren und in dem steckt ein RemoveItem, das ab dem Moment jeden Frame ausgelöst wurde. Wird dabei zusätzlich ein Dialogfenster geöffnet, erzeugt RemoveItem eine Ausgabe in der Dialogbox. Zusätzlich kam dann noch die Thematik der unendlichen Bewegung hinzu, das Script wurde nie beendet. Warum erkläre ich gleich, erst einmal die andere Sache:

    Meine Überarbeitung deaktiviert nichts, ergo muss etwas anderes die Teile direkt wieder verstecken. Vermutlich deren eigenes lokales Script. Ich würde sagen, du prüfst mal was für Scripts sonst noch in der Zelle oder im Hintergrund laufen. Poste sie notfalls. Bzw. poste mir das Script, was die Sachen ursprünglich versteckt.

    Was den Bug mit der Bewegung angeht... -.-" Mein Fehler, oder besser meine Vergesslichkeit.

    Ich hab aus deinem Script bei den Deklarationen die Moving Variable gelöscht und dabei schlicht vergessen, einen grundlegenden Fehler zu verbessern, der genau dazu führt, was du sagst - nämlich, dass die Stangen unendlich nach unten driften. Und das obwohl ich ihn erkannt hatte, darum hatte ich das Script ja umgeschrieben. Also, woran liegt's:

    short Timer

    Das ist der Tübeläter, nimm mal lieber:

    float Timer

    Dann klappt's auch mit dem Start/Stop/Reset. Aber du sollst ja auch was lernen ^_^

    Eine Short-Variable ist ein Integer, kann also keine Dezimalstellen haben. Und damit hast du die Antwort. Sofern dein Rechner nicht mit unter 1 fps buchstäblich dahinkriecht, wird GetSecondsPassed grundsätzlich irgendeine Zahl in der Größenordnung 0.0xx oder kleiner zurückgeben. Beim Versuch, den Timer mit einer Dezimale zu inkrementieren, schneidet Morrowind die Dezimalen einfach ab. Es kommt also immer wieder der Ursprungswert heraus, der Timer wird nie größer und da er somit immer kleiner 5 ist, hört die Bewegung nie auf. Eigentlich ganz logisch, wenn man es weiß :D
     
    VDMap gefällt das.
  6. £exa

    £exa Freund des Hauses

    Bevor ich es vergesse:

    Wenn der Aktivator einen Tick bewegt wird, ist das kein Problem - ich würde das zwar ein wenig anders lösen, aber es geht natürlich auch so. Die Sache ist nur folgende: Wenn man das Teil mehrfach drückt kann (ich weiss nicht, ob das gehen soll) und man dann die Stellung nicht zurücksetzt, wird das Teil irgendwann komplett in der Wand verschwinden. Du solltest also auch noch ein weiteres SetAtStart für den Aktivator in den "Timer > 15" IF-Block setzen, um das zu verhindern. Selbst wenn das Ding nicht mehrfach gedrückt werden kann, sieht es so einfach besser aus.
     
    VDMap gefällt das.
  7. VDMap

    VDMap Neuankömmling

    Ich dachte da steht float.., wohl übersehn ;)
    Der Aktivator soll nur einmal aktivierbar sein. Eigentlich ist es auch suboptimal das die bars wieder zurück gehen, weil PC dann nicht zurück kann.
    Wie stoppt man das movement von den bars, vllt SetPos?
    Und nochmal zu den enableten Objekten.., das soll quasi den "key" darstellen den der PC da reingesteckt hat.., der sollte auch enablet bleiben, genau wie das light..

    Disabled hab ich die Aktivatoren so:

    Code:
    if ( OnActivate ==1 )
        return
        endif
    
    
    if ( GetDisabled == 0 )
        disable
          endif 
    Noch ne Frage: Wie mach ich das disablete Aktivatoren mit sound keine sound abspielen.

    Danke
     
  8. £exa

    £exa Freund des Hauses

    Hm, dann überarbeite ich das ganze Ding. Benutz das hier für den Türöffner:
    Code:
    
    begin _vdm_tomb_door_script_01
    float Timer
    short State
    
    IF ( MenuMode == 1 )
      return
    EndIF
    
    IF ( State == -1 )
      return
    
    ElseIF ( State == 0 )
      "_vdm_act_stone_plate_01"->disable
      "_vdm_red_01"->disable
      set State to 1
    
    ElseIF ( State == 1 )
      IF ( OnActivate == 1 )
        IF ( Player->GetItemCount, "_vdm_stone_plate_01" > 0 )
          Move Y 30 ; hier solltest du ein simples SetPos nutzen, um den Drücken zu simulieren.
          set Timer to ( 0 * GetSecondsPassed )
          PlaySound3D "Door Stone Open"
          set State to 2
        ELSE
          MessageBox "plate?"
        EndIF
      EndIF
    
    ElseIF ( State == 2 )
      "_vdm_act_stone_plate_01"->enable
      "_vdm_red_01"->enable
      Player->RemoveItem "_vdm_stone_plate_01" 1
      set State to 3
    
    ElseIF ( State == 3 )
      set Timer to ( Timer + GetSecondsPassed )
      IF ( Timer < 5 )
        "_vdm_metal_bars_02"->MoveWorld Z -50
      ELSE
        "_vdm_metal_bars_02"->SetPos, Z, [FINAL ZVALUE]
        set State to -1
      EndIF
    
    EndIF
    
    end
    Du musst allerdings noch den Endwert für Z für die Bars eintragen.

    Was die anderen Aktivatoren angeht... logisch, das sie wieder deaktiviert werden.
    Lösch die Scripts von den Aktivatoren. Mein neues Script übernimmt das disablen.

    Versuch's mal damit.

    Was den Sound angeht - welche Mesh verwendest du?
     
    VDMap gefällt das.
  9. VDMap

    VDMap Neuankömmling

    Danke :)

    Ich benutze z.B. den Dwemer Dynamo, auch diverse Steam Meshes.
     
  10. £exa

    £exa Freund des Hauses

    Gut, das sind Standard Sachen. Es gibt nämlich einige scheußliche Meshes, bei denen der Sound in die Mesh eingebaut wurde :D

    Also, in dem Fall tragen die Teile üblicherweise das Standard Machinery Script - und deines sollte dann etwa so ausschauen:

    Code:
    
    begin Sound_Machinery
    
    IF ( GetDisabled )
      IF ( GetSoundPlaying "Machinery" == 1 )
        StopSound "Machinery"
      EndIF
    ELSE
      IF ( CellChanged == 0 )
        IF ( GetSoundPlaying "Machinery" == 0 )
          PlayLoopSound3DVP "Machinery", 1.0, 1.0
        EndIF
      EndIF
    EndIF
    
    end
    
     
    VDMap gefällt das.
  11. VDMap

    VDMap Neuankömmling

    Hallo, kann es sein das die Sound-Loop-Skripte auf die Performance gehen? Oder vllt Lichter mit Sound?
     
  12. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Kurze Antwort: Ja. ;)

    Lange Antwort: Naja, alles geht auf die Performance. Gerade Scripte im Allgemeinen und 3D Sounds sind meiner Erfahrung nach recht belastend für die Engine. Also dürften Scripts, die 3D Sounds abspielen recht weit oben in der Liste stehen, bei dem was Performance raubt.
     
    VDMap gefällt das.
  13. VDMap

    VDMap Neuankömmling

    Häng hier bei 0-2 FPS nach dem enablen. :D
     
  14. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Wie viele von den Maschinen hast du in die Zelle gebaut? o_O
     
  15. VDMap

    VDMap Neuankömmling

    Weniger als 10, da kommt noch was. ;)

    Aber ich hab ca. 130 von den light_dwrv_neon01. Vllt liegt's an denen. Die haben nur den standart light sound.
     
  16. £exa

    £exa Freund des Hauses

    Holy Cow... reduzieren!

    Dwemer Neons sind besonders übel, weil sie gleichzeitig Lichtquellen, Scriptholder und Soundquellen sind - da solltest du definitiv etwas ausdünnen und Scripts entfernen. Wenn Lichter eng aneinander sind, kann man z.B. den Sound entfernen und einen unsichtbaren Marker als Soundquelle benutzen und in die Mitte zwischen die Teile schieben. Oder ganz auf die Sounds verzichten. Oder notfalls alle paar Frames Distanzprüfungen machen und die Sounds nur ausführen, wenn der Spieler halbwegs in der Nähe ist.
     
    VDMap gefällt das.
  17. VDMap

    VDMap Neuankömmling

    Okay, werde ich mir zu herzen nehmen, und die Zelle aufteilen.., ist sowieso schon zu groß. :confused:
     
  18. Lyali

    Lyali Abenteurer

    Hi, ich habe mal eine, vielleicht blöde, Frage, aber ist es möglich, durch Skriptveränderungen oder neue globale Variablen bisher funktionierende Skripte, die von den Veränderungen gar nicht betroffen sind, zu zerschießen? Denn nach dem Erstellen einer neuen globalen Variable klappt eine anderes Skript mit einer Global-Abfrage nicht mehr. Oder ist es vielleicht sogar möglich damit ganze Skriptfunktionen im CS zu zerschießen? Frage deshalb, da selbst bei einer früheren Sicherung, bei der die Global noch nicht erstellt wurde, das Skript nicht mehr funktionierte.
     
  19. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Jein. Natürlich kannst du nichts zerstören, das mit den Änderungen nichts zu tun hat. Aber es kann durchaus sein, dass du ein Script unbrauchbar machen kannst, wenn du deine globale Varable so heißt, wie eine lokale Variable in diesem Script.

    Könntest du vielleicht etwas konkreter werden? Wie heißen die Variablen, welche Script sind betroffen, wie äußert sich der Ausfall im Spiel (Text der Fehlermeldung)?
     
    Lyali gefällt das.
  20. Lyali

    Lyali Abenteurer

    Eine Fehlermeldung gab es nicht. Ich hatte in der gleichen Interiorzelle zwei Activatoren mit ähnlicher Buttonabfrage (short-Variablen Button und messageon waren in beiden Skripten deklariert) und bei dem einen Skript auch noch eine if-Abfrage mit einem Journaleintrag.
    Aber Not macht erfinderisch, ich habe den einen Activator rausgeschmissen und die Journalabfrage gestrichen. Jetzt klappt es wieder:).
     
  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