Construction Set Skriptthread zum Construction Set

@ Almalexian:
"set myself to getself" macht nichts anderes, als eine Referenz-Variable auf das Objekt, auf dem der Script liegt, zu legen. Also liegt der Script auf einem Schwert, so wird dem Schwert die Referenz myself zugeteilt. Liegt auf dem Schwert ein Zauber, welcher den Script beinhaltet, kriegt das Schwert die Referenz myself. Liegt der Script auf einem NPC oder dem Spieler oder auf einem Zauber, wird die Referenz dem NPC oder dem Spieler zugeteilt.
Zaubern kann man keine Referenzen zuteilen, wozu auch? Deswegen wird die Referenz dem Skript- bzw. Zauberhalter zugewiesen.

Es fällt etwas schwierig getself ordentlich zu erklären... Am Besten ist es, wenn man etwas damit übt, dann wird einem die Funktionsweise und der Umgang klarer.

@ Dante2000:
Das ist etwas schwierig, du könntest es aber wie folgt machen: Du legst einen Script auf den Schalter, der wie folgt aussieht:
Code:
scn Scriptname

ref par
ref myself

Begin OnActivate
set myself to getself
If IsActionRef myself
set par to GetParentRef
myself.activate
par.activate
End
Nun machst du die Tür zum Enable Parent vom Schalter. Dazu klickst du erst doppelt auf die Tür und machst im neuen Fenster ein Häckchen bei "Persistent Reference", anschließend mit OK bestätigen. Jetzt klickst du doppelt auf den Schalter und gehst in den Tab "Enable Parent". Dort klickst du auf den Knopf "Select In Render Window" und ein Fadenkreuz erscheint im Render Fenster, damit klickst du auf die Tür. Der Eintrag beim Schalter unter "Enable Parent" sollte sich aktualisiert haben, die Tür sollte als Referenz dort stehen. Mit OK bestätigen.
Jetzt musst du noch folgenden Script auf den Zauber legen, den du auf den Schalter zaubern willst:
Code:
scn Scriptname

ref myself

Begin ScriptEffectStart
set myself to getself
myself.activate myself, 1
End
Gildur
 
Dank an Gildur!

Skript 2 und 3 funktionieren Klasse.

bei Skript 1 gibt es wohl ein Missverständnis, es geht nicht um einen Spruch (Spell), sondern um einen Effekt.
Kann man da noch was löten?
 
Dieser Effekt ist ein Shader oder?
Dann wird das etwas komplizierter. Wenn man einen Shader auf ein Item, dass ausgerüstet werden kann, legt, wird nicht nur dieses Item beeinflusst, sondern der komplette Träger des Items, in diesem Falle der Spieler.

Wenn nur das Item betroffen sein soll, geht das nicht mit dem CS, sondern nur über 3D-Programme. Mit NifScope müsste das möglich sein, ich weiß aber nicht mehr wie. War glaube ich was mit nem Alphakanal, aber wie gesagt, ich weiß es nicht mehr.
 
Ich habe ein kleines Problem mit einem Skript. Rein logisch betrachtet müsste alles gehen, aber bisher weigert sich das Script Ingame das zu tun was ich erwarte. :? :huh:

Code:
scn barXcyQuestScript

Begin GameMode

(...)

if ( player.GetItemCount SoulGem5Grand5GrandSoul >= 15 ) && ( getStage barXcyBarInPrison == 40 )

    setStage barXcyBarInPrison 50

endif

if ( player.GetItemCount BlackSoulGemFilled >= 5 ) && ( getStage barXcyBarInPrison == 40 )

    setStage barXcyBarInPrison 55

endif

End

Sinn und Zweck des Scripts soll sein, das der Quest dann voran schreitet, wenn der Spieler entweder 15 Große Seelensteine (gefüllt mit der Seelenstufe "Groß") - setStage 50 - oder aber 5 Schwarze Seelensteine (gefüllt mit der Seelenstufe "Groß") - setStage 55 - hat.

ich bin Ingame, der ganze vorherige Questablauf geht, ich habe die Seelensteine (5 Schwarze) -> nichts passiert. :cry:

Was kann ich machen? Was muss ich ändern? Wo liegt mein Fehler? :eek:

By the Way: Selbiges Problem beschäftigt mich auch in einem zweiten Script, selber Mod. Mir scheint das es mit den Seelensteinen zusammenhängt...

Greets, Xcy
 
Hmm, ersetze mal das ( getStage barXcyBarInPrison == 40 ) durch

Code:
( getStage barXcyBarInPrison >[Stage davor] && GetStage barXcyBarInPrison < [Stage danach])

oder

Code:
( getStage barXcyBarInPrison => 40 && GetStage barXcyBarInPrison < [Stage danach])

Mit == gibt es öfter mal Probleme.
 
Das scheint nicht das Problem zu sein. Habe alle Varianten ausprobiert, es zeigt sich aber keine Veränderung.

Ich tippe eher darauf, das es mit den Seelensteinen zu tun hat. Denn in beiden Scripten, die zicken, ist nur eine Sache gemeinsam:

Code:
scn barXcyQuestScript

Begin GameMode

if ( player.GetInCell ICImperialLegionHQTheBastion == 1 ) && ( [COLOR=DarkGreen]getStage barXcyBarInPrison == 15[/COLOR] )

    setStage barXcyBarInPrison 20
    barXcyBartramRef.addTopic barXcyTopicA

endif

if ( [COLOR=DarkOrange]player.GetItemCount SoulGem5Grand5GrandSoul >= 15[/COLOR] ) && ( getStage barXcyBarInPrison > 30 && GetStage barXcyBarInPrison < 50 )

    setStage barXcyBarInPrison 50

endif

if ( [COLOR=DarkOrange]player.GetItemCount BlackSoulGemFilled >= 5[/COLOR] ) && ( getStage barXcyBarInPrison > 30 && GetStage barXcyBarInPrison < 50 )

    setStage barXcyBarInPrison 55

endif

End

Code:
scn barXcyRingFusion

short fusion
short once

[COLOR=DimGray](...)[/COLOR]

Begin GameMode

Set fusion to GetButtonPressed

    if fusion == 0 && once == 0

        if ( player.GetItemCount barRingGoldFederGr >= 1 ) && ( player.GetItemCount barRingSilberFederKl >= 1 )

            if ( [COLOR=DarkOrange]player.GetItemCount BlackSoulGemFilled >= 5[/COLOR] )

                [COLOR=DimGray](...)[/COLOR]

                Set once to 1

            elseif ( [COLOR=DarkOrange]player.GetItemCount SoulGem5Grand5GrandSoul >= 15[/COLOR] )

                [COLOR=DimGray](...)[/COLOR]

                Set once to 1

            else

                [COLOR=DimGray](...)[/COLOR]

                Set once to 1

            endif

        else

            [COLOR=DimGray](...)[/COLOR]

            Set once to 1

        endif

    endif

End

Die grüne Passage funktioniert vollkommen korrekt, wenn ich die Cell betrete und auf dem entsprechenden Questniveau bin, laufen die Anweisungen ab.

Die orange unterlegten Passagen sind die gemeinsamkeiten der beiden Script, die nicht funktionieren. Dort muss der Fehler sein, aber ich verstehe beim besten Willen nicht, wo und warum. Es ist logisch gesehen alles korrekt, eigentlich.

Greets, Xcy
 
So, ich habe den Fehler jetzt eindeutig eingekreist. Mit dem folgenden Script habe ich geprüft, ob ich die erforderlichen Seelensteine besitze (was der Fall ist).

Code:
Begin MenuMode

    if doonce == 0

        if ( player.GetItemCount BlackSoulGemFilled >= 5 )

            MessageBox "DEBUG_BlackSoulGemFilled -> Yes"

        else

            MessageBox "DEBUG_BlackSoulGemFilled -> No"

        endif

    Set doonce to 1

    endif

End

Die Ausgabe ist stets "DEBUG_BlackSoulGemFilled -> No", sprich das Script erkennt nicht, das ich die benötigten Seelensteine besitze. :eek:

Mein Verdacht: Ich benutze Seelensteine die "von Hand" gefüllt sind, so wie es der Spieler später es ja auch tun soll. Kann es sein das er diese nicht als "BlackSoulGemFilled" (Editor ID eines gefüllten schwarzen Seelensteins) erkennt? :shock: Und wenn ja wie kann ich das ganze dann prüfen? :huh:

Greets, Xcy
 
Angenommen du läufst mit BlackSoulGem's rum, und füllst diese Manuell, dann werden diese mit der Seele befüllt. Allerdings bleibt die ID gleich. Dir wird kein BlackSoulGem entfernt und ein BlackSoulGemFilled hinzugefügt. Die BlackSoulGemFilled's (blöde Mehrzahl) sind lediglich dazu da, damit du schon gefüllte Seelensteine in Oblivion platzieren kannst.

Demnach kann dein Script nicht funktionieren, es sei denn du hättest 5 solcher, im Vornehererein schon gefüllter Seelnsteine.
 
  • Like
Reaktionen: robinH
Gut, so etwas in der Art hatte ich befürchtet. Ich war mit dem genauen Vorgang der Seelenbefüllung (Scripttechnisch) nicht vertraut :roll:

Dann bleibt meine Frage: Wie kann ich denn nun eine entsprechende Abfrage formulieren? Sprich wie kriege ich es hin, das der Spieler jeden x-beliebigen großen bzw schwarzen Seelenstein (egal ob "handgefüllt" oder von Anfang an gefüllt) benutzen kann?

Greets, Xcy
 
Man kann abfragen, wie viele schwarze Seelensteine der Spieler im Inventar hat, ungeachtet ob geladen oder nicht. Das ginge so:

Code:
if ( player.GetItemCount BlackSoulGemFilled + player.GetItemCount SoulGem5Grand5GrandSoul + player.GetItemCount BlackSoulGem) >= 15

Das kannst du dann auch mit weiteren ID's ergänzen. Was anderes fällt mir nicht ein.
 
  • Like
Reaktionen: robinH
Hmm, eigentlich wollte ich auf OBSE verzichten, um den Mod möglichst kompatibel zu machen und um möglichst wenig vorauszusetzten.

Aber selbst mit den Commands werde ich nicht wirklich was. Denn die können nur von einer Referenz, einem bestimmten Seelenstein, aufgerufen werden, was mir wenig nützt. ich benötige etwas, das mir sagt, wie viele Seelensteine mit der Seelenstufe "Groß" vom Typ "großer Seelenstein" bzw "schwarzer Seelenstein" hat der Player. :?

Das scheint aber so einfach nicht möglich zu sein, wenn ich das so sehe.

Ich steige vielleicht auf Welkynd-Steine um, die bleiben wie sie sind :roll: oder Varla-Steine. Mal sehen ob ich noch einen Ansatz für die Seelenstein-Variante finde, wenn jemand von euch Ideen hat, nur her damit :lol:

€dith:

Ich bin jetzt umgestiegen und verwende andere Materialien. Funktioniert soweit auch ganz gut. Nur leider scheint mein Oblivion mit folgenden Script nicht so ganz zurecht zu kommen:

Code:
if ( dofusion > 0 )

            MessageBox "TEXT"

            player.RemoveItem barRingA 1
            player.RemoveItem barRingB 1
            player.AddItem barXcyAmulet 1
            player.RemoveItem barXcyRollFusion 1
            setStage barXcyBarInPrison 60

            if ( dofusion == 1 )

                player.RemoveItem WelkyndStone 70

            elseif ( dofusion == 2 )

                player.RemoveItem VarlaStone 5

            endif

        else

            MessageBox "TEXT2"

        endif
Ein Scriptblock vorher entscheidet welche der beiden möglichen Optionen (5 Varla-Steine oder 70 Welkynd-Steine) möglich ist und setzt die Variable "dofusion" entsprechend.

Wenn ich nun Ingame den entsprechenden Scriptblock aufrufe, höre ich noch wie die QuestStage gesetzt wurde (anhand des typischen Geräusches) und wie ein oder mehrere Gegenstände entfernt werden, aber sehen tu ich nichts mehr, weil Oblivion unmittelbar den Geist aufgibt und Windoof mit der Nachricht "Oblivion hat ein Problem festgestellt und muss beendet werden" aufwartet.

Jemand eine Idee?

Greets, Xcy
 
Zuletzt bearbeitet:
@ Almalexian:
............

@ Dante2000:
Das ist etwas schwierig, du könntest es aber wie folgt machen: Du legst einen Script auf den Schalter, der wie folgt aussieht:
Code:
scn Scriptname

ref par
ref myself

Begin OnActivate
set myself to getself
If IsActionRef myself
set par to GetParentRef
myself.activate
par.activate
End
Nun machst du die Tür zum Enable Parent vom Schalter. Dazu klickst du erst doppelt auf die Tür und machst im neuen Fenster ein Häckchen bei "Persistent Reference", anschließend mit OK bestätigen. Jetzt klickst du doppelt auf den Schalter und gehst in den Tab "Enable Parent". Dort klickst du auf den Knopf "Select In Render Window" und ein Fadenkreuz erscheint im Render Fenster, damit klickst du auf die Tür. Der Eintrag beim Schalter unter "Enable Parent" sollte sich aktualisiert haben, die Tür sollte als Referenz dort stehen. Mit OK bestätigen.
Jetzt musst du noch folgenden Script auf den Zauber legen, den du auf den Schalter zaubern willst:
Code:
scn Scriptname

ref myself

Begin ScriptEffectStart
set myself to getself
myself.activate myself, 1
End
Gildur

Ich nehme mal an, das das somit mit einem Pfeil nicht zu machen ist. Oder?

Kann jemand bei den folgenden beiden Sachen helfen?

Wie lässt sich die Einblendung "Ihr könnt diesen Gegenstand nicht nutzen" abschalten?

Und wie schafft man es, das das Inventar, sobald einer Messagebox und derem Ereignis zugestimmt wurde, automatisch danach per Script schliesst?

Denn sobald die Messagebox, die ein Gegenstand im Inventar per Script nun öffnet, bestätigt ist, wird das Auszuführende Ereignis erst angezeigt, nachdem das Inventar wieder geschlossen ist. Diesen Vorgang wollte ich deshalb automatisieren.
 
Zuletzt bearbeitet:
Du könntest es eventuell auch mit "Begin onHitWith" probieren. Weiß bloß nicht, ob das auch auf Schalter etc. klappt. Oder du nimmst eine Triggerbox und lässt die per "Begin onTriggerMob" auslösen...
 
  • Like
Reaktionen: robinH
@robinH:
Vielleicht kannst du hiermit etwas anfangen:
http://www.ei-der-zeit.com/board/index.php?page=Thread&threadID=1527
(drittes Script)

Und mit
Code:
if (MenuMode == 1)
kannst du abfragen, ob gerade ein Menu auf ist wie das Inventar.

Allerdings wüsste ich keinen Befehl, um das Inventar dann zu schließen:? (Vielleicht gibt es was über OBSE und mit den Tasten, aber das weiß ich nicht.)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: robinH
Dank Euch, das DritteScript hilft wirklich, das werde ich mal probieren.

Weiss jemand anderes mit welchem Befehl man das Inventar schliessen kann?

Und wie lässt sich der Text "Du kannst den Gegenstand nicht ausrüsten wegbekommen".

Ich finde das komisch, es gibt doch Gegenstände die man Ausrüsten kann, und dort kommt der Text nicht, also muss das doch irgendwie zu steuern sien.
 
Nun, man kann bei Gegenständen, die über ein Script ausgerüstet werden, durch leere Messages die Nachricht unterdrücken, aber das so bei Waffen regeln, da wüsste ich jetzt nichts.
 
  • Like
Reaktionen: robinH
Ja genau das ist ja das Ziel. Ein Gegenstand wird angeklickt und per Script dann weiter bearbeitet. Doch vorher erscheint diese dumme Nachricht. Diese Nachricht soll aber nicht erscheinen. Doch wie bekomme ich die weg?