Construction Set Allgemeingültige Scripts

Fellan

Freund des Hauses
Ich möchte, dass ein Script beim Aktivieren eines Containers abfragt, ob der Spieler Gegenstand X im Inventar hat. Hat er Gegenstand X im Inventar und das Schloss des Containers ist verriegelt, soll eine MessageBox erscheinen, die es dem Spieler, abhängig vom eigenen Stärkewert und dem Sicherheits-Skill anbietet, das Schloss aufzubrechen, mit einem Dietrich zu knacken oder abzubrechen.

Das Problem dabei ist, dass das nicht bei einem spezifischen Container passieren soll, sondern immer abgefragt werden soll, wenn der Spieler irgendeinen Container (also auch durch Mods neu hinzugefügte!) Container, die (nicht-unmöglich) verschlossen sind, aktiviert. Sind solche allgemeingültigen Scripts möglich?
 
Hi,
bei deiner Frage habe ich mich mal im CS-Wiki umgeguckt und bin auf folgendes gestoßen.
das sollte also mit dieser Funktion gehen:
IsContainer [An dieser Stelle sollte eine ID stehen. Ich bin mir jedoch nicht sicher, ob die zwingend ist]

Doch leider ist für diesen Befehl auch OBSE notwendig.
Und der Script.^^
Ich habe schon ein bisschen ausprobiert, den Script an sich kriege ich aber leider noch nicht hin.
Mfg Gildur
 
  • Like
Reaktionen: Fellan
Ich glaube sowas gibts in OBSE... Da geht das auch mit Zeugs was mit Mods dazukommt... Aber absolut keien Ahnung was das fürn Befehl ist...

mfG L

EDIT: @ Gildur: Nur was willst du damit bezwecken? Es wird ja nur abgefragt ob es ein Container ist...
 
Zuletzt bearbeitet:
Ich würde es so machen:
Man packt eine GameMode-Funktion (nicht so toll, aber mit OnActivate wirds schwieriger) auf das Objekt, der einen immer "verfolgt". Wenn man dann einen Container aktiviert und das Objekt im Inventar hat, wird die Messagebox geöffnet, man kann die Antwort anklicken und das Schloss öffnen.
Die IsContainer Funktion soll sagen, wann man einen Container aktiviert.
So würde ich es mir vorstellen.
 
Wenn man dann einen Container aktiviert...
Hier is wahrscheinlich das größte Problem. Ich wüßte nicht wie man das abfrgen könnte.
Begin OnActivate würde wohl nichts nützen, weil das Script ja wahrscheinlich als Quest script definiert seien soll.

Ich würde es mit einem Token versuchen.Also per script jedem Container einen Gegenstand(Token) geben,der nicht auffällt. Einen Löfel oder sowas. Wie das geht, habe ich=>hier<= mal gepostet.

Dann auf den Löffel so ein Script legen.
Code:
scn TOKENLoeffelSC

ref Kiste
ref Aktivierer

Begin Gamemode

if Kiste == 0
set Kiste to GetContainer
endif

if Kiste.GetActionRef == 0
set Aktivierer to Kiste.GetActionRef
return
endif

If Aktivierer == player
(...) ; Hier das script mit dem Dietrich und der Stärke undso
endif

End

Ich weiß aber leider nicht ob das mit dem GetActionRef klappt :?
 
sinHHHans schrieb:
Hier is wahrscheinlich das größte Problem. Ich wüßte nicht wie man das abfrgen könnte.
Begin OnActivate würde wohl nichts nützen, weil das Script ja wahrscheinlich als Quest script definiert seien soll.

Nein, kein Quest-Script. Der Script soll auf dem Gegenstand liegen. Sobald der Gegenstand im Inventar ist und der Spieler einen Container, der verschlossen ist, aktiviert, bekommt er die Auswahl zwischen Dietrich benutzen oder aufbrechen. Hintergrund des ganzen soll sein, die ganzen bisher nutzlosen Gegenstände wie Spitzhacke, Schaufel etc. sinnvoll einzusetzen. Mit der Spitzhacke soll man z.B. Container aufbrechen können, sofern das sinnvoll ist. Man könnte das zwar mit den im Spiel vorhandenen Standard-Container-IDs machen, es soll aber mit allen Containern, also auch durch Mods neu hinzugefügte Container funktionieren. Deswegen kann ich deinen Script auch nicht verwenden. ;)

Der OBSE-Befehl "isContainer" dürfte funktionieren, es wäre ja auch kein Problem, bei einer solchen Mod OBSE zu verwenden. Bis hierhin erstmal Danke. :)
 
Man könnte das zwar mit den im Spiel vorhandenen Standard-Container-IDs machen, es soll aber mit allen Containern, also auch durch Mods neu hinzugefügte Container funktionieren. Deswegen kann ich deinen Script auch nicht verwenden. ;)

Der OBSE-Befehl "isContainer" dürfte funktionieren, es wäre ja auch kein Problem, bei einer solchen Mod OBSE zu verwenden. Bis hierhin erstmal Danke. :)

Dafür ist das Skript ja gut, das funktioniert bei jedem Container, weil ja kein Container verändert werden muss.So woe du es machen willst , also mit dem Gegenstand im Inventar, das versteh ich nicht.:huh:

Schreib mal wie das aussieht.
:)
 
Also, noch ein mal alles zusammen gefasst^^:
Fellan will mit einem Gegenstand (zB. Hacke, Schaufel etc) Schlässer öffnen können. Also, wenn man den Gegenstand im Inventar hat, dann soll beim aktivieren eines verschlossenen Containers die Message kommen, ob man einen Dietrich oder den Gegenstand benutzen will. Wenn man den Dietrich benutzt, soll ganz normal das "Mini-Spiel Dietrich" kommen, wenn man die Schaufel bzw. Hacke benutzen will, soll sich das Schloss öffnen (indem man es aufbricht^^).
Doch dabei stellen sich mir 2 Fragen:
1.: Soll die Schaufel bzw. die Hacke nach Gebrauch zerstört/nicht mehr brauchbar werden?
2.: Kann man eigentlich einen Script auf ein Objekt setzen, welches dann abfragt, ob es in einem Container ist?
 
Ja ich weiß doch, das habe ich verstanden, ich verstehe nur nicht wie das Script zu : "Wenn der player einen Gegenstand aktiviert" aussieht.

Begin OnActivate müsste ja als script auf jeder Truhe sein, aber das geht nicht, weil es ja sonst nicht für jede Truhe gehen würde.Also wie soll das sonst gehen ?

Zu 2: Ja das geht, das nennt man Token, und ich habe es schon in einem Mod so gemacht. Nur mit Kreaturen und NPCs statt Containern.
 
Zuletzt bearbeitet:
Dann habe ich noch eine Frage (natürlich sollte ich hier eigentlich Antworten reinschreiben, doch diese Fragen dienen natürlich ausschließlich zur Lösung dieses Problems=):
Frage: Ich habe schon im CS-Wiki nachgeguckt, doch leider keinen passsenden Befehl gefunden, obwohl ich mir sicher war, dass es so einen gibt. Und zwar so etwas wie "Target" oder so was ähnliches.
Vergleichbar auch einfach mit einer "BeginOn Activate"-Anweising, nur in einer GameMode-Anweisung.
Außerdem habe ich auch einen Vorschlag, jedoch bin ich etwas pessimistisch (schreibt man das so?^^), da ich glaube, dass das nur in OnActivate-Anweisungen klappen dürfte. Ihr könnt mich ja dann korrigieren:):
Code:
Edit:
scn [Sag ich nicht]

Begin GameMode
If IsContainer == 1
;Tue irgendwas
Endif
End
 
Zuletzt bearbeitet:
Dann habe ich noch eine Frage (natürlich sollte ich hier eigentlich Antworten reinschreiben, doch diese Fragen dienen natürlich ausschließlich zur Lösung dieses Problems=):
Frage: Ich habe schon im CS-Wiki nachgeguckt, doch leider keinen passsenden Befehl gefunden, obwohl ich mir sicher war, dass es so einen gibt. Und zwar so etwas wie "Target" oder so was ähnliches.
Vergleichbar auch einfach mit einer "BeginOn Activate"-Anweising, nur in einer GameMode-Anweisung.
Außerdem habe ich auch einen Vorschlag, jedoch bin ich etwas pessimistisch (schreibt man das so?^^), da ich glaube, dass das nur in OnActivate-Anweisungen klappen dürfte. Ihr könnt mich ja dann korrigieren:):
Code:
Edit:
scn [Sag ich nicht]

Begin GameMode
If IsContainer == 1
;Tue irgendwas
Endif
End
öÖ
Also mir sagt das Script nix. Laut cs.elderscrolls.com braucht das ne Reference. Könnte man ja mit nem Objekt, das in den Container gelegt wird, rausfinden... Aber wie, wenn der verschlossen ist? Das ist ne Zwickmühle, ein Teufelskreis, der ohne die Möglichkeit, abzufragen, dass man grad nen Container aktiviert, nicht zu durchschneiden ist.
 
Oberscht schrieb:

Du weißt ja, wie ich das meine. ;)


sinHHHans schrieb:
also mit dem Gegenstand im Inventar, das versteh ich nicht.:huh:

Schreib mal wie das aussieht.

Wie gesagt, deinen Token-Script möchte ich nicht verwenden. Erstmal wäre der Script dann nicht für alle Container gültig und außerdem will ich nicht in jedem Container einen Löffel, Gabel o.ä. haben.
Der Script würde auf dem Item, nehmen wir mal die Spitzhacke, liegen:

Code:
scn NAME

short init
short button

begin GameMode
[I];alternativ: begin onActivateContainer Player, sowas gibt es aber höchstwahrscheinlich nicht[/I]

if ( Player.[B]ActivateContainer[/B] ) [I];sowas gibt es höchstwahrscheinlich nicht, das ist ja auch mein Problem[/I]
   if ( init == 2 )
       set init to 0
   endif
   if ( Player.GetItemCount [B]SpitzhackeID[/B] > 0 ) && ( init == 0 )
      MessageBox "Was wollt ihr tun?", "Das Schloss knacken", "Aufbrechen"
      set init to 1
   endif
endif

if ( init == 1 ) [I];[Anmerkung: bin mir aus dem Kopf gerade nicht sicher, wie das mit den MessageBoxen klappt, aber ungefähr so wird es gehen][/I]
   set button to GetButtonPressed
      if ( button == 0 )
         [B]Player.Activate targetref[/B] [I];oder irgendwie sowas, das normale "Dietrich-Schloss-Knacken-Fenster" wird also geöffnet[/I]
         set init to 2
      elseif ( button == 1 )
         [I];Aus einem Mittelwert von Stärke, Geschicklichkeit, Stufe der Verriegelung und Sicherheits-Fähigkeit wird ermittelt, ob der Spieler es schafft, das Schloss aufzubrechen. Aus einem Mittelwert von Geschicklichkeit, Stufe der Verriegelung, Sicherheits-Fähigkeit und, falls Schleichen aktiviert Schleichen-Fähigkeit wird der Umkreis ermittelt, in dem NPCs oder Gegner alarmiert werden[/I]
         set init to 2
      endif
endif

Möglicherweise würde ich auch noch mehrere Wertigkeitsstufen der Spitzhacke einbauen und eine Wahrscheinlichkeit, ob diese beim Versuch des Aufbrechens zerstört wird, das führt jetzt aber zu weit. So ungefähr soltle der Script aussehen, mir fehlen aber die entsprechenden Befehle...


Gildur schrieb:
Doch dabei stellen sich mir 2 Fragen:

Die damit wohl beantwortet wären. ;)

Die Frage ist ja, ob es einen "begin onActivateContainer"-Befehl oder etwas wie "if ActivatedObject == Container" gibt. Ob OBSE oder nicht ist dabei egal.
Also irgendein if-Statement, das abfragt, ob das aktivierte Objekt in der Container-Kategorie ist, würde ja schon reichen. Der Script läuft dann immer durch, wenn der Spieler irgendwas aktiviert. "IsContainer" dürfte vielleicht schon reichen, ich werde das mal ausprobieren.