Nirn.de

Gast

Thema: Script nach Bearbeitung zerlegt  (Gelesen 277 mal)

  • Bettler
    • Neuling
Ich habe mich daran gemacht ein schon vor langer Zeit von mir in meiner Mod bearbeitetes Script nochmals zu verbessern. Zuvor funktionierte es gut, ich wollte es nur weiter ausdifferenzieren. Und nachdem ich es bearbeitet habe tut es überhaupt nicht mehr das was es soll.

Zum Hintergrund: Es soll ein Script sein, das auf Activators liegt, von denen es in der Spielwelt mehrere gibt. Man soll also an verschiedenen Stellen die Möglichkeit haben, das Script auszulösen, an jedem Activator allerdings nur einmal. Hat man es dort einmal angewählt kann man es theoretisch noch einmal an den anderen versuchen, dort wird man allerdings nicht noch mehr bekommen. Allerdings gibt es noch eine "Upgrade-Version" des Scriptes, das nur auf einem Activator leigt, den man erst später, also danach finden können soll und dann auch noch aktivieren können soll.

Das Blöde ist nun: Wenn ich das Script so, wie ich es hier posten werde verwende, dann kann ich in der Message-Box-Auswahl zwar auf "Ja" klicken, danach beendet sich das Script jedoch, ohne den weiteren Programmablauf abzuwickeln. Es springt direkt zum Ende und ich weiß auf Teufel komm raus einfach nicht wo ich den Fehler gemacht habe, der dazu führt.
Ich hoffe ihr blickt durch das Script durch und könnt mir zeigen, was ich falsch gemacht habe.

Hier das Script:

scriptName AAABorbaradianismus
short Doonce
short Activated
short Button
ref target

begin onActivate
if IsActionRef player == 1
   if activated == 0
      MessageBox "Wollt Ihr am Seelengötzen beten?", "Ja", "Nein"
      set activated to 1
   endif
endif
end   

begin gamemode
   if activated == 1
   set button to GetButtonPressed
      if button == -1
         return
      elseif button == 0
         if doonce == 0
             if player.getfactionrank AAABorbaradianerFriendly == 0
               player.setfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr seid nun ein Jünger Borbarads."
               playsound NPCXivilaiDeath
               player.modpcinfamy 1
               cast AAABorBluttribut2 player
               player.addspell AAABorMagieSteigern
               player.addspell AAABorBrenneToterStoff
               player.addspell AAABorLeidensbund
               player.addspell AaaBorSkelettarius
               player.addspell AaaBorTotesHandle
               player.addspell AAABorMagischerRaub
               player.addspell AAABorHorriphobus
               player.addspell AAABorHartesSchmelze
               player.addspell AAABorZeichenEidbrecher
               player.addspell AAABorMagieBlutzauberei
               player.additem AAABlankSheet2 1
               set doonce to 1
               set activated to 0
            elseif player.getfactionrank AAABorbaradianerFriendly ==1
               player.modfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr habt Euch den Lehren Borbarads weiter verpflichtet."
               playsound NPCXivilaiDeath
               player.modpcinfamy 1
               cast AAABorBluttribut2 player
               player.addspell AAABorMagieSteigern
               player.addspell AAABorBrenneToterStoff
               player.addspell AAABorLeidensbund
               player.addspell AaaBorSkelettarius
               player.addspell AaaBorTotesHandle
               player.addspell AAABorMagischerRaub
               player.addspell AAABorHorriphobus
               player.addspell AAABorHartesSchmelze
               player.addspell AAABorZeichenEidbrecher
               player.addspell AAABorMagieBlutzauberei
               player.additem AAABlankSheet2 1
               set doonce to 1
               set activated to 0
            elseif player.getfactionrank AaaBorbaradianerFriendly >= 2
               player.setfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr seid bereits ein Jünger Borbarads."
               set doonce to 1
               set activated to 0
            endif
         elseif doonce == 1
            MessageBox "Ihr seid bereits ein Jünger Borbarads."
            set activated to 0
         endif
      elseif button == 1
         set activated to 0
      endif
   endif
end
  13.09.2017, 00:10
  • Offline


  • Skelett-Krieger
    • Untot
Sollte das

  set button to GetButtonPressed

 nicht in onActivate nach der Messagebox kommen?

Zwischen onActivate und gamemode kann nämlich viel Zeit verstreichen und es ist fraglich, ob er zwischen zwei Event-Handlern überhaupt noch "weiß" welcher Button geklickt wurde.
"Maiq has heard the people of Skyrim are better looking than the people of Cyrodiil. Maiq has no opinion on the matter. All people are beautiful to him."
  15.09.2017, 19:08
  • Offline
  • Google+


  • Abenteurer
    • Neuling
Nein.
Wenn es im OnActivate-Block direkt nach der Messagebox kommt, hat der Spieler nicht einmal einen Frame Zeit um eine Auswahl zu treffen, was es also unmöglich macht der Variable den richtigen Wert eines gedrückten Button zu geben.

Ist schon richtig, dass es im GameMode abgefragt wird. Der wird nämlich gleich nach der Messagebox ausgelöst und dort kann der richtige Wert des gedrückten Buttons problemslos abgefragt werden.


Mir fällt leider auch nicht wirklich ein Problem auf.
Du sagst du hast mehrere Objekte die das selbe Script verwenden? Das sollte eigentlich kein Problem sein.
Jedes Objekt das du im Worldspace oder sonst wo platzierst bekommt eine eigene Referenz und wird seine eigene Kopie dieses Scripts ausführen.
Das heißt jedes Objekt wird ein eigenes "DoOnce", "Activated", "button", etc. haben.
Wobei ich mir nicht sicher bin, ob du die Objekte auch als "Persistent Reference" im WorldSpace oder wo auch immer du sie platziert hast definieren musst.

Andernfalls könnte es doch sein, dass dieses Script für alle Objekte gültig ist und eben keinen Unterschied macht. Wie man ein Objekt als "Persistent Reference" definiert weißt du?


Wenn das noch immer nichts hilft könntest du nach dem setzen der "Persistent Reference" einen Schritt weiter gehen und allen Objekten (hoffentlich sind es nicht viele) eine Referenzvariable zuweisen (einfach irgendeinen Namen im Eigenschaftsfenster des Objekts im Worldspace oder wo auch immer reinschreiben).

Dann könntest du im Script mittels "GetSelf" abfragen welchen Seelengötzen dein Spieler gerade aktiviert hat, indem du "GetSelf" mit der Referenzvariabe des Seelengötzen vergleichst.
Dementsprechend kannst du auch rausfinden, ob du bei diesem Götzen schon warst oder nicht.

Allerdings würde es mich wundern wenn das notwendig ist.
Ich hab mal ein ähnliches Script geschrieben (auch mehrere Objekte mit nur einem Script gehabt), aber das hat da keine Probleme verursacht und musste auch nicht explizit nach der Referenz abgefragt werden.
Allerdings ist das schon sehr lange her, also kann ich nicht mit Sicherheit sagen ob ich auch ähnliche Probleme hatte und wie genau ich die gelöst hab.
« Letzte Änderung: 13.10.2017, 11:40 von DerJorg »
  13.10.2017, 11:27
  • Offline


  • Skelett-Krieger
    • Untot
Ist schon richtig, dass es im GameMode abgefragt wird. Der wird nämlich gleich nach der Messagebox ausgelöst und dort kann der richtige Wert des gedrückten Buttons problemslos abgefragt werden.

Laut dieser Anleitung muss bei Oblivion die MessageBox und das GetButtonPressed im selben Frame ablaufen. Du sagst zwar, dass dies auch der Fall ist, wenn die MessageBox in OnActivate steht und das GetButtonPressed im GameMode, aber so funktioniert es ja anscheinend nicht.

Ich würde als erstes mal versuchen, den gesamten Code ins GameMode Event zu verlagern. Sie wird es in dem Beispiel auch gemacht.

@OP: Wenn du hier Fragen postest, wäre das Mindeste, dass du Menschen, die deine Frage beantworten, auch eine Antwort gönnst. Mir geht es nicht um Kudos oder Danksagungen. Aber zumindest ein Hinweis, dass die Antwort gelesen wurde, wäre nett.

Dies ist mittlerweile der 5. Fall in Folge, wo ich jemandem auf eine Frage eine Antwort geschrieben habe, teilweise mehr als eine halbe Stunde recherchiert habe, und nicht einmal eine einsilbige Antwort erhalten habe. Ich beginne mich zu fragen, wozu ich hier überhaupt noch antworte - und immer öfter tue ich es auch nicht.
"Maiq has heard the people of Skyrim are better looking than the people of Cyrodiil. Maiq has no opinion on the matter. All people are beautiful to him."
  13.10.2017, 12:39
  • Offline
  • Google+


  • Abenteurer
    • Neuling
Ich hab keine Ahnung wer die Anleitung geschrieben hat, das ist aber Schwachsinn.

GetButtonPressed gibt solange den Wert des letzten vom Spieler gedrückten Buttons zurück, bis die Funktion einmal ausgeführt wird.
Das kann selbst nach einer Stunde im Spiel noch passieren (obgleich der Spieler bisweilen vielleicht eine andere Messagebox ausgeführt hat, die den Result der vorhergehenden natürlich aushebelt). Rein zeit-technisch kann es gar nicht funktionieren GetButtonPressed direkt nach dem Triggern der Messagebox abzufragen.
Und weil GetButtonPressed nur einmal den letzten Wert (und dann immer -1) zurückgibt, ist eine Verwendung in einem If...ElseIf...EndIf-Block als Condition unmöglich, weil sie nur bei der ersten Abfrage den richtigen Wert zurückgibt.
Stattdessen speichert man den Wert in eine Variable.

Nur um das zu veranschaulichen:
OnActivate wird ausgeführt, wenn der Spieler den Activator "benutzt".
In diesem Block wird eine Messagebox ausgeführt, welche automatisch den MenuMode-Block ausführt (selbst wenn keiner definiert ist, befindet sich das Spiel in diesem Modus). Solange die Messagebox aktiv ist, wird nur der MenuMode ausgeführt.
Aber, noch bevor dieser MenuMode ausgeführt wird, möchte das Spiel bereits den gedrückten Button wissen (OnActivate-Block wird beendet. Eine Messagebox unterbricht das Ausführen des aktuellen Blocks der die Box getriggert hat nicht) den das Spiel aber gar nicht wissen kann, weil der Spieler in dieser Nanosekunde keine Möglichkeit hatte den Button zu drücken.
GetButtonPressed im MenuMode auszuführen, bringt auch nichts, da nach Drücken des Buttons der MenuMode beendet wird und das Spiel im MenuMode-Block doch nicht weiß welcher Button gedrückt wurde, da dieser Wert erst nach Ende des MenuModes übergeben wird.
Gamebryo kann leider nicht hellsehen, ansonsten müsste man nicht ärgerlich daran rumprogrammieren.

Demnach ist der GameMode die sicherste Möglichkeit GetButtonPressed zu aktivieren.
Ich würde mich eher an das professionelle Wiki halten, anstatt eine Seite die empfiehlt die QuestDelayTime auf 0.001 zu setzen.
Wenn du im GameMode Hotkeys abfragst (also mit "IsKeyPressed" Tasten die der Spieler auf der Tastatur drückt), reicht eine Intervall von 0.10 vollkommen aus, um die Tastenanschläge genau zu berechnen. Wem das doch noch zu ungenau ist, kann auch auf 0.01 runtergehen, aber 0.001 ist komplett übertrieben.
Hier mal das Beispiel vom CS Wiki:
https://cs.elderscrolls.com/index.php?title=GetButtonPressed
Zitat
Code
int button
int buttonPressed

Begin OnActivate
  if IsActionRef player == 1
    messagebox "You have 3 choices.", "Choice 1", "Choice 2", "Choice 3"
    set buttonPressed to 1
  endif
end

begin gamemode
  if buttonPressed == 1
    set button to getbuttonpressed

    if button > -1
      if button == 0
        ; choice 1
        set buttonPressed to 0
      elseif button == 1
        ; choice 2
        set buttonPressed to 0
      elseif button == 2
        ; choice 3
        set buttonPressed to 0
      endif
    endif
  endif
end



Wobei ich dir im Bezug auf die Antwort Recht gebe.
Ich hab Symbiarch bereits einmal ausgeholfen, da war er ziemlich gut bei der Sache.
Naja, vielleicht hat er es ja schon selber gelöst?

und immer öfter tue ich es auch nicht.

Mach dir nichts draus.
Ich schau auch nur noch sporadisch hier rein und sehe dann immer diese verrückten Elche die alle angreifen wollen ganz oben stehen.
Naja, den Clicks zu urteilen gibt's Leute die das echt lesen.

Einzig der Gamebryo-Code weckt oft mein Interesse, aber es gibt hier kaum Anfragen deswegen.
« Letzte Änderung: 13.10.2017, 15:29 von DerJorg »
  13.10.2017, 13:51
  • Offline


  • Bettler
    • Neuling
Leider hatte ich in den letzten WOchen nicht viel Zeit mich mit Modding und den Vorgängen hier im Forum zu befassen und konnte das nicht mehr aktiv verfolgen. Die Arbeit an der Mod ist dementsprechend etwas liegen geblieben. Ich habe leider aus Zeitgründen längert nichts mehr an der Mod gemacht, es ist eine gewisse Zeit lang liegen geblieben und ich bin hier auch nicht mehr wirklich aktiv gewesen. Dazu kam jetzt leider bei diesen Script, dass ich (Wahrscheinlich wegen einer einfachen DEnkblockade) einfach nicht mehr weiterkam und das Script erstmal habe ruhen lassen, bis entweder mir oder den hier Anwesenden im Forum etwas einfallen würde.
Jetzt habe ich mich, nach einigen erfolglosen Versuchen in der Vergangenheit, nochmal an das Script rangesetzt, den alten Skriptcode genommen, bevor ich ihn verändert hatte. Da standen die fraglichen Zeilen tatsächlich noch ganz am Anfang in der BeginGamemode-Zeile drin. Die Variablen "Doonce" und "Activated", deren Wert zuerst abgefragt werden, bevor das Script entscheidet wie es fortfahren soll, habe ich weiter an den Anfang gesetzt. Er überprüft sie gleich und fährt dann irgednwie richtig fort. Offenbar hat er es jetzt geschnallt welchen Wert welche Variablen haben und arbeitet da Script korrekt ab. Irgendwie funktionierte es da und nachdem ich jetzt den Passus nochmal an den anfang gesetzt und den Rest dem untergeordnet habe funktioniert es nun doch. Es funktioniert. Das Script tut was es soll, offenbar ist es die "richtige Reihenfolge" in der man das ganze schreiben muss, damit die Routine des Scripts es korrekt abarbeitet. Ganz und gar verstanden, wie das mit den Zusammenhängen zwischen GetButtonPressed-Kommando und dem Begin-Gamemode-Befehl funktioniert habe ich jedoch immer noch nicht.

Die grobe Struktur von Scripts mit Message-Boxen und den "Ja"/"Nein"-Abfragen habe ich mir irgendwann mal abgekupfert und dann nur noch mit dem fraglichen Inhalt gefüllt. Nun war es ausnahmsweise mal so, dass mehr als sonst üblich zusäzliche, abzufragende Variablen eingebaut werden mussten. Damit sah das Script nun anders aus als sonst und irgednwie muss ich dabei dann doc etwas an die falsche Stelle gesetzt haben. Das ich die Hintergründe dieses "Standard-Scripts" und dessen was hinter so Abfragen wie "GetButtonPressed" eigentlich für Abläufe stehen, immer noch nicht wirklich verstehe, obwohl ich schon so lange damit arbeite ärgert mich tatsächlich schon ein wenig...

Ungeachtet dessen darf ich mich bei denen bedanken, die sich hier so viel Mühe gemacht haben, das Script durchzugucken und zu dessen Funktionen nachzulesen. Es freut mich das das Script dementsprechend funktioniert und zumindest das Prinzip, warum das Script nicht dazu kommt, die Variablen zum richtigen Zeitpunkt zu überprüfen und dann mit deren richtigem Wert fortzufahren, habe ich einigermaßen begriffen. Das ist auch für mich nicht unlogisch. Wieviel später genau die Abfrage der Variablen hingegen erfolgen sollte, wie viel "Zeit" man dem Script gönnen soll, den richtigen Wert der Variablen zurückzugeben um dann richtig weiter zu machen, kann ich auch noch nicht so nachvollziehen - nur dass man es eben etwas später (also weiter unten im Script, im GameMode-Block) einbauen muss, damit es funktioniert.
  14.10.2017, 01:11
  • Offline


  • Abenteurer
    • Neuling
Hey,
danke für die Antwort.

Magst du dein funktionierendes Script hier posten?
Mich würde interessieren wie es jetzt aussieht. :)
  14.10.2017, 13:03
  • Offline


  • Bettler
    • Neuling
Den aktuell funktionierenden Skriptcode des Scripts will ich an dieser Stelle gerne posten. Vielleicht ist ja auch gleich augenfällig, was dazu führt, dass das Script arbeitet, wie es soll:

scriptName AAABorbaradianismus

short Doonce
short Activated
short Button
ref target

begin onActivate
if IsActionRef player == 1
   if activated == 0
      MessageBox "Wollt Ihr am Seelengötzen beten?", "Ja", "Nein"
      set activated to 1
   endif
endif
end   

begin gamemode
   if activated == 1
   set button to GetButtonPressed
      if button == -1
         return
      elseif button == 0
         set activated to 0
         if doonce == 0
            set doonce to 1
             if player.getfactionrank AAABorbaradianerFriendly <= 0
               player.setfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr seid nun ein Jünger Borbarads."
               playsound NPCXivilaiDeath
               player.modpcinfamy 1
               cast AAABorBluttribut2 player
               player.addspell AAABorMagieSteigern
               player.addspell AAABorBrenneToterStoff
               player.addspell AAABorLeidensbund
               player.addspell AaaBorSkelettarius
               player.addspell AaaBorTotesHandle
               player.addspell AAABorMagischerRaub
               player.addspell AAABorHorriphobus
               player.addspell AAABorHartesSchmelze
               player.addspell AAABorZeichenEidbrecher
               player.additem AAABlankSheet2 1
            elseif player.getfactionrank AAABorbaradianerFriendly ==1
               player.modfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr habt Euch den Lehren Borbarads weiter verpflichtet."
               playsound NPCXivilaiDeath
               player.modpcinfamy 1
               cast AAABorBluttribut2 player
               player.addspell AAABorMagieSteigern
               player.addspell AAABorBrenneToterStoff
               player.addspell AAABorLeidensbund
               player.addspell AaaBorSkelettarius
               player.addspell AaaBorTotesHandle
               player.addspell AAABorMagischerRaub
               player.addspell AAABorHorriphobus
               player.addspell AAABorHartesSchmelze
               player.addspell AAABorZeichenEidbrecher
               player.additem AAABlankSheet2 1
            elseif player.getfactionrank AaaBorbaradianerFriendly >= 2
               player.setfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr seid bereits ein Jünger Borbarads."
            endif
         elseif doonce == 1
            MessageBox "Ihr seid bereits ein Jünger Borbarads."
         endif
      elseif button == 1
         set activated to 0
      endif
   endif
end

Dazu gehört eben noch ein zweiter Activator, an dem man den vollen Zugriff auf alle anderen, auch mächtigeren Zauber bekommt, die man an den leichter zu findenen Activatoren nicht bekommen kann:
scriptName AAABorbaradianismusVoll

short Doonce
short Activated
short Button
ref target

begin onActivate
if IsActionRef player == 1
   if activated == 0
      MessageBox "Wollt Ihr am Seelengötzen beten?", "Ja", "Nein"
      set activated to 1
   endif
endif
end

begin gamemode
   if activated == 1
   set button to GetButtonPressed
      if button == -1
         return
      elseif button == 0
         set activated to 0
         if doonce == 0
            set doonce to 1
            if player.getfactionrank AaaBorbaradianerFriendly <= 0
               player.setfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr seid nun ein Jünger Borbarads."
               playsound NPCXivilaiDeath
               player.modpcinfamy 2
               cast AAABorBluttribut2 player
               player.addspell AAABorInvocatioMaiorSpell
               player.addspell AAABorInvocatioMinorSpell
               player.addspell AAABorHerzschlagRuhe
               player.addspell AAABorMagischerRaub
               player.addspell AAABorEigneAengste
               player.addspell AAABorHoellenpein
               player.addspell AAABorSchwarzerSchrecken
               player.addspell AAABorIribaarsHand
               player.addspell AAABorBandUndFessel
               player.addspell AAABorErinnerungVerlasseDich
               player.addspell AAABorHeilkraftBannen
               player.addspell AAABorProtectionisKontrabann
               player.addspell AAABorFluchDerPestilenz
               player.addspell AAABorSchleierDerUnwissenheit
               player.addspell AAABorHexenblick
               player.addspell AAABorTlalucsOdem
               player.addspell AAABorLastDesAlters
               player.addspell AAABorBoeserBlick
               player.addspell AAABorKanifiloRaserei
               player.addspell AAABorSchwarzUndRot
               player.addspell AAABorGranitUndMarmor
               player.addspell AAABorWeichesErstarre
               player.addspell AAABorEcliptifactus
               player.addspell AAABorNuntiovolo
               player.addspell AAABorPanikUeberkomme
               player.addspell AAABorbaradsGoldrauschSpell
               player.addspell AAABorMalDesFrevlers
               player.additem KingofWormsHood1 1
               player.additem KingofWormsRobe1 1
               AAABorGefaengnisDoorREF.enable
               AAABorPalastDoorREF.enable
               AAABorThalosPlatzDoorREF2.enable
               AAABorThalosPlatzFountain1REF.enable
               AAABorThalosPlatzFountain2REF.enable
               AAABorThalosPlatzFountain3REF.enable
               AAABorThalosPlatzFountain4REF.enable
               AAABorKanalisationCollisionBoxREF.disable
               AAABorKanalisationDoorREF.enable
            elseif player.getfactionrank AaaBorbaradianerFriendly == 1
               player.modfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr habt Euch den Lehren Borbarads weiter verpflichtet."
               playsound NPCXivilaiDeath
               player.modpcinfamy 2
               cast AAABorBluttribut2 player
               player.addspell AAABorInvocatioMaiorSpell
               player.addspell AAABorInvocatioMinorSpell
               player.addspell AAABorHerzschlagRuhe
               player.addspell AAABorMagischerRaub
               player.addspell AAABorEigneAengste
               player.addspell AAABorHoellenpein
               player.addspell AAABorSchwarzerSchrecken
               player.addspell AAABorIribaarsHand
               player.addspell AAABorBandUndFessel
               player.addspell AAABorErinnerungVerlasseDich
               player.addspell AAABorHeilkraftBannen
               player.addspell AAABorProtectionisKontrabann
               player.addspell AAABorFluchDerPestilenz
               player.addspell AAABorSchleierDerUnwissenheit
               player.addspell AAABorHexenblick
               player.addspell AAABorTlalucsOdem
               player.addspell AAABorLastDesAlters
               player.addspell AAABorBoeserBlick
               player.addspell AAABorKanifiloRaserei
               player.addspell AAABorSchwarzUndRot
               player.addspell AAABorGranitUndMarmor
               player.addspell AAABorWeichesErstarre
               player.addspell AAABorEcliptifactus
               player.addspell AAABorNuntiovolo
               player.addspell AAABorPanikUeberkomme
               player.addspell AAABorbaradsGoldrauschSpell
               player.addspell AAABorMalDesFrevlers
               player.additem KingofWormsHood1 1
               player.additem KingofWormsRobe1 1
               AAABorGefaengnisDoorREF.enable
               AAABorPalastDoorREF.enable
               AAABorThalosPlatzDoorREF2.enable
               AAABorThalosPlatzFountain1REF.enable
               AAABorThalosPlatzFountain2REF.enable
               AAABorThalosPlatzFountain3REF.enable
               AAABorThalosPlatzFountain4REF.enable
               AAABorKanalisationCollisionBoxREF.disable
               AAABorKanalisationDoorREF.enable
            elseif player.getfactionrank AaaBorbaradianerFriendly >= 2
               player.setfactionrank AaaBorbaradianerFriendly 1
               MessageBox "Ihr seid bereits ein Jünger Borbarads."
            endif
         elseif doonce == 1
            MessageBox "Ihr seid bereits ein Jünger Borbarads."
            set activated to 0
         endif
      elseif button == 1
         set activated to 0
      endif
   endif
end

Die Kombination dieser beiden Scripts scheint an den verschiedenen Stellen des Spiels zu funktionieren, sowohl die Möglichkeit beide Activator aktivieren zu können, als auch die Funktion des Fraktons-Ranges, der davon abhängt, ob man schon bei beiden Activatoren gewesen ist, oder nur bei dem ersten.
  15.10.2017, 20:57
  • Offline


  • Abenteurer
    • Neuling
Interessant.
Freut mich, dass du es lösen konntest. :)
  16.10.2017, 09:57
  • Offline


  • Skelett-Krieger
    • Untot
Hm. Soweit ich das überblicke, ist der einzige Unterschied zu deiner nicht funktionierenden Version im ersten Beitrag die Zeile:

if player.getfactionrank AAABorbaradianerFriendly <= 0

Anstelle von

if player.getfactionrank AAABorbaradianerFriendly == 0

Dann lag es also doch nicht am OnActivate, sondern nur daran, dass AaaBorbaradianerFriendly kleiner als Null sein kann.
"Maiq has heard the people of Skyrim are better looking than the people of Cyrodiil. Maiq has no opinion on the matter. All people are beautiful to him."
  16.10.2017, 22:06
  • Offline
  • Google+


  • Abenteurer
    • Neuling
Nicht unbedingt.
Das es nicht am OnActivate-Block liegt hab ich dir ja schon ziemlich detailliert erklärt.

Das mit dem Fraktionenrang ist so eine Sache. Es gibt mehrere Funktionen dafür.
GetFactionRank gibt -1 zurück, wenn man nicht in der Fraktion ist.
Wohingegen GetInFaction 0 zurückgibt, wenn man nicht in der Fraktion ist.
Aber offenbar waren auch ein paar Schalter vergessen worden.
Auf sowas würde ich auch nur beim Trial and Error draufkommen, weil Schalter oft nicht richtig gesetzt werden und durch eine falsche 0 oder 1 alles den Bach runter gehen kann.
Leider.


Erste Änderung wie du richtig bemerkt hast:
Code
   if player.getfactionrank AAABorbaradianerFriendly == 0zu
Code
   if player.getfactionrank AAABorbaradianerFriendly <= 0Da wundert es mich im Grunde warum das Script vorher funktioniert hat, wenn der Spieler doch anfangs immer -1 bei der entsprechenden Fraktion ist.

Zweite Änderung:
Code
      elseif button == 0

         if doonce == 0
zu
Code
      elseif button == 0
         set activated to 0
         if doonce == 0
            set doonce to 1
Da wurden jetzt offensichtlich jede Menge neue Zuweisungen für die Schalter eingebaut.
Das sind die Probleme auf die ich persönlich eben nur durch Rumprobieren draufkommen würde. Diese Kleinigkeiten übersieht man gerne, haben aber enorme Auswirkungen.

Weiter:
Code
               set doonce to 1
               set activated to 0
            elseif player.getfactionrank AAABorbaradianerFriendly ==1
zu
Code
            elseif player.getfactionrank AAABorbaradianerFriendly ==1Hier wurden die Schalter entfernt, weil sie eben oben gleich am Anfang der Blöcke eingebaut wurden.

Und hier nochmal Zusätze für die Schalter:
Code
            elseif player.getfactionrank AAABorbaradianerFriendly ==1zu
Code
            elseif player.getfactionrank AAABorbaradianerFriendly ==1[...]
               set doonce to 1
               set activated to 0


Ebenso wie im letzten Block:
Code
        elseif doonce == 1
            MessageBox "Ihr seid bereits ein Jünger Borbarads."
zu
Code
        elseif doonce == 1
            MessageBox "Ihr seid bereits ein Jünger Borbarads."
            set activated to 0


Wie gesagt, freut mich, dass du es lösen konntest Symbiarch.
Am besten lösen sich Scriptfehler immer noch durch Ausprobieren und setzen von Consolenprints, welche aktuelle Werte zurückgeben.
Besonders bei Schaltern kann man so feststellen, ob die überhaupt die richtigen Werte haben. ;)
« Letzte Änderung: 17.10.2017, 10:37 von DerJorg »
  17.10.2017, 10:34
  • Offline