Construction Set Der Scriptthread

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

  1. ReneMiner

    ReneMiner Bürger

    Naja, 1000 Einheiten pro Sekunde wegbewegen- sollte eigentlich gehen.
    Wenn Deine Wand ein Activator ist wäre das auch in Ordnung....
    Hörst Du den Sound? Kommt der Journal-Eintrag?

    Ich seh keinen Fehler, hilft nur das: (mach das an die Wand)

    begin Testscriptdiagnose

    short Aktivierbar
    float NeuePosX
    float AlteXPos

    if ( AlteXPos == 0 )
    set AlteXPos to GetPos X
    else

    if ( getPos X != AlteXpos )

    set NeuePosX to GetPos X
    set aktivierbar to -1


    else

    if ( GetJournalIndex "blabla">=123 )
    set aktivierbar to 1
    if ( OnActivate )
    messagebox "aktiviert"
    journal "blabla" 456
    playsound3d "door stone open"
    moveWorld X 123
    endif
    endif

    endif

    endif

    end


    Mach das mal an die Mauer, stell sie aber nicht an X-Position 0 auf (ganz wichtig! Sonst musst Du die 0 in der allerersten Zeile gegen eine andere von X verschiedene Zahl austauschen)

    Dann stell Dich vor die Mauer (inGame)
    öffne die Konsole aber so das Du die Mauer siehst und klick die
    Mauer an so das die ID oben am Rand der Konsole steht.
    Dann tipp ein
    SV [enter]

    und Du bekommst die Werte der Mauer angezeigt, "Aktivierbar" sagt Dir ob das Script überhaupt ausgeführt wird (also die Bedingungen bis hierhin zutreffen) und die Positionen, könntest DU aber auch inGame einfach mit GetPos X abfragen

    Schliess die Konsole, aktiviere die Mauer, kuck was passiert
    Eine Messagebox sollte anzeigen wenn das Aktivieren registriert wurde.
    Schau im Zweifelsfall
    wieder in die Konsole und frag die Werte der Mauer ab.
    Falls alles passiert- aber die Mauer sich noch immer nicht rührt dann versuch es mit
    Move X 1000
    anstelle von MoveWorld, obwohl auch ich davon ausgehe das MoveWorld richtig ist.
    Kannst auch mehrmals probieren, musst nur die Mauer über die Konsole mit
    SetPos X 123
    wieder an die alte Position setzen.
     
    Zuletzt bearbeitet: 23. Dezember 2006
  2. Teridan

    Teridan Mr. Morrowind 2007

    Ja, die Mauer ist ein Activator. Ich habe es mit dem Befehl Move und MoveWorld probiert, genau das selbe Ergebnis: Der Sound wird abgespielt, der passende Tagebucheintrag kommt auch. Nur die blöde Mauer bewegt sich nicht. Das heißt, sie bewegt sich schon, aber nur um genau drei Einheiten. Genauso war es gestern auch schon, allerdings habe ich das aufgrund der geringen Veränderung nur unterschwellig wahrgenommen. Jetzt konnte ich dank deiner Hilfe die Daten erfragen, daher habe ich festgestellt, dass es sich um drei Einheiten an der X-Achse entlang bewegt. Aber wieso drei? Wo steht in meinem Script, dass sie sich um drei Einheiten bewegen soll?

    Wenigstens stehe ich nicht alleine auf dem Schlauch, das lässt mich nicht völlig verzweifeln. :D
     
  3. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Die Bewegung eines Gegenstandes mit diesen Befehlen wird über die Framerate gesteuert. Du musst den Befehl kontinuierlich geben, damit sich die Mauer bewegt.
    Sowas geht zB. mit einem Timer. Ansonsten bewegt sich die Mauer halt nur für einen Frame lang mit 1000 Einheiten pro Sekunde. Scheinbar hast du also eine Framerate von etwa 333 fps...

    Außerdem ist 1000 auch eine ziemlich hohe Geschwindigkeit. Nach meiner Erfahrung werden Geschwindigkeiten über 800 nicht mehr korrekt interpretiert. Ich hatte mal einen Meteor, der sich mit 1500 bewegen sollte aber nur so vor sich hingeschlichen ist. Scheinbar gibt es dort irgendwelche Compilerprobleme.
     
  4. Verganon

    Verganon Angehöriger

    Scriptanfrageeeen~

    1. Eine Tür darf nur dann aufgehen, wenn alle Items aus dem Inventar in eine bestimmte Truhe gelegt wurden.

    2. Bei einer bestimmten HP unterschreitung, muss wird man in einen bestimmten raum teleportiert und vollkommen geheilt.

    3. Wenn ein bestimmtes Item benutzt wird, wird man in einen bestimmten Raum teleportiert.

    4. Wenn eine Bestimmte Tür durchschritten wurde, muss ein anderer Dialog eines NPC's kommen als wenn man durch Aufgeben (skript 2 und 3) zu diesem NPC kommt.

    ___
    sicher bissle viele aber is wichtig T_T
     
  5. The Nici

    The Nici Gebannter Benutzer

    So, ich wollte mal fragen ob mein Script so geht.
    Der Sinn des Scripts ist dass wenn man ein Schalter aktiviert eine Mauer verschwindet.

    Also:
    Code:
    Beginn my_schalterscript
    
    if OnActivate == 1
    wand.disable
    endif
    
    Irgendwie zu kurz. Kann nicht stimmen.
     
  6. Lichtkrieger

    Lichtkrieger Abenteurer

    Weiss nciht ob deins so geht wenn müsste da noch ein -> hin
    Code:
    Beginn my_schalterscript
    
    if ( OnActivate == 1 )
    "wand_ID" -> disable
    endif
    
    End
    Dabei müsste die Wand persitert oder so was sein. Einfach ein Häckchen wo man da eins machen kann, eins machen.

    Ich mache das aus irgendein grund immer anderst:

    Code:
    Begin Schalter
    
    If ( onActivate == 1 )
    
    set Wandverschwinde to 1
    
    endif
    End
    
    Dabei ist Wandverschwinde eine Globale variable
    Der kommt an den Schalter

    Der kommt jetzt an die Wand

    Code:
    Begin Wand
    
    If ( Wandverschwinde == 0 )
    Enable
    
    elseIf (Wandverschwinde == 1 )
    Disable
    
    EndIf
    end
    
    
    und es muss auch so Persidentiert werden weiss gerade nciht wie das heist
     
    Zuletzt bearbeitet: 23. Dezember 2006
  7. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Es heißt "Reference Persistent" und nein bei der zweiten Möglichkeit muss die Wand nicht persistent sein. Was ein riesiger Vorteil ist, wenn man viele Instanzen von einem Objekt machen will (bei Reference Persistent geht nur ein Objekt pro ID).
     
  8. ReneMiner

    ReneMiner Bürger

    Ach ja- das hatte ich vergessen, aber Lichtkrieger hat ja hoffentlich Licht ins Dunkel gebracht, als ich würd's dann so schreiben:

    begin MauerWeg

    float StartPos
    float EndPos
    short Richtung

    if ( MenuMode )
    return
    endif

    if ( StartPos == Endpos)
    set startpos to getpos X
    ; die 1000 sind die gesamte Strecke über die das Teil dann bewegt wird
    set Endpos to StartPos + 1000
    endif


    if ( Richtung == 0 )

    if ( OnActivate == 0 )
    return
    endif

    if ( GetJournalIndex "DarfDasAufmachen" >= erfüllt )

    if ( GetPos X <= Startpos )
    ; die 32 ist der Wert den das Teil pro Sekunde bewegt wird
    ; das Vorzeichen sagt die Richtung in die bewegt wird

    set Richtung to 32
    else
    ; wenn es auch wieder zurückgehen soll: (sonst nicht!)
    set Richtung to -32
    endif

    endif

    elseif ( Richtung < 0 )

    if ( GetPos X> Startpos )
    MoveWorld X Richtung
    else
    set Richtung to 0
    endif

    elseif ( Richtung > 0 )
    if ( GetPos X < Endpos )
    moveworld X Richtung
    else
    set Richtung to 0
    endif

    endif

    end
     
    Zuletzt bearbeitet: 24. Dezember 2006
  9. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Rene, was ist bloß los mit dir...

    An dieser Stelle musst du >= nehmen, denn da beides float-Werte sind, die sich schnell verändern, werden sie niemals den gleichen Wert annehmen. Sondern sich um Bruchteile von Editoreinheiten verfehlen.
    Das musste ich selber leidvoll erfahren.
     
  10. Teridan

    Teridan Mr. Morrowind 2007

    Ich wollte nur kurz anmerken, dass es bei mir nun funktioniert, weil ich einen Timer eingebaut habe. Danke für eure Hilfe. :)
     
  11. Verganon

    Verganon Angehöriger

    ich MUSS leider nochmal drauf zurückkommen:

     
  12. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    1. Nicht zu machen. Sobald ich etwas mehr Zeit habe, such ich einen Thread heraus in dem Rene eine alternative Methode erarbeitet hat.

    2. Ist dein Kampfgebiet in einer Interiorzelle oder in mehreren Exteriorzellen untergebracht? Das beeinflusst meine Herangehensweise.

    3. Schon mal was von einem Teleportamulett gehört? Die Suchfunktion hilft da bestimmt...
    Aber ich will mal nicht so sein:
    begin my_amulett_script

    if ( OnActivate == 1 )
    set my_NPC.weg to 2
    Player->PositionCell xpos ypos zpos zrot "Zellenname"
    endif

    end


    4. Setzte in jedem der drei Scripte ein lokale Variable, die du auf den NPC legst und frag diese im Greeting mit der Funktion Local ab.

    Auf dein NPC legst du folgendes Script:
    begin my_NPC_script

    short weg

    end


    und auf die Tür legst du folgendes:
    begin my_door_script

    if ( OnActivate == 1 )
    set my_NPC.weg to 3
    Activate
    endif

    end


    Im Dialog kannst du dann in der Resultbox den Wert von weg wieder auf 0 setzten und somit einen neuen Durchgang starten.
     
    Verganon gefällt das.
  13. Verganon

    Verganon Angehöriger

    danke erstma.

    1. ich dachte da schon an diese möglichkeit, kann sie aber nicht umsetzen weil ich keine ahnung davon habe: das gewicht was der Spieler trägt MUSS = 0 sein.

    2. die meisten sind exterriors es gibt aber auch interriors.
     
  14. The Nici

    The Nici Gebannter Benutzer

    Beim 1. kannst du einfach durch ein Script sagen der Player legt alle Gegenstände ab oda so, und dann legt er die Rüstung an.
    Gibts net in Arktwend was ähnliches?
     
  15. Verganon

    Verganon Angehöriger

    nici so EINFACH geht das bei mir nich, weil ich einfach nich zurecht komme mitm skripten also bitte nen skript dazuschreiben und nich nur "dumm" labern. sonst könnt ich es ja auch selbst machen, wenn ichs könnte...
     
  16. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Zu dem Thema einfach:
    Es gibt für dieses Problem keine einfache Lösung. Eben nur die von Rene vorgaschlagene:
    http://forums-de.ubi.com/eve/forums/a/tpc/f/398100233/m/3641011624?r=7091031624#7091031624
    Hier gibt es die Kurzform des Ganzen. Einfacher ist es wohl nicht zu machen. Und man kann es immer noch austricksen, wie ich in meinen Versuchen zu Ananke schon feststellen musste.
     
    Verganon gefällt das.
  17. Verganon

    Verganon Angehöriger

    nochmals danke, dann fehlt nurnoch nummer 2 und dann gehts munter weiter in den Kampfgebieten (Killfetzer Crediteintrag is dir sicher sicher und vielleicht noch etwas mehr)
     
  18. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    So, zu 2:
    Da du hauptsächlich Exteriors verwendest, schlage ich dir folgendes vor:

    Beim betreten des Kampfgebiets startes du ein globales Script. Das heißt ein Script das nirgendswo angehängt ist. Dies kannst du durch den Befehl
    StartScript my_global_script
    tun.

    Dieses Script sieht nun in etwa so aus:

    begin my_global_script

    if ( Player->GetHealth < 50 )
    Player->ModCurrentHealth 99999
    set my_NPC.weg to 1
    Player->PositionCell xpos ypos zpos zrot "Zellenname"
    StopScript my_global_script
    endif

    if ( Player->GetCell "Kampfgebietname" == 0 )
    StopScript my_global_script
    endif

    end


    Letzte if-Bedingung ist notwendig um das Script zu beenden, wenn der Spieler das Gebiet auf anderem Weg verlässt.
     
  19. ReneMiner

    ReneMiner Bürger

    Falsch Killfetzer:

    if StartPos == Endpos, das heisst wenn Start und Ziel noch den gleichen Wert haben, nämlich 0, genauer gesagt nur im allerallerersten Scriptdurchlauf will ich die Werte festlegen. Spar mir eine zusätzliche DoOnce-Variable ;)

    Und zu dem Post hier drüber:
    Es gibt kein
    if ( Player->GetCell "XYZ-Zelle" ) !!! das solteest Du eigentlich wissen.
    Der Befehl lautet
    if ( GetPCCell "xyz-zelle" )
     
    Zuletzt bearbeitet: 25. Dezember 2006
  20. Killfetzer

    Killfetzer Super-Moderator Mitarbeiter

    Okay, wenn du das nur einmal durchlaufen willst, passt das ja.

    Zum Anderen: :oops:
     
  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