public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target)
    {
        Logger.Info("Magic Missile OnEndProjectile");
        EndProjectileParticles(projectile);
        var target      = spell.Targets[index_of_target];
        var damage_dice = Dice.D4;

        damage_dice = damage_dice.WithModifier(1);
        var target_item_obj = target.Object;

        if ((!((PartyLeader.GetPartyMembers()).Contains(spell.caster))) && target_item_obj.D20Query(D20DispatcherKey.QUE_Critter_Is_Charmed))
        {
            // NPC enemy is trying to cast on a charmed target - this is mostly meant for the Cult of the Siren encounter
            target_item_obj = Utilities.party_closest(spell.caster, exclude_warded: true); // select nearest conscious PC instead, who isn't already charmed
            if (target_item_obj == null)
            {
                target_item_obj = target.Object;
            }
        }

        // always hits
        target_item_obj.AddCondition("sp-Magic Missile", spell.spellId, spell.duration, damage_dice.Roll());
        target.ParticleSystem = AttachParticles("sp-magic missle-hit", target_item_obj);
        // special scripting for NPCs no longer necessary - NPCs will launch multiple projectiles now
        // spell.target_list.remove_target_by_index( index_of_target )
        spell.RemoveProjectile(projectile);
        if (spell.projectiles.Length == 0)
        {
            // loc = target.obj.location
            // target.obj.destroy()
            // mxcr = game.obj_create( 12021, loc )
            // game.global_vars[30] = game.global_vars[30] + 1
            spell.EndSpell(true);
        }
    }
    public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target)
    {
        Logger.Info("Scorching Ray OnEndProjectile");

        var projectiles = Math.Min(3, (spell.casterLevel + 1) / 4);

        if (index_of_target < projectiles)
        {
            spell.duration = 0;
            EndProjectileParticles(projectile);
            var target     = spell.Targets[index_of_target];
            var return_val = spell.caster.PerformTouchAttack(target.Object);
            var(xx, yy) = target.Object.GetLocation();
            if (target.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
            {
                target.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                AttachParticles("swirled gas", target.Object);
                Sound(7581, 1);
                Sound(7581, 1);
            }
            else if ((return_val & D20CAF.HIT) != D20CAF.NONE)
            {
                if (index_of_target > 0)
                {
                    return_val |= D20CAF.NO_PRECISION_DAMAGE;
                }

                var damage_dice = Dice.Parse("4d6");
                AttachParticles("sp-Scorching Ray-Hit", target.Object);
                target.Object.DealSpellDamage(spell.caster, DamageType.Fire, damage_dice, D20AttackPower.UNSPECIFIED, 100, D20ActionType.CAST_SPELL, spell.spellId, return_val, index_of_target);
            }
            else
            {
                // missed
                target.Object.FloatMesFileLine("mes/spell.mes", 30007);
                AttachParticles("Fizzle", target.Object);
            }
        }


        spell.RemoveProjectile(projectile);
        if ((spell.projectiles.Length == 0))
        {
            spell.EndSpell(true);
        }
    }
Esempio n. 3
0
    public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target)
    {
        Logger.Info("Magic Missile OnEndProjectile");
        var target = spell.Targets[index_of_target];

        var damage_dice = Dice.D4;

        damage_dice = damage_dice.WithModifier(1);
        target.Object.AddCondition("sp-Magic Missile", spell.spellId, spell.duration, damage_dice.Roll());
        target.ParticleSystem = AttachParticles("sp-magic missle-hit", target.Object);

        spell.RemoveProjectile(projectile);
        if (spell.projectiles.Length == 0)
        {
            spell.EndSpell(true);
        }
    }
Esempio n. 4
0
    public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target)
    {
        Logger.Info("Magic Missile OnEndProjectile");
        var target      = spell.Targets[index_of_target];
        var damage_dice = Dice.Parse("5d12");

        damage_dice = damage_dice.WithModifier(1);
        // always hits
        target.Object.DealSpellDamage(spell.caster, DamageType.Force, damage_dice, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId);
        target.ParticleSystem = AttachParticles("sp-magic missle-hit", target.Object);
        // spell.target_list.remove_target_by_index( index_of_target )

        spell.RemoveProjectile(projectile);
        if (spell.projectiles.Length == 0)
        {
            // loc = target.obj.location
            // target.obj.destroy()
            // mxcr = game.obj_create( 12021, loc )
            // game.global_vars[30] = game.global_vars[30] + 1
            spell.EndSpell(true);
        }
    }
    public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target)
    {
        Logger.Info("Meteor Swarm OnEndProjectile");
        var dam         = Dice.Parse("2d6");
        var dam2        = Dice.Parse("6d6");
        var projectiles = 4;

        if (index_of_target < projectiles)
        {
            spell.duration = 0;
            EndProjectileParticles(projectile);
            var target_item = spell.Targets[index_of_target];
            var return_val  = spell.caster.PerformTouchAttack(target_item.Object);
            var(xx, yy) = target_item.Object.GetLocation();
            if (target_item.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
            {
                target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                AttachParticles("swirled gas", target_item.Object);
                Sound(7581, 1);
                Sound(7581, 1);
            }
            else
            {
                if (((return_val & D20CAF.HIT)) != D20CAF.NONE)
                {
                    // hit target
                    if (index_of_target > 0)
                    {
                        return_val |= D20CAF.NO_PRECISION_DAMAGE;
                    }

                    AttachParticles("sp-Spheres of Fire-hit", target_item.Object);
                    target_item.Object.DealSpellDamage(spell.caster, DamageType.Bludgeoning, dam, D20AttackPower.UNSPECIFIED, 100, D20ActionType.CAST_SPELL, spell.spellId, return_val, index_of_target);
                    target_item.Object.DealSpellDamage(spell.caster, DamageType.Fire, dam2, D20AttackPower.UNSPECIFIED, 100, D20ActionType.CAST_SPELL, spell.spellId, return_val, index_of_target);
                }
                else
                {
                    // miss target
                    target_item.Object.FloatMesFileLine("mes/spell.mes", 30007);
                    AttachParticles("Fizzle", target_item.Object);
                    if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam2, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                    {
                        // saving throw successful
                        target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
                    }
                    else
                    {
                        // saving throw unsuccessful
                        target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
                    }
                }

                AttachParticles("sp-Fireball-Hit", target_item.Object);
                foreach (var critter in ObjList.ListCone(target_item.Object, ObjectListFilter.OLC_CRITTERS, 40, -180, 360))
                {
                    if ((critter != target_item.Object) && (!critter.D20Query(D20DispatcherKey.QUE_Dead)))
                    {
                        (xx, yy) = critter.GetLocation();
                        if (critter.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
                        {
                            critter.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                            AttachParticles("swirled gas", critter);
                            Sound(7581, 1);
                            Sound(7581, 1);
                        }
                        else
                        {
                            AttachParticles("hit-FIRE-burst", critter);
                            if (critter.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam2, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                            {
                                // saving throw successful
                                critter.FloatMesFileLine("mes/spell.mes", 30001);
                            }
                            else
                            {
                                // saving throw unsuccessful
                                critter.FloatMesFileLine("mes/spell.mes", 30002);
                            }
                        }
                    }
                }
            }

            spell.RemoveProjectile(projectile);
        }

        if ((spell.projectiles.Length <= 0))
        {
            spell.EndSpell(true);
        }
    }