[Modding] "7. Gruppenmitgliedsmodus": Quirks und zu beachtende Sonderheiten (Brandock, Solaufein, Grey)

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Mancher meiner NPC-Mods bieten einen sogenannten "7. Gruppenmitgliedsmodus" an: Solaufein, Grey und Brandock.
Die Originalidee war, weitere NPCs über die maximale Anzahl von 6 mitnehmen zu können und trotzdem den NPC bei Bedarf wie ein ganz normales Gruppenmitglied zur Verfügung zu haben, also: Level-Up mit Zaubern und Abilities, Ausstatten mit Items, Verwenden des Inventars zum Verstauen von Sachen und natürlich ganz wichtig: der NPC soll trotzdem an allen Bantern und Dialogen teilnehmen und seinen Senf zum Spielgeschehen geben.

Alles davon klappt irgendwie, und irgendwie gibt es aber Probleme das so umzusetzen, dass es völlig problemlos funktioniert. Manche sind nur auf dem Level des dahinter liegenden Skriptings und im Spiel nicht wirklich bemerkbar. Aber manche wirken sich im Spiel aus und müssen vom Spieler mit bedacht werden, damit es keine bösen Überraschungen gibt. Ich trage das mal hier zusammen. Noch bin ich nicht so weit, diesen 7. Gruppemitgliedsmodus zu deaktivieren, aber bei manchen der Nachteile bin ich mir noch nicht sicher, was die wirklich beste Lösung ist.

HINWEISE FÜR SPIELER:
(Die Hinweise sind eine Mischung aus den vorhandenen Restriktionen und den von mir verwendeten Workarounds.)

-Der NPC hat im 7.GM keinen "Clear Fog of War" um sich herum. Er kann also im "schwarzen" Bereich der Karte verschwinden. Wenn man die gesamte Gruppe anklickt und zu einer Stelle laufen lässt, wird er es ebenfalls versuchen, sofern er nicht irgendwo feststeckt o.ä.
-Items im Inventar werden nicht als Items im Besitz der Gruppe erkannt. Dies ist ein Engineproblem.
-Critical Items werden beim Wechsel in den 7. GMM in das Inventar des HC verschoben. Dadurch landen eventuell Gegenstände aus dem Invantar des HC auf dem Boden. Dies ist ein Engineproblem.
-Wenn bei einem Quest neue Items übergeben werden, erscheinen diese immer im Inventar der Gruppe bzw. HC, auch wenn sie eigentlich der NPC erhalten soll.
-Für Brandock habe ich versucht, bei seinen eigenen Questitems diese auch in seinem Inventar erkennen zu lassen. Das klappt zwar, aber:
-- Alle Items, um die es geht, werden über das Inventar das HC gehändelt bevor sie entweder einem Questgeber gegeben oder von diesem erhalten wurden.
-- Befand sich das weggebene Item, dass Brandock im Inventar hatte, in einem Nimmervollen Beutel (z.B. seine Buchtasche), dann stürt aus unerfindlichen Gründen das Spiel ab, wenn Brandock danach wieder über die PID-Option als vollwertiges Mitglied in die Gruppe aufgenommen werden soll. Dieser "Absturzbug" lässt sich umgehen, indem das Spiel gespeichert und wieder geladen wird.
-Es lohnt sich also, nach jedem Questereignis und nach dem Wechsel in den 7.GMM nochmal zu schauen, ob der HC Items aus dem Inventar verloren hat, die wieder vom Boden aufgelesen werden sollten!
-Es ist empfehlenswert, häufig zu speichern, vor allem bevor ein 7. GM wieder in die Gruppe aufgenommen werden soll, damit man keine Spielzeit verliert falls der "Absturzbug" auftreten sollte.
-Es ist nötig und auch für Brandock zu empfehlen, Questitems nicht im Inventar der 7. GM sondern in dem der normalen Gruppenmitglieder zu haben.
-Befinden sich Questitems von Brandock in seinem Inventar als 7. GM, dann werden sie wahrscheinlich erkannt weil ich das momentan reinskripte. Es ist trotzdem empfehlenswert, diese nicht in Beuteln/Nimmervollen Taschen von ihm zu verstauen, bevor man die entsprechenden Questgeber anspricht, um den "Absturzbug" zu verindern, oder auf alle Fälle zu speichern, bevor man ihn wieder richtig in die Gruppe aufnimmt.



HINWEISE FÜR MODDER / SKRIPTEN DES 7.GMM:

-Damit der NPC im 7. GM nicht stirbt aber auch nicht als unsterblicher Tank zur Verfügung steht verwende ich eine Kombination an Effekten und Skriptbefehlen falls die HP zu niedrig werden. Details dazu gebe ich gerne raus.
-Wenn der NPC niedrige Lebenspunkte hat kann er sterben, wenn er wieder in die Gruppe aufgenommen wird. Ich verhindere das, indem er nach jedem Kampf wieder voll geheilt wird.
-Das enginebedingte Aufrufen der Banter im B.dlg beinhaltet keine Familiars, d.h. die Banter (bzw. Inhalte des B.dlg) müssen über Skript des NPCs "per Hand" getriggert werden.
-Die Rastdialog d.bcs wird ebenfalls nicht aufgerufen. Rastdialoge müssen zusätzlich in die des Player1d.bcs eingefügt werden, damit sie getriggert werden können, wenn der NPC im 7. GMM ist.
-Das Händeln der Dialoge muss von Hand erfolgen, also beim Verlassen der Gruppe zum Wechsel in den 7. GMM muss der Dialog des NPC auf den Joined J.dlg gesetzt werden, damit er an Dialogen etc. teilnehmen kann.
-Eine einfache Abfrage ob der NPC in der Gruppe ist (InParty("npcname")) reicht nicht aus, weil diese Abfrage für Familiars nicht gültig ist. Das gilt auch for das in der EE verlässlich funktionierende IfValidForPartyDialog().
-GiveItemCreate erzeugt das Item im Inventar des Player1 und des 7.GM, wenn der 7.GM als Empfänger angegeben wurde. Neue Items müssen also immer direkt (und nur) ins Inventar des Player1 gegeben werden.
-GiveItem vom 7. GM zu einem Questcharakter wird nicht ausgeführt. Der 7.GM muss also Items erst per Skriptbefehl ins Inventar des Player1 geben, von dort aus können Questcharaktere sie nehmen.
-Das Handling von Items über das Inventar des Player1 ist insofern auch vorteilhaft, als dass man nur aus dem Inventar der Gruppenmitglieder eine bestimmte Anzahl entfernen kann (TakePartyItemNum). Der 7.GM kann nur den ganzen Stack weiterreichen.
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Hatte noch was vergessen:
-Critical Items werden beim Wechsel in den 7. GMM in das Inventar des HC/der anderen Gruppenmiglieder verschoben. Dies ist ein Engineproblem.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
8.092
Ist es nicht zwingend immer das des HC? Und daraus resultierend das Problem, dass die auf dem Boden landen bei Platzproblemen?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Wahrscheinlich ja. Ich war/bin mir nicht sicher, ob die Engine da nicht erstmal einen freien Platz sucht wie bei GiveItem[Create]. Und auf dem Boden landet etwas, was schon im Inventar war, da das verschobene/gegebene Item reingesetzt wird, oder irre ich mich? Nur wenn man Items über Cheats holt erscheinen sie gar nicht, wenn das ganze Inventar voll ist.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
8.092
Also bei Brandock ist es so, wenn ich den auf Position 7 schicke, dann kommen die Quest-Items immer zum HC und wenn da nicht genügend Platz ist, ist das Items zwar beim HC, aber dafür andere (meist die ersten, von links oben an) auf dem Boden. Wenn ein Platz frei ist, wird der genutzt und nicht irgendwas innerhalb des Inventars verschoben.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Ok, dann landen kritische Items immer beim HC. Macht insofern Sinn, als dass das der einzige ist, der sicher in der Gruppe bleibt.
Die nächste Version von Brandock wird ein paar seiner Items nicht mehr als kritisch taggen, damit er sie im Inventar behalten kann. Das bedeutet dann aber wieder, dass ich überprüfe, ob sie noch bei der Gruppe sind etcpp. Und dass der Spieler eventuell sich mal was hercheaten muss, wenn ein NPC damit abgedampft ist...
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
8.092
Na gut, wer NPC mit den Sachen wegschickt, ist ja schon ein wenig selber schuld. Man merkt es halt beim Übergang zwischen den Teilen der Triologie, wenn sehr viele Dinge beim HC landen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Naja, ich habe eben auch Brandock in den 7. GMM wechseln lassen ohne zu bedenken, dass er noch die feinen Stiefel im Inventar hatte obwohl ich sie kurz vorher noch gesehen hatte, die dann beim HC gelandet sind.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Neue Erkenntnisse, die ich nochmal eingehender testen muss:
TakePartyItem() ausgeführt vom 7. GM wird nicht ausgeführt, auch nicht als ActionOverride!
ActionOverride(Player1,GiveItem("itemname","7.GM")) führt dazu, dass das Item verdoppelt wird und sowohl im Inventar des HC als auch des 7.GM ist.
 

Taimon

Senior Member
Registriert
25.11.2001
Beiträge
1.334
TakePartyItem() ausgeführt vom 7. GM wird nicht ausgeführt, auch nicht als ActionOverride!
Es wird wahrscheinlich ausgeführt, aber die Engine verschiebt alle Items, die ein Familiar bekommt, zu Player1.
Wenn Du also mal ein Item nimmst, das nicht im Inventar von Player1 ist, dann sollte es danach zu Player1 gewandert sein.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
@Taimon interessante Überlegung! Danke, daran hatte ich nicht gedacht.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
286
-Der NPC hat im 7.GM keinen "Clear Fog of War" um sich herum. Er kann also im "schwarzen" Bereich der Karte verschwinden. Wenn man die gesamte Gruppe anklickt und zu einer Stelle laufen lässt, wird er es ebenfalls versuchen, sofern er nicht irgendwo feststeckt o.ä.

Ich benutze dazu "Spell Effect: Explore (Wizard Eye) [268]".
Damit der Effekt nicht angewendet wird, wenn der NPC nicht mit der Gruppe reist, habe ich den Befehl an ein Item gebunden, welches ausgetauscht wird (ReplaceItem), wenn er sich nicht in der Gruppe befindet.
Meine 7. NPC werden nicht in die Gruppe aufgenommen, weswegen das Item nicht stört.
In Deinem Fall würde ich den Effekt bei Gruppenaufnahme durch einen .spl auslösen und bei Abgang mit RemoveSpellEffect (oder so ähnlich) entfernen.

Das Entfernen ist auch deshalb sinnvoll:
"Die Anzahl der "sehenden" Kreaturen wird scheinbar durch das Spiel begrenzt. Weil man aber eine Unzahl an Golems mit dieser Fähigkeit herstellen kann (mitnehmen kann man maximal 3), kann es passieren, dass spätere Golems "blind" sind oder die Fähigkeit bei anderen NPCs nicht aktiviert wird. In konnte dadurch z.B. in einer Cutscene nichts sehen. [...]" (Aus der Rezension zum "Golem Construction for Spellcasters")
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
@Genwa ich habe mich dagegen entschieden, bei meinen 7. Gruppenmitgliedern CfoW Effekte einzusetzen. Die Engine hat eine Begrenzung auf 8 Charaktere mit CFoW pro Area - 6 davon sind in bereits die PC+NPC in der Gruppe. Fügt man da noch einen hinzu, dann sieht man bei Cutscenes etc. eventuell nur noch die Hälfte, hat man mehrere, sieht man gar nichts mehr.
Damit der Effekt nicht angewendet wird, wenn der NPC nicht mit der Gruppe reist, habe ich den Befehl an ein Item gebunden, welches ausgetauscht wird (ReplaceItem), wenn er sich nicht in der Gruppe befindet.
Man kann Zauber wirken und wieder entfernen, indem man mit ADD_SECTYPE arbeitet. Ich gebe darüber meinen 7. Gruppenmitgliedern Effekte, die z.B. vor permanentem Tod schützen sollen etc.
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
286
Man kann Zauber wirken und wieder entfernen, indem man mit ADD_SECTYPE arbeitet. Ich gebe darüber meinen 7. Gruppenmitgliedern Effekte, die z.B. vor permanentem Tod schützen sollen etc.

Hättest Du da vielleicht ein Beispiel zu? ADD_SECTYPE legt das in der .tp2 fest (?). Wie wird es dann in der .baf (?) angewendet?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Ein Beispiel wäre in meiner Brandock oder Solaufein-Mod, die Spells "c#min5hp.spl" und "c#min0hp.spl". Der eine wirkt die Schutzzaber, der andere hebt alles auf, was ich über ADD_SECTYPE im ersten definiert hatte. tp2-Code ist dann:
Code:
ADD_SECTYPE C#1HPEffect @1 /* ~(yawn)~ */

/* HP effect spell etc. */
COPY ~C#Brandock/spells/c#min5hp.spl~ ~override~
WRITE_BYTE 0x27 C#1HPEffect
WRITE_BYTE 0xa2 C#1HPEffect

/* remove 5 HP effect and all other protections */
COPY ~C#Brandock/spells/c#min0hp.spl~ ~override~
WRITE_BYTE 0xa2 C#1HPEffect
(Ist der Grund, warum die immer so viel Gähnen, wenn sie 7. Gruppemitglied sind. ;) )
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
8.092
(Ist der Grund, warum die immer so viel Gähnen, wenn sie 7. Gruppemitglied sind. ;) )
Das hatte ich mich auch schon immer gefragt... wobei es mir nur bei Grey aufgefallen ist...
 

Lumorus

Wachender
Registriert
03.03.2011
Beiträge
3.404
Das hatte ich mich auch schon immer gefragt... wobei es mir nur bei Grey aufgefallen ist...
Hehe, Brandock gähnt zwar nicht, aber er hustet in diesem Fall! Ich glaube, das ist ein versteckter Hinweis der beiden zu sagen !Hey komm schon, nimm mich wieder in die Gruppe, ich möchte nicht in der zweiten Reihe sitzen!" ;)

Was mir übrigens bei dem Verbesserten Schlüsselstein für den Freundlichen Arm aus ZFA aufgefallen ist, @Genwa:
Wenn alle 6 Gruppenslots belegt sind und Brandock & Grey 7. oder 8. Begleiter sind, erhält sowohl der HC den Verbesserten Schlüsslstein vom Boten, als auch einer der beiden.
Sind dagegen nur 4 Gruppenslots belegt, also wenn es genug Platz gäbe, um beide fest in der Gruppe zu haben, aber man hat sie trotzdem nur als Begleiter dabei, wird kein zweiter Schlüsselstein in einem ihrer Inventare gedroppt. Ich hatte das mal ausprobiert - in diesem Fall hatte nur der HC den Schlüsselstein vom Boten bekommen, obwohl beide nur Begleiter waren.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
10.109
Wenn alle 6 Gruppenslots belegt sind und Brandock & Grey 7. oder 8. Begleiter sind, erhält sowohl der HC den Verbesserten Schlüsslstein vom Boten, als auch einer der beiden.
Das bedeutet, dass der 7. Begleiter als Ziel für die Itemübergabe von der Engine ausgemacht wurde. :hae:
Wenn das nicht häufiger auch bei originalen Spielquests geschieht, dann könntest Du @Genwa überprüfen, welche Syntax Du verwendest, um den Schlüsselstein in das Inventar der Gruppe zu legen und ob Du da was ungewöhnliches verwendest.
@Lumorus ist Dir das auch schonmal mit anderen Gegenständen passiert? Außer in Brandocks eigenen Quests in älteren Modversionen..
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
286
Code:
IF ~~ THEN BEGIN HERO4
SAY @20904 // ~Seid Euch der großen Verantwortung dieses Geschenkes bewusst und lebt wohl!~
IF ~~ THEN DO ~TakePartyItem("NQ#FAT1") DestroyItem("NQ#FAT1") GiveItemCreate("NQ#FAT2",LastTalkedToBy,3,1,1) SetGlobal("DESTROY","LOCALS",1)~ EXIT
END

Code:
IF
  Global("DESTROY","LOCALS",1)
THEN
  RESPONSE #100
    ClearAllActions()
    ForceSpell(Myself,DRYAD_TELEPORT)
    Wait(1)
    DestroySelf()
    Continue()
END
 

Genwa

Betrachter
Registriert
08.01.2018
Beiträge
286
In diesem Fall kann ich "LastTalkedToBy" einfach durch "Player1" ersetzen.
Der Befehl dürfte in dieser Art aber öfter vorkommen und macht an anderen Stelle auch Sinn, weil Player1 z.B. nicht jedes Mal in der Nähe oder auf der gleichen Map sein muss, wenn die Gruppe ein Item erhält.

Im Prinzip kann ich bei Itemübergabe eine entsprechende Abfrage einbauen:
Wenn der Gesprächsparter Player1 - Player6 ist: Item geht an den Gesprächspartner ("LastTalkedToBy")
Wenn nicht: Item geht an Player1
 
Oben