What Tchos said I second. It's the way I do these kinds of things. CreateIPSpeaker is generally the most stable function for a conversation, but here what I think concerning your situation, because a battle in conversation can break if the owner is a combatant, or if a person who's suppose to speak dies, and therefore not around to speak his lines. I understand that you are not really comfortable with scripting, but so am I. This is easy though. It's basically what Tchos says, but with the script as well and reason behind it.
Place an ipoint placeable, not the speaker, on the area. Doesn't matter where, and give it a unique tag.
Write this script and compile.
#include "ginc_ipspeaker"
void main()
{
//This is so that we get a location for the ip_speaker spawn
//And so that the script will only fire for a PC or companion.
object oPC = GetEnteringObject();
if (!GetIsPC(oPC))
return;
location lLocation = GetLocation(oPC);
CreateIPSpeaker("TagOfYourIPPlaceable","TagOfConversation", lLocation, 0.5);
//Destroy the trigger so that it won't fire again. Up to you...
DelayCommand(2.0f, DestroyObject(OBJECT_SELF));
}
Then on your conversation, define speaker and listener. No matter what happens to them, in battle or not, the convo won't break because they don't own it. They are just a part of it. Your placeable owns the convo. Just be sure to not give them nodes after and if they die. Then the convo will break.
Edit, the script goes on a generic trigger's OnEnter event
.