Construction Set Scriptproblem, brauche dringend Hilfe!

Baldurian

Fremdländer
Hi,
ich würde gerne ein Script schreiben, dass den Zauber "Vampire Sun Damage" durch den Zauber "Vampire Amara" (nur noch Anfälligkeit f. Feuer) ersetzt.
Das soll zu folge haben, das man als Vampir keinen Sonnenschaden mehr bekommt und man nicht von Wachen angegriffen wird.
Ich habe mich schon mal an einem Script versucht, doch es bringt noch nicht den gewünschten Erfolg.
Es soll über eine Messagebox aktivierbar und deaktivierbar sein, da ich den Gegenstand nicht angelegt haben möchte.
Das scheint auch zu funktionieren, doch immer wenn ich schlafe, wird die Ring automatisch aktiviert und es kommt die entsprechende Messagebox.
Das soll natürlich nicht sein.
Am liebsten wäre es mir eigentlich,
1. Wenn der Ring das Erste mal im Inventar ist soll ein Tagebuch Eintrag erstellt werden.
2. Jedes mal, wenn der Ring ins Inventar aufgenommen wird und man ein Vampir ist, soll eine Messagebox erscheinen und der Ring soll automatisch aktiviert werden (Player->removespell, "vampire Sun Damage" Player->addspell, "Vampire Amara")
Ist man kein Vampir, soll nur eine Messagebox erscheinen, die sagt dass man mit dem Ring erst was anfangen kann, wenn man Vampir ist.
3. Wenn der Ring sich nicht mehr im Inventar befindet soll der Ring wieder deaktiviert (nur wenn man Vampir ist) werden und auch eine Messagebox erscheinen.
4. Wenn man versucht den Ring anzulegen, soll das nicht möglich sein und eine Messagebox soll erscheinen, dass dies nicht nötig ist und den Ring nur im Inventar haben muss!


Begin _amaras_ring Script

short status
short button
short OnPCEquip

if (menumode ==1)
return
endif

if (OnPCEquip ==1)
Set status to 11
Set OnPCEquip to 0
endif

elseif (status ==11)
MessageBox "Möchtet ihr den Ring aktivieren?", "Ring aktivieren", "Ring deaktivieren"
Set status to 21
elseif (status ==21)
Set Button to GetButtonPressed
if (button==-1)
return
elseif (button ==0) ;Ring aktivieren
if ( PcVampire == 1 )
Messagebox "Ihr habt den Ring aktiviert. Als Vampir könnt ihr nun das Sonnenlicht genießen und werdet von Lebenden nicht als Geschöpf der Nacht erkannt."
Player->removespell, "vampire Sun Damage"
Player->addspell, "Vampire Amara"
else
Messagebox "Um die Fähigkeiten dieses Ringes auskosten zu können, müsst ihr ein Vampir sein."
endif

elseif (button ==1) ;Ring deaktivieren
; if ( GetJournalIndex "_Amara_Ring" < 1 )
; Journal "_Amara_Ring" 1
; endif
if ( PcVampire == 1 )
Messagebox "Ihr habt den Ring deaktiviert. Ihr solltet nicht vergessen, dass ihr nun nicht mehr bedenkenlos im Sonnenlicht wandeln könnt und Lebende euch nun wieder als Geschöpf der Nacht identifizieren werden."
Player->removespell, "Vampire Amara"
Player->addspell, "vampire Sun Damage"
else
Messagebox "Um die Fähigkeiten dieses Ringes auskosten zu können, müsst ihr ein Vampir sein."
endif
endif
endif
endif

End

Ich hoffe ihr könnt mir helfen!
Schon mal Tausend Dank!
 
Das ist alles prinzipiell ziemlich leicht. Nur gibt es bei deinen Anforderungen eine klitzekleine aber fiese Schwierigkeit. Die Sache mit dem "nicht von Wachen angegriffen werden"... Da die Angriffsgeschichte über die Global "PCVampire" und Dialogfunktionen kontrolliert wird, gibt es um das zu realisieren, nur zwei sinnvolle Wege. Beide haben Nachteile:

  1. Du veränderst sämtliche Dialoge, die eine Wache Vampire erkennen läßt so, dass die nicht ausgeführt werden, wenn der Spieler den Ring besitzt. Das kann aber ziemlich fitzelig werden, da es da nicht nur eine Wache und einen Dialog gibt.
  2. Du modifizierst mit dem Script die Global selbst und pufferst ihren Wert. Das hat dann natürlich zur Folge, dass auch spezifische Vampirquests so nicht mehr aktiviert werden können. Ergibt natürlich Sinn, weil die Leute den Spieler nicht als Vampir erkennen. Wenn das ok ist, wäre das meine bevorzugte Lösung. Allerdings trittst du damit natürlich etwaigen weiteren Vampir-Mods, die diese Variable benötigen, vors Schienbein.

Eine optimale Lösung für das Nichterkennen/Nichtangreifen gibt es nicht...

Man könnte das auch kombinieren und PCVampire auf "2" setzen, sowie bei allen Dialogen, die Vampire definitiv erkennen sollen die DialogCondition von ==1 auf >=1 verändern.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Baldurian
Danke für die schnelle Antwort.
Es würde mir völlig reichen wenn man den Zauber "Vampire Sun Damage"
Sonnenschaden
Vampirismus
Anfälligkeit f. Feuer
gegen einen Zauber ersetzt, der nur Anfälligkeit gegen Feuer beinhaltet.
Dann würde mein Vampirwert doch noch immer auf 1 stehen, nur der Zauber ist entfernt und lässt mich nicht mehr als Vampir erkenntlich sein.
Wenn man also einen Vampirquest starten möchte, muss man den Ring halt wieder deaktivieren!
Könnte es Probleme geben, wenn man z.B. einen Quest startet, der Vampirismus voraussetzt -> den Ring aktiviere -> und dann den Quest ausführe (z.B. jemanden Töten)?
Nochmals zusammengefasst: Vampir: Quest annehmen, Vampir deaktivieren: Quest ausführen...
 
Dann würde mein Vampirwert doch noch immer auf 1 stehen, nur der Zauber ist entfernt und lässt mich nicht mehr als Vampir erkenntlich sein.
Wenn man also einen Vampirquest starten möchte, muss man den Ring halt wieder deaktivieren!
Ich glaube, du verstehst nicht...

Die Globale Variable "PCVampire" ist verantwortlich für das Erkennen, ob der Spieler Vampir ist oder nicht. Mit dem Zauber (genauer gesagt mit der Ability) hat das Ganze rein gar nichts zu tun. Das kommt nur on top.

Wenn du nicht entweder die Dialoge änderst oder die Globale modifizierst, wird der Spieler auch bei entfernter Ability als Vampir erkannt und kann dann halt auch nicht einkaufen, mit dem Boot reisen oder dergleichen, weil in dem Fall die "Denial of Service" Klausel der Dialogoption für Vampire greift - außer bei den Telvanni.

Wenn du DAS verhindern willst, also wirklich einen unerkennbaren Vampir erzeugen willst, mußt du die Global verändern oder halt hunderte Dialoge einbetten/modifizieren. Das ist 'ne Sauarbeit. Sonst funktionieren nämlich entweder die vampirspezifischen Quests nicht mehr oder dein Wunsch nach Nichterkennen läßt sich nicht umsetzen.

Journaleintrag, Messages, das Nichtausrüstbar sein und die Funktion mit dem Sonnenschaden ist dagegen ziemlich einfach...
 
  • Like
Reaktionen: Baldurian
Ok, dann sollte man das mit dem Nichterkennen erstmal sein lassen, wie sieht's mit den anderen Punkten aus. Könntest du so etwas für mich realisieren oder mir dabei helfen!?

Dann würde mein Vampirwert doch noch immer auf 1 stehen, nur der Zauber ist entfernt und lässt mich nicht mehr als Vampir erkenntlich sein.
Wenn man also einen Vampirquest starten möchte, muss man den Ring halt wieder deaktivieren!
Ich habe das nochmals getestet wenn ich diese Fertigkeit oder Fähigkeit (keine Ahnung was von beiden) enthalten im Zauber "Vampire Sun Damage" Vampirismus daraus entferne, greifen Wachen mich nicht mehr an, ich verliere mein Vampirgesicht und auch wenn ich die Tante in der Magiergilde in Vivec bzgl. dem Blaubrandt Quest anspreche, scheint diese nicht zu wissen, dass ich ein Vampir bin, auch die Träume hören auf. Ist die Fertigkeit "Vampirismus" in dem Zauber "Vampire Sun Damage" wieder enthalten, treffen die genannten Faktoren wieder zu und alle wissen wieder, dass ich ein Vampir bin.

So ich habs mal selber probiert!
Punkt 1. und 2. dürften damit erledigt sein.
Begin _AmarasRing Script

Short PCSkipEquip

if ( OnActivate == 1 )
disable
player->additem "_amaras ring" 1
if ( GetJournalIndex "_Amara_Ring" < 1 )
Journal "_Amara_Ring" 1
endif
if ( PcVampire == 1 )
Messagebox "In dem Ring ist etwas eingraviert: Der Besitzer dieses Ringes muss diesen nicht am Finger tragen, es ist ausreichend ihn mit sich zu führen. Als Vampir kann man mit diesem Ring das Sonnenlicht genießen und wird von Lebenden nicht als Geschöpf der Nacht erkannt.", "Ok"
Player->removespell, "vampire Sun Damage"
Player->addspell, "Vampire Amara"
else
Messagebox "Um die Fähigkeiten dieses Ringes auskosten zu können, müsst ihr ein Vampir sein.", "Ok"
endif
endif

set PCSkipEquip to 1

End

Füge ich das noch mit an, scheint der Script gar nicht mehr aufzuhören mit der Messagebox!
if ( player->GetItemCount "_amaras ring" == 0 )
Messagebox "Gegenstand abgelegt!"
endif

Ich glaub ich habs! Fehlt noch 3.
Begin _AmarasRing Script

Short PCSkipEquip
Short State

if ( OnActivate == 1 )
set state to 1
disable
player->additem "_amaras ring" 1
if ( GetJournalIndex "_Amara_Ring" < 1 )
Journal "_Amara_Ring" 1
endif
if ( PcVampire == 1 )
Messagebox "In dem Ring ist etwas eingraviert: Der Besitzer dieses Ringes muss diesen nicht am Finger tragen, es ist ausreichend ihn mit sich zu führen. Als Vampir kann man mit diesem Ring das Sonnenlicht genießen und wird von Lebenden nicht als Geschöpf der Nacht erkannt.", "Ok"
Player->removespell, "vampire Sun Damage"
Player->addspell, "Vampire Amara"
else
Messagebox "Um die Fähigkeiten dieses Ringes auskosten zu können, müsst ihr ein Vampir sein.", "Ok"
endif
endif

set PCSkipEquip to 1

if ( player->GetItemCount "_amaras ring" == 0 )
if ( state == 1 )
Messagebox "Gegenstand abgelegt!"
set state to 2
endif
endif

End

P.S.: Bitte korrigiert mich, wenn das mist ist was ich mache, nur weil's läuft, heißt es ja nicht, das es gut ist. Ich möchte ja nicht, dass wenn mein Script z.B. in Endlosschleifen läuft, die Performance fps in den Keller gehen, oder irgendsoetwas!
 
Zuletzt bearbeitet von einem Moderator:
Du, man kann Beiträge auch editieren ;)

Ähh... was die Vampirdetektion angeht. Ja, stimmt. Da war was, ich erinnere mich dunkel. Es gibt zwei Wege, wie Vampirismus erkannt wird.

In Dialogen gibt es eine Function "PC Vampire". Man beachte das Leerzeichen. Diese Funktion, die in Scripts nicht aufrufbar ist, arbeitet in der Tat hardcoded mit dem SpellEffect "Vampirism" und wenn man den entfernt, liefert sie False, der Spieler wird nicht als Vampir erkannt. Aber...

Das ist nicht bei allen Dialogen so und in Scripts funktioniert das ganz anders. Zum Beispiel Ano Vando, der Vampirjäger in Ald'ruhn... der detektiert das anhand der Global "PCVampire" und erkennt den Spieler auch bei aktivierter Tarnung. Und die Vampirclans werden dich auch erkennen (die prüfen was anderes ab). Gleiches gilt für die Werwolf Rückprüfungen (glücklicherweise wird die Global benutzt). Ich meine mich zu erinnern, dass es noch weitere Fallen gibt, zum Beispiel Ano's Waffe "Light of Day", trotz Tarnung wird die dich erkennen.

Was das andere angeht, ist das logisch. Das Script prüft jedes Frame nach, ob das Teil im Spielerinventar ist und wenn nicht, wird gepostet. Du mußt das also mit OnPCDrop verbinden, damit das nur einmal kommt.
 
Ist halt etwas sinnlos, weil du permanent prüfst, ob der Gegenstand noch im Inventar ist. Wobei - andererseits, ok... kann man machen, wenn es ohnehin nur ein Exemplar gibt. Aber mal abgesehen davon - was machst du, damit die korrekte Vampirfunktion wieder aktiv wird, sobald der Ring abgelegt wurde ;)
 
Zuletzt bearbeitet:
Das hatte ich vergessen ;-)
Begin _AmarasRing Script

Short PCSkipEquip
Short State

if ( OnActivate == 1 )
set state to 1
disable
player->additem "_Amaras Ring" 1
if ( GetJournalIndex "_Amara_Ring" < 1 )
Journal "_Amara_Ring" 1
endif
if ( PcVampire == 1 )
Messagebox "In dem Ring ist etwas eingraviert: Der Besitzer dieses Ringes muss diesen nicht am Finger tragen, es ist ausreichend ihn mit sich zu führen. Als Vampir kann sein Besitzer das Sonnenlicht genießen und wird von Lebenden nicht als Geschöpf der Nacht erkannt."
Player->removespell, "Vampire Sun Damage"
Player->addspell, "Vampire Amara"
else
Messagebox "Um die Fähigkeiten dieses Ringes auskosten zu können, müsst ihr ein Vampir sein."
endif
endif

set PCSkipEquip to 1

if ( player->GetItemCount "_Amaras Ring" == 0 )
if ( state == 1 )
if ( PcVampire == 1 )
Messagebox "Nachdem ihr den Ring abgelegt habt, könnt ihr nun nicht mehr im Sonnenlicht wandeln, Lebende werden euch auch wieder als Geschöpf der Nacht identifizieren können."
Player->removespell, "Vampire Amara"
Player->addspell, "Vampire Sun Damage"
else
Messagebox "Da ihr kein Vampir seid, spürt ihr nach dem Ablegen des Ringes keinerlei Veränderungen."
endif
set state to 2
endif
endif

End

Das ist in der Tat sinnlos, dies permanent prüfen zu lassen!
Übt sich das irgendwie negativ aus, wenn diese Prüfung permanent läuft?
Wie funktioniert das mit OnPCDrop?
 
Zuletzt bearbeitet:
Versuch mal das:

Code:
Begin _AmarasRing Script
Short	PCSkipEquip
Short	State

set PCSkipEquip to 1

IF ( State == 1 )
	IF ( ( player->GetItemCount "_Amaras Ring" ) == 0 )
		IF ( PcVampire == 1 )
			MessageBox "Nachdem ihr den Ring abgelegt habt, könnt ihr nun nicht mehr im Sonnenlicht wandeln, Lebende werden euch auch wieder als Geschöpf der Nacht identifizieren können."
			Player->RemoveSpell, "Vampire Amara"
			Player->AddSpell, "Vampire Sun Damage"
		Else
			MessageBox "Da ihr kein Vampir seid, spürt ihr nach dem Ablegen des Ringes keinerlei Veränderungen."
		EndIF
		set State to 0
	EndIF

ElseIF ( OnActivate )
	set State to 1
	IF ( GetJournalIndex "_Amara_Ring" < 1 )
		Journal "_Amara_Ring" 1
	EndIF
	IF ( PcVampire == 1 )
		MessageBox "In dem Ring ist etwas eingraviert: Der Besitzer dieses Ringes muss diesen nicht am Finger tragen, es ist ausreichend ihn mit sich zu führen. Als Vampir kann man mit diesem Ring das Sonnenlicht genießen und wird von Lebenden nicht als Geschöpf der Nacht erkannt.", "Ok"
		player->RemoveSpell, "vampire Sun Damage"
		player->Addspell, "Vampire Amara"
	Else
		MessageBox "Um die Fähigkeiten dieses Ringes auskosten zu können, müsst ihr ein Vampir sein.", "Ok"
	EndIF
	Activate

EndIF

End
...das sollte recht brauchbar laufen. Allerdings nicht ganz cheatsicher, fall jemand durch Konsolencheat mehr als einen Ring hätte.
 
Zuletzt bearbeitet:
Das läuft leider nicht!
Nehme ich den Ring auf, bekomme ich beide Meldungen
Messagebox "In dem Ring ist etwas eingraviert:...
und die Messagebox "Nachdem ihr den Ring abgelegt habt,...
lege ich ihn ab, gar keine!
Des weiteren sind beide Zauber beim Aufnehmen des Rings aktiv!
Und, das Spiel stürzt jedes mal ab, wenn ich auf beenden klicke!
Irgendwas scheint da noch zu klemmen!
 
Meine Güte ist das alles kompliziert!
Nutze ich disable funktionierts, nutze ich activate werde ich nicht "wieder zum Vampir" beim ablegen, außerdem erscheint der Gegenstand noch ein zweites mal (1mal abgelegt und 1mal im inventar) Diesen kann ich dann ganz normal ablegen.
Das Problem bei der "disable" Variante ist, wenn ich aus einem Container "alles nehme" oder nur diesen Gegenstand, dann passiert gar nichts!
Kann man einstellen, wie lange die Messageboxen aufpoppen? Sie mit "OK" zu bestätigen finde ich nicht so gut, allerdings finde ich, dass sie zu lange sichtbar sind.
 
Zuletzt bearbeitet:
Die Dauer der Messageboxen ist durchg eine Variable und die Anzahl Zeichen festgelegt. Die würd Var. ich nicht verändern, da sonst alle MB's länger/weniger lang angezeigt werden.
 
Du könntest nach der von dir gewünschten Zeit, hintereinander 3 leere Messageboxen anzeigen lassen. Da maximal 3 Messageboxen angezeigt werden, würde die andere so ausgeblendet und die sie leer sind, sollten sie nur für Sekundenbruchteile sichtbar sein.