Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        /// <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);
        }