Issue Data
|
Issue #23400: Some companions have contextually inappropriate cases for some of their dead actor loot reactions
And the context is a mechanoid dead actor being looted; a robot, synth, or turret. In this case, Curie, Deacon, and Strong have reaction commentary on the looting that refers to the target as if it were organic or even a dead human/Gen3 synth.
To get the story event data to the companion reaction dialogue quests, some alias relay needs to happen from the event trigger quest, CA_LootCorpse. That quest is the one plugged into the event manager, and it causes a dialogue keyword trigger that is received by the companion quests. However, the quest immediately does a self-shutdown in its one and only quest stage's script fragment. This does not allow enough time to check the actor type keywords on the relayed alias in the companion dialogue quest. Originally, I used "utility.wait(8.0)" right before the ["stop()" in the script frag, but Arthmoor and Sclerocephalus do not think that is a good idea. I have tested extensively with Curie, who has three of her four reaction dialogues having the contextual inappropriateness, and without the self-shut-down delay, I have only once heard a reaction from her, and that was with the one contextually neutral reaction she has (which was not affected by the new conditions) I believe that if there is a means to safely and cleanly delay the CA_LootCorpse self-shutdown, it is beyond my ability to script. I am uploading the module with the alias relay setup and the condition checks for those more adept at scripting to make CA_LootCorpse remain running long enough to keep that alias filled for the condition checks. Attached Files: RobotsAreNotCorpses.esp |
I fixed it as follows:
(1) Added a hidden objectReference property on CA_QuestScript. This is 'none' by default.
(2) Added a reference alias to CA_LootCorpse that is filled with the original container's reference from the event data (just like in your plugin).
(3) Removed the Stop() call from the stage 0 fragment of CA_LootCorpse. This stage is now completely empty.
(4) Added a new stage 10, and added the Stop() call there.
(5) Modified the 'stage' property on CA_QuestScript (attached to CA_LootCorpse) to send its event on stage 10 instead of stage 0
(6) Added a custom script to the new alias that reacts to an OnAliasInit() event. This fires when the quest has finished its startup, pretty much at the same time as it would start running its startup fragment (if it still had one).
The script gets the reference from the alias and fills it in the new hidden property on CA_QuestScript. Then it sets stage 10 (and the quest will shut down).
(7) Modified the OnStageSet() event on CA_QuestScript to send the reference from the new property with the main event if it is not 'none', instead of Optional_Target (which was set to 'none' in the editor).
Thus, the quest will now shut down only a tad slower, due to the extra time needed to take the reference from the alias and write it in the new script property. When it shuts down, the reference is safely stored in a script property, so we don't have to keep the quest running for an extended period of time. Moreover though, we're also passing the reference to FollowersScript, in a variable that was intended to be used for conditioning dialogue anyway. Since the new script property is only ever anything else than 'none' on CA_LootCorpse (because only this quest has it filled by a script), the modifications on CA_QuestScript only affect that quest. All other quests running this script will still be doing what they always did.
Of course, I also added the condition checks to the various dialogue topics,
Thanks for your preliminary work, btw. This saved me much time of digging into the game files to find the records which I had to look at.
(1) Added a hidden objectReference property on CA_QuestScript. This is 'none' by default.
(2) Added a reference alias to CA_LootCorpse that is filled with the original container's reference from the event data (just like in your plugin).
(3) Removed the Stop() call from the stage 0 fragment of CA_LootCorpse. This stage is now completely empty.
(4) Added a new stage 10, and added the Stop() call there.
(5) Modified the 'stage' property on CA_QuestScript (attached to CA_LootCorpse) to send its event on stage 10 instead of stage 0
(6) Added a custom script to the new alias that reacts to an OnAliasInit() event. This fires when the quest has finished its startup, pretty much at the same time as it would start running its startup fragment (if it still had one).
The script gets the reference from the alias and fills it in the new hidden property on CA_QuestScript. Then it sets stage 10 (and the quest will shut down).
(7) Modified the OnStageSet() event on CA_QuestScript to send the reference from the new property with the main event if it is not 'none', instead of Optional_Target (which was set to 'none' in the editor).
Thus, the quest will now shut down only a tad slower, due to the extra time needed to take the reference from the alias and write it in the new script property. When it shuts down, the reference is safely stored in a script property, so we don't have to keep the quest running for an extended period of time. Moreover though, we're also passing the reference to FollowersScript, in a variable that was intended to be used for conditioning dialogue anyway. Since the new script property is only ever anything else than 'none' on CA_LootCorpse (because only this quest has it filled by a script), the modifications on CA_QuestScript only affect that quest. All other quests running this script will still be doing what they always did.
Of course, I also added the condition checks to the various dialogue topics,
Thanks for your preliminary work, btw. This saved me much time of digging into the game files to find the records which I had to look at.
Thinking about it, two of Curie comments (those about the police and the coroner) only ever make sense for humans and non-feral ghouls.
Showing Comments 1 - 2 of 2