Construction Set Der Scriptthread

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. :)
 
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.
 
  • Like
Reaktionen: VDMap
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..?
 
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
 
  • Like
Reaktionen: VDMap
Ja, er wird bewegt, nur ein müh in die Wand für den visuellen Effekt. :) Ich check das später.
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.
 
  • Like
Reaktionen: VDMap
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
 
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?
 
  • Like
Reaktionen: VDMap
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
 
  • Like
Reaktionen: VDMap
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.
 
  • Like
Reaktionen: VDMap
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.
 
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.
 
  • Like
Reaktionen: VDMap
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.
 
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)?
 
  • Like
Reaktionen: Lyali
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:).