/// <summary> /// Handles equipping an item casting a spell on player or creature /// </summary> public virtual EnchantmentStatus CreateItemSpell(WorldObject item, uint spellID) { var enchantmentStatus = new EnchantmentStatus(spellID); var spell = enchantmentStatus.Spell; if (spell.NotFound) { return(enchantmentStatus); } switch (spell.School) { case MagicSchool.CreatureEnchantment: enchantmentStatus = CreatureMagic(this, spell, item, true); if (enchantmentStatus.Message != null) { EnqueueBroadcast(new GameMessageScript(Guid, spell.TargetEffect, spell.Formula.Scale)); } break; case MagicSchool.LifeMagic: LifeMagic(this, spell, out uint damage, out bool critical, out enchantmentStatus, item, true); if (enchantmentStatus.Message != null) { EnqueueBroadcast(new GameMessageScript(Guid, spell.TargetEffect, spell.Formula.Scale)); } break; case MagicSchool.ItemEnchantment: if (spell.HasItemCategory || spell.IsPortalSpell) { enchantmentStatus = ItemMagic(this, spell, item, true); } else { enchantmentStatus = ItemMagic(item, spell, item, true); } var playScript = spell.IsPortalSpell && spell.CasterEffect > 0 ? spell.CasterEffect : spell.TargetEffect; EnqueueBroadcast(new GameMessageScript(Guid, playScript, spell.Formula.Scale)); break; } return(enchantmentStatus); }
private void CreatePlayerSpell(WorldObject target, Spell spell) { var targetCreature = target as Creature; var targetPlayer = target as Player; bool targetDeath; var enchantmentStatus = new EnchantmentStatus(spell); LastSuccessCast_School = spell.School; LastSuccessCast_Time = Time.GetUnixTime(); switch (spell.School) { case MagicSchool.WarMagic: WarMagic(target, spell); break; case MagicSchool.VoidMagic: VoidMagic(target, spell); break; case MagicSchool.CreatureEnchantment: if (targetPlayer == null) { OnAttackMonster(targetCreature); } if (spell.IsHarmful) { var resisted = ResistSpell(target, spell); if (resisted == true) { break; } if (resisted == null) { log.Error("Something went wrong with the Magic resistance check"); break; } } if (targetCreature != null && targetCreature.NonProjectileMagicImmune) { Session.Network.EnqueueSend(new GameMessageSystemChat($"You fail to affect {targetCreature.Name} with {spell.Name}", ChatMessageType.Magic)); break; } EnqueueBroadcast(new GameMessageScript(target.Guid, spell.TargetEffect, spell.Formula.Scale)); enchantmentStatus = CreatureMagic(target, spell); if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } if (spell.IsHarmful) { if (targetCreature != null) { Proficiency.OnSuccessUse(this, GetCreatureSkill(Skill.CreatureEnchantment), targetCreature.GetCreatureSkill(Skill.MagicDefense).Current); } // handle target procs if (targetCreature != null && targetCreature != this) { TryProcEquippedItems(targetCreature, false); } if (targetPlayer != null) { UpdatePKTimers(this, targetPlayer); } } else { Proficiency.OnSuccessUse(this, GetCreatureSkill(Skill.CreatureEnchantment), spell.PowerMod); } break; case MagicSchool.LifeMagic: if (targetPlayer == null) { OnAttackMonster(targetCreature); } if (spell.MetaSpellType != SpellType.LifeProjectile) { if (spell.IsHarmful) { var resisted = ResistSpell(target, spell); if (resisted == true) { break; } if (resisted == null) { log.Error("Something went wrong with the Magic resistance check"); break; } } if (targetCreature != null && targetCreature.NonProjectileMagicImmune) { Session.Network.EnqueueSend(new GameMessageSystemChat($"You fail to affect {targetCreature.Name} with {spell.Name}", ChatMessageType.Magic)); break; } } if (target != null) { EnqueueBroadcast(new GameMessageScript(target.Guid, spell.TargetEffect, spell.Formula.Scale)); } targetDeath = LifeMagic(spell, out uint damage, out bool critical, out enchantmentStatus, target); if (spell.MetaSpellType != SpellType.LifeProjectile) { if (spell.IsHarmful) { if (targetCreature != null) { Proficiency.OnSuccessUse(this, GetCreatureSkill(Skill.LifeMagic), targetCreature.GetCreatureSkill(Skill.MagicDefense).Current); } // handle target procs if (targetCreature != null && targetCreature != this) { TryProcEquippedItems(targetCreature, false); } if (targetPlayer != null) { UpdatePKTimers(this, targetPlayer); } } else { Proficiency.OnSuccessUse(this, GetCreatureSkill(Skill.LifeMagic), spell.PowerMod); } } if (targetDeath == true) { targetCreature.OnDeath(new DamageHistoryInfo(this), DamageType.Health, false); targetCreature.Die(); } else { if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } } break; case MagicSchool.ItemEnchantment: // if negative item spell, can be resisted by the wielder if (spell.IsHarmful) { var targetResist = targetCreature; if (targetResist == null && target?.WielderId != null) { targetResist = CurrentLandblock?.GetObject(target.WielderId.Value) as Creature; } if (targetResist != null) { var resisted = ResistSpell(targetResist, spell); if (resisted == true) { break; } if (resisted == null) { log.Error("Something went wrong with the Magic resistance check"); break; } } } if (spell.IsImpenBaneType) { // impen / bane / brittlemail / lure // a lot of these will already be filtered out by IsInvalidTarget() if (targetCreature == null) { // targeting an individual item / wo enchantmentStatus = ItemMagic(target, spell); if (target != null) { EnqueueBroadcast(new GameMessageScript(target.Guid, spell.TargetEffect, spell.Formula.Scale)); } if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } } else { // targeting a creature if (targetPlayer == this) { // targeting self var items = EquippedObjects.Values.Where(i => (i.WeenieType == WeenieType.Clothing || i.IsShield) && i.IsEnchantable); foreach (var item in items) { enchantmentStatus = ItemMagic(item, spell); if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } } if (items.Count() > 0) { EnqueueBroadcast(new GameMessageScript(Guid, spell.TargetEffect, spell.Formula.Scale)); } } else { // targeting another player or monster var item = targetCreature.EquippedObjects.Values.FirstOrDefault(i => i.IsShield && i.IsEnchantable); if (item != null) { enchantmentStatus = ItemMagic(item, spell); EnqueueBroadcast(new GameMessageScript(item.Guid, spell.TargetEffect, spell.Formula.Scale)); if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } } else { // 'fails to affect'? if (targetCreature != null) { Session.Network.EnqueueSend(new GameMessageSystemChat($"You fail to affect {targetCreature.Name} with {spell.Name}", ChatMessageType.Magic)); } if (targetPlayer != null && !targetPlayer.SquelchManager.Squelches.Contains(this, ChatMessageType.Magic)) { targetPlayer.Session.Network.EnqueueSend(new GameMessageSystemChat($"{Name} fails to affect you with {spell.Name}", ChatMessageType.Magic)); } } } } } else if (spell.IsOtherNegativeRedirectable) { // blood loather, spirit loather, lure blade, turn blade, leaden weapon, hermetic void if (targetCreature == null) { // targeting an individual item / wo enchantmentStatus = ItemMagic(target, spell); if (target != null) { EnqueueBroadcast(new GameMessageScript(target.Guid, spell.TargetEffect, spell.Formula.Scale)); } if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } } else { // targeting a creature, try to redirect to primary weapon var weapon = targetCreature.GetEquippedWeapon() ?? targetCreature.GetEquippedWand(); if (weapon != null && weapon.IsEnchantable) { enchantmentStatus = ItemMagic(weapon, spell); EnqueueBroadcast(new GameMessageScript(weapon.Guid, spell.TargetEffect, spell.Formula.Scale)); if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } } else { // 'fails to affect'? Session.Network.EnqueueSend(new GameMessageSystemChat($"You fail to affect {targetCreature.Name} with {spell.Name}", ChatMessageType.Magic)); if (targetPlayer != null && !targetPlayer.SquelchManager.Squelches.Contains(this, ChatMessageType.Magic)) { targetPlayer.Session.Network.EnqueueSend(new GameMessageSystemChat($"{Name} fails to affect you with {spell.Name}", ChatMessageType.Magic)); } } } } else { // all other item spells, cast directly on target enchantmentStatus = ItemMagic(target, spell); if (target != null) { EnqueueBroadcast(new GameMessageScript(target.Guid, spell.TargetEffect, spell.Formula.Scale)); } if (enchantmentStatus.Message != null) { Session.Network.EnqueueSend(enchantmentStatus.Message); } } // use target resistance? Proficiency.OnSuccessUse(this, GetCreatureSkill(Skill.ItemEnchantment), spell.PowerMod); if (spell.IsHarmful) { var playerRedirect = targetPlayer; if (playerRedirect == null && target?.WielderId != null) { playerRedirect = CurrentLandblock?.GetObject(target.WielderId.Value) as Player; } if (playerRedirect != null) { UpdatePKTimers(this, playerRedirect); } } break; } }
/// <summary> /// Called from consumables or sentinel buffs /// </summary> /// <returns>TRUE if cast success, or FALSE is spell doesn't exist on server</returns> public bool CreateSingleSpell(uint spellId) { var player = this; var spell = new Spell(spellId); if (spell.NotFound) { if (spell._spellBase == null) { Session.Network.EnqueueSend(new GameEventCommunicationTransientString(Session, $"SpellId {spellId} Invalid.")); } else { Session.Network.EnqueueSend(new GameMessageSystemChat($"{spell.Name} spell not implemented, yet!", ChatMessageType.System)); } return(false); } var enchantmentStatus = new EnchantmentStatus(spell); switch (spell.School) { case MagicSchool.CreatureEnchantment: enchantmentStatus = CreatureMagic(player, spell); if (enchantmentStatus.Message != null) { EnqueueBroadcast(new GameMessageScript(player.Guid, spell.TargetEffect, spell.Formula.Scale)); } break; case MagicSchool.LifeMagic: LifeMagic(spell, out uint damage, out bool critical, out enchantmentStatus, player); if (enchantmentStatus.Message != null) { EnqueueBroadcast(new GameMessageScript(player.Guid, spell.TargetEffect, spell.Formula.Scale)); } break; case MagicSchool.ItemEnchantment: if (spell.IsPortalSpell) { var playScript = spell.CasterEffect > 0 ? spell.CasterEffect : spell.TargetEffect; EnqueueBroadcast(new GameMessageScript(player.Guid, playScript, spell.Formula.Scale)); enchantmentStatus = ItemMagic(player, spell); } else { if (spell.HasItemCategory) { enchantmentStatus = ItemMagic(player, spell); } EnqueueBroadcast(new GameMessageScript(player.Guid, spell.TargetEffect, spell.Formula.Scale)); } break; default: Console.WriteLine("Unknown magic school: " + spell.School); break; } return(true); }