Ineffective Creatures: Every Animal Companion with Spot, Listen, Hide, and/or Move Silently. (And mostly familiars with those skills as well)
It occurred to me that familiars, animal companions, and dominated animals lack any AI to respond to their masters. The exception, of course, is when familiars are directly controlled.
Because the AI never does anything other than follow, stand ground, or attack, all of their skills that make use of stealth or detect become largely useless.
I discussed this on Discord, and the main argument against it was just that companions are primarily for RP so it doesn't matter.
I would argue that if I want to have my dire rat with me while I solo a cave full of undead, where my rat couldn't even use his sneak attack and will likely just die, that should be my decision. I sometimes make such decisions for RP.
But there is no reason why he couldn't at least try to be stealthy while he's there.
My suggestion is to have companions/familiars/dominated mimic what their master does. If their master is detecting, so are they. If their master is stealthed, so are they.
This is a quick and easy fix that would allow everyone with a pet to have some basic control over how their pet is acting.
To make it even quicker and easier for you, I'll leave the code block for it below.
You likely already have an AI code block for "if (GetMaster(OBJECT_SELF))". If so, you can probably just drop this in. If not, it can go in any of the NPC AI code that runs for pets.
if (GetMaster(OBJECT_SELF) != OBJECT_INVALID) // We only care if we have a master
{
object oMaster = GetMaster(OBJECT_SELF);
// If our master is stealthy, we try to be stealthy
if (GetStealthMode(oMaster) && !GetStealthMode(OBJECT_SELF)) SetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH, TRUE);
// If our master enters combat, we want to keep our current status. This will increase our odds of using backstab (IE: Dire Rat). If we have a Hold Position command, we will hold and remain stealthy.
// Otherwise, if our master is not stealthy, we stop being stealthy.
else if (!GetIsInCombat(oMaster) && !GetStealthMode(oMaster) && GetStealthMode(OBJECT_SELF)) SetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH, FALSE);
// If our master is detecting, we try to detect.
if (GetDetectMode(oMaster) && !GetDetectMode(OBJECT_SELF)) SetActionMode(OBJECT_SELF, ACTION_MODE_DETECT, TRUE);
// If our master enters combat, we want to keep our current status. This will increase our odds of spotting stealthy ambushers.
// Otherwise, if our master is not detecting, we stop detecting.
else if (!GetIsInCombat(oMaster) && !GetDetectMode(oMaster) && GetDetectMode(OBJECT_SELF)) SetActionMode(OBJECT_SELF, ACTION_MODE_DETECT, FALSE);
}
Checking for action modes is one of the quickest and least laggy things that the Aurora engine can do, and the action mode is only changed when it's actually needed.
This shouldn't cause any noticeable lag at all.
(Edited to make oMaster a variable to reduce checks to find the master)