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); } }
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); } }
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); } }