public static void Fire(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint specialTarget)
{
List <uint> targets = new List <uint>();
if (s.GetIsObjectValid(specialTarget) == TRUE)
{
targets.Add(specialTarget);
}
foreach (uint contents in s.GetObjectsInPersistentObject(s.GetObjectByTag(trap.Tag, 0), OBJECT_TYPE_CREATURE, 0))
{
if (FitsTrapTargetRestriction(s, trap, contents))
{
targets.Add(contents);
}
}
if (targets.Count == 0)
{
// Might be that they all left. In any case
// we have nothing to shoot
trap.IsFiring = false;
return;
}
uint target;
if (targets.Count == 1)
{
target = targets[0];
}
else
{
target = targets[s.Random(targets.Count)];
}
uint caster;
if (s.GetIsObjectValid(trap.TrapOrigin) == FALSE)
{
caster = s.GetObjectByTag(trap.Tag, 0);
}
else
{
caster = trap.TrapOrigin;
}
if (trap.SpellTrap)
{
// It's a spell-- guess this is simple.
s.AssignCommand(caster, delegate { s.ActionCastSpellAtObject(trap.SpellId, target, METAMAGIC_NONE, TRUE, 0, 0, 1); });
}
else
{
foreach (uint victim in s.GetObjectsInShape(trap.EffectArea, trap.EffectSize, s.GetLocation(target), false, OBJECT_TYPE_CREATURE, s.GetPosition(caster)))
{
s.ApplyEffectToObject(DURATION_TYPE_INSTANT, GetTrapEffect(s, trap, victim), victim, 0.0f);
_doSoloVFX(s, trap, victim);
}
_doGroupVFX(s, trap, s.GetLocation(target));
}
if (trap.NumberOfShots > -1)
{
if (trap.NumberOfShots < 2)
{
TrapDisable.RemoveTrap(s, trap);
return;
}
else
{
trap.NumberOfShots--;
}
}
trap.IsFiring = true;
s.DelayCommand(6.0f, delegate { Fire(s, trap); });
}