[Modding] Tote sehen / erkennen

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
264
Ich hatte es (erfolglos) mit diesem Script versucht:

IF
Global("NQ#TEST","GLOBAL",1)
See([0])
OR(2)
StateCheck(Lastseenby(Myself),STATE_DEAD)
StateCheck(Lastseenby(Myself),STATE_REALLY_DEAD)
THEN
RESPONSE #100
SetGlobal("NQ#TEST","GLOBAL",0)
ReallyForceSpellRES("SPWI408",Myself)
END

Wenn ein toter NPC gesehen wird und die entsprechende Global auf 1 steht, soll in diesem Fall ein "Zauber" gewirkt werden.
Im Beispiel ist das "Steinhaut", aber im Endeffekt soll es die Fähigkeit eines Ghuls werden, der die Leiche "entfernt" und sich damit heilt. Daher kann das Objekt in See([0]) nicht genauer bestimmt werden.
Ich vermute, dass das Problem bei [0] liegt. Kennt jemand eine mögliche Alternative?
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
928
Schau dir mal das Bg1NPC-Project an. Wenn man mit Imoen zu Gorions Leiche geht, wird diese entfernt, weil Imoen vorschlägt, sie "ordentlich zu begraben". Könnte helfen (?)

Grüße!
Jarl
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
9.704
Gorion's "Leiche" hat eine eindeutige DV, wenn man die weiß ist das Ansprechen über Skript einfach.
Bei der eigentlichen Frage kann ich leider nicht helfen.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
7.810
Die See-Abfrage funktioniert so nicht. Vllt hilft See[ENEMY] ? Oder halt eine andere Einschränkung?
 

Lumorus

Wachender
Registriert
03.03.2011
Beiträge
3.247
Wenn man mit Imoen zu Gorions Leiche geht, wird diese entfernt, weil Imoen vorschlägt, sie "ordentlich zu begraben". Könnte helfen (?)
Das Gespräch mit Imoen wird hier dadurch getriggert, dass man bei Gorions Leiche den Brief aufhebt.
Genauso verhält es sich auch bei Tarneshs Tod - sammelt man seinen Steckbrief ein, startet Imoen den Dialog, wie sie sein Buch durchblättert.
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
928
Der Trigger NearLocation() könnte alternativ helfen, wenn man den Punkt auf Gorions Leichnam legt.
 

Taimon

Senior Member
Registriert
25.11.2001
Beiträge
1.264
Das Szenario ist mit Hilfe des See()-Triggers nur schwer abbildbar.
See() findet den nächsten Akteur, auf den die Objektbeschreibung passt. (Relativ zu dem Akteur, der das Skript ausführt.)
Wenn jetzt beispielsweise ein Partymitglied in der Nähe ist, wird der See()-Trigger immer dieses auswählen, auch wenn weiter weg eine Leiche liegt.
Dass heißt, du müsstest irgendwie alle anderen Kandidaten über die Objektbeschreibung ausschließen, damit das funktioniert.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
264
Danke für die Ansätze!

@Maus See[ENEMY] hat leider auch nicht geklappt. Ich vermute eine Einschränkung, damit verstorbene Gegner nicht mit Angriffen / Zaubern belegt oder durch sie Dialoge unterbunden werden etc.

@Jarl Wichtig wäre, dass der Effekt bei jeder Leiche eintritt. NearLocation() würde meiner Meinung nach nur im bestimmten Fall klappen. Evtl.gibt es da einen Weg über baldur.bcs (IF "irgendwer stirbt", dann "ActionOverride" speichere die Location), aber im Moment hoffe ich noch auf eine einfachere Lösung.

Der Befehl See() ist im Prinzip richtig, denn mit eingefügter DeathVar klappt er.
Gibt es irgendwo eine Liste mit allen möglichen Definitionen für das "Object" ([ENEMY], [ANYONE] etc.), die man irgendwo einsehen kann (evtl. 2da)?
Google hat mich da bisher nicht weitergebracht.


Bisher könnte ich nur einen Ghul erstellen, der sich z.B. ausschließlich von Kreischlingen ernährt, was auch eine interessante Hintergrundgeschichte geben kann:

IF
Global("NQ#TEST","GLOBAL",3)
See("GIBBER")
THEN
RESPONSE #100
SetGlobal("NQ#TEST","GLOBAL",4)
DisplayStringHead(Myself, @1003) // 3. GIBBER
END

IF
Global("NQ#TEST","GLOBAL",4)
See("GIBBER")
OR(2)
StateCheck(Lastseenby(Myself),STATE_DEAD)
StateCheck(Lastseenby(Myself),STATE_REALLY_DEAD)
THEN
RESPONSE #100
SetGlobal("NQ#TEST","GLOBAL",0)
DisplayStringHead(Myself, @1004) // 4. Dead GIBBER
END
 

Taimon

Senior Member
Registriert
25.11.2001
Beiträge
1.264
Schau dir mal die Beschreibung für das Skriptobjekt an. Du kannst eine Kombination aus den verschiedenen IDS benutzen.
Dürfte in deinem Fall trotzdem recht schwierig werden, es sei denn, alle potentiellen Leichen lassen sich darüber maskieren.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
264
Danke, genau so was habe ich gesucht.

In der General.ids habe ich schon mal "Dead" als "general type" gefunden, aber scheinbar ändert sich die "GENERAL" einer verstorbenen .cre nicht automatisch auf diesen Wert.
See([0.3.0.0.0.0.0]) hat jedenfalls auch nicht geklappt.
 
Zuletzt bearbeitet:

Taimon

Senior Member
Registriert
25.11.2001
Beiträge
1.264
In meiner Installation haben nur CORPSE1 und CORPSE2 diesen Wert.

Die Skriptobjekte sind weitesgehend statisch. Mit Ausnahme des EA-Wertes, der sich doch ab und zu ändert.

Vielleicht noch eine Idee:
Du könntest probieren, allen Kandidaten ein Skript zu geben, dass bei beim Tod des Akteurs (Died(Myself)) einen speziellen Wert setzt, z. B. via ChangeGeneral(Myself, DEAD). (Da gibt es sicher noch andere Möglichkeiten.)
Ist schon etwas umständlich, aber was besseres fällt mir im Moment nicht ein.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
264
Ich hab noch ein bisschen experimentiert und bin zu dem Ergebnis gekommen, dass See() leider nur bei verstorbenen NPC nur funktioniert, wenn die DV angegeben ist.

IF
Global("NQ#TEST","GLOBAL",1)
See([ANYONE.HUMANOID])
THEN
RESPONSE #100
DisplayStringHead(Myself,72062)
SetGlobal("NQ#TEST","GLOBAL",0)
END
 

Taimon

Senior Member
Registriert
25.11.2001
Beiträge
1.264
Mit welcher "Leiche" hast du das getestet?
Also welche CRE-Datei und wie ist sie gestorben.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
264
Das grausame Experiment wurde mit Baeloth(.cre) durchgeführt. Die Sterbeursache war STRG+Y.
Solange er lebendig war, hat der NPC bei Sichtkontakt (und aktivierter Test-Var) seinen Text aufgesagt.
Verstorben wurde Baeloth jedoch ignoriert und der Text erst beim nächsten Sichtkontakt mit dem HC getriggert.

Gleiches Experiment mit See("Baeloth") statt See([ANYONE.HUMANOID]) führt dazu, dass der Text auch aufgesagt wurde, wenn Baeloth nicht mehr lebte.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
9.704
Eine Frage dazwischen: heißt das auch, dass See([ENEMY]) nicht wahr gibt, wenn der Feind schon tot ist? Ich dachte bisher immer, dass das auch als "gesehener Feind" wahr triggert.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
264
Korrekt. Mit See([ENEMY]) habe ich einen ähnlichen Test durchgeführt. (gibber.cre, strg+y)
 

Taimon

Senior Member
Registriert
25.11.2001
Beiträge
1.264
Ich hab' mir das heute mal genauer in der Engine angesehen und kann das beobachtete Verhalten bestätigen.
Akteure die den Zustand STATE_DEAD haben, können nicht "gesehen" werden, wenn man sie mittels Skriptobjekt bestimmen möchte.

Die Engine sortiert die Objekte eines Gebietes in 3 Listen ein: Vordergrund (vertlist_front), Hintergrund (vertlist_back) und Overlay (vertlist_overlay). (Zumindest hab' ich sie so genannt.)
Wenn man ein Skriptobjekt mittels des Triggers See() finden möchte, dann wird nur die Liste mit den Vordergrundobjekten durchsucht, ausgehend von dem Akteur, der den Trigger ausgeführt hat. (Die Liste scheint sortiert zu sein.)
Beim Aktualisieren des Gebietes werden tote Akteure (STATE_DEAD) in die Hintergrundliste einsortiert. Folglich kann man sie dann nicht mehr im Vordergrund finden.

Ich sehe hier keine Chance, das gewünschte Verhalten irgendwie mit See() umzusetzen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
9.704
Jetzt mal eine blöde Idee: würde InMyArea() kombiniert mit Range() das anders handhaben? Wahrscheinlich wäre da schwierig, dieselbe tote Kreatur in beiden Triggern zu treffen..
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
9.704
Das heißt dass eine tote cre mit Death Variable durch Range() nicht erfasst wird?
 
Oben