Rather than teleport them, you can make them script hidden.
Try something like this for the devour ability itself (special ability, or on hit, or whatever you like):
void ExpelDigestee()
{
object oDigestee = GetLocalObject(OBJECT_SELF, "oDigestee");
if (!GetIsObjectValid(oDigestee))
return;
effect eEffect = GetFirstEffect(oDigestee);
while (GetIsEffectValid(eEffect))
{
if (GetEffectType(eEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE)
{
RemoveEffect(oDigestee, eEffect);
eEffect = GetFirstEffect(oDigestee);
}
else
eEffect = GetNextEffect(oDigestee);
}
SetScriptHidden(oDigestee, FALSE);
DeleteLocalObject(OBJECT_SELF, "oDigestee");
}
void DoAcidDamage()
{
object oDigestee = GetLocalObject(OBJECT_SELF, "oDigestee");
if (!GetIsObjectValid(oDigestee))
return;
if (!GetIsDead(oDigestee))
{
effect eAcidDamage = EffectDamage(3, DAMAGE_TYPE_ACID); // Make sure to edit this for desired damage
ApplyEffectToObject(DURATION_TYPE_INSTANT, eAcidDamage, oDigestee, 0.0);
if (!GetIsDead(oDigestee))
DelayCommand(6.0, DoAcidDamage());
else
ExpelDigestee();
}
else
{
ExpelDigestee();
}
}
void main()
{
object oTarget = GetSpellTargetObject();
if (!GetIsObjectValid(oTarget))
return;
if (GetIsObjectValid(GetLocalObject(OBJECT_SELF, "oDigestee")))
return; // Can't devour another person if belly is already full!
SetLocalObject(OBJECT_SELF, "oDigestee", oTarget);
effect eParalyse = EffectCutsceneParalyze();
effect eIcon = EffectEffectIcon(16);
eParalyse = EffectLinkEffects(eIcon, eParalyse);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eParalyse, oTarget, 0.0);
SetScriptHidden(oTarget, TRUE);
DelayCommand(6.0, DoAcidDamage());
}
And something like this for the creature’s on damaged script:
void ExpelDigestee()
{
object oDigestee = GetLocalObject(OBJECT_SELF, "oDigestee");
if (!GetIsObjectValid(oDigestee))
return;
effect eEffect = GetFirstEffect(oDigestee);
while (GetIsEffectValid(eEffect))
{
if (GetEffectType(eEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE)
{
RemoveEffect(oDigestee, eEffect);
eEffect = GetFirstEffect(oDigestee);
}
else
eEffect = GetNextEffect(oDigestee);
}
SetScriptHidden(oDigestee, FALSE);
DeleteLocalObject(OBJECT_SELF, "oDigestee");
}
void main()
{
object oDigestee = GetLocalObject(OBJECT_SELF, "oDigestee");
if (GetIsObjectValid(oDigestee))
{
if (Random(10) == 0) // Set your desired chance of expelling digested member here
ExpelDigestee();
}
}
And for some redundancy, because you absolutely won’t want to leave a character as script hidden (shouldn’t happen with the safeguards in place above, but “shouldn’t” and “won’t” happen are not the same thing!), make sure the creature’s on death script has something similar to the on damaged script too, just without the random portion of course.
Edit: in fact I’d probably do some extra checks in the on death script, such as:
void ExpelDigestee()
{
object oDigestee = GetLocalObject(OBJECT_SELF, "oDigestee");
if (!GetIsObjectValid(oDigestee))
return;
effect eEffect = GetFirstEffect(oDigestee);
while (GetIsEffectValid(eEffect))
{
if (GetEffectType(eEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE)
{
RemoveEffect(oDigestee, eEffect);
eEffect = GetFirstEffect(oDigestee);
}
else
eEffect = GetNextEffect(oDigestee);
}
SetScriptHidden(oDigestee, FALSE);
DeleteLocalObject(OBJECT_SELF, "oDigestee");
}
void main()
{
object oDigestee = GetLocalObject(OBJECT_SELF, "oDigestee");
if (GetIsObjectValid(oDigestee))
ExpelDigestee();
object oPC = GetFirstPC();
object oParty = GetFirstFactionMember(oPC, FALSE);
while (GetIsObjectValid(oParty))
{
if (GetScriptHidden(oParty))
SetScriptHidden(oParty, FALSE);
effect eEffect = GetFirstEffect(oParty);
while (GetIsEffectValid(eEffect))
{
if (GetEffectType(eEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE)
{
RemoveEffect(oParty, eEffect);
eEffect = GetFirstEffect(oParty);
}
else
eEffect = GetNextEffect(oParty);
}
oParty = GetNextFactionMember(oPC, FALSE);
}
}
There’s a few things you may want to add, such as notice text to indicate what is happening, because that is probably not going to be obvious to players, but it seems functional enough from a quick test.