Пример #1
0
        private void UltimateEnhancer(MapObject target, UserMagic magic, out bool cast)
        {
            cast = false;

            if (target == null || !target.IsFriendlyTarget(this)) return;
            UserItem item = GetAmulet(1);
            if (item == null) return;

            long expiretime = GetAttackPower(MinSC, MaxSC) * 2 + (magic.Level + 1) * 10;
            int value = MaxSC >= 5 ? Math.Min(8, MaxSC / 5) : 1;

            switch (target.Race)
            {
                case ObjectType.Monster:
                case ObjectType.Player:
                    //Only targets
                    if (target.IsFriendlyTarget(this))
                    {
                        target.AddBuff(new Buff { Type = BuffType.UltimateEnhancer, Caster = this, ExpireTime = Envir.Time + expiretime * 1000, Values = new int[] { value } });
                        target.OperateTime = 0;
                        LevelMagic(magic);
                        ConsumeItem(item, 1);
                        cast = true;
                    }
                    break;
            }
        }
Пример #2
0
        private void PetEnhancer(MapObject target, UserMagic magic, out bool cast)
        {
            cast = false;

            if (target == null || target.Race != ObjectType.Monster || !target.IsFriendlyTarget(this)) return;

            int duration = GetAttackPower(MinSC, MaxSC) + magic.GetPower();

            cast = true;

            DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, duration, target);

            ActionList.Add(action);
        }
Пример #3
0
        private void EnergyShield(MapObject target, UserMagic magic, out bool cast)
        {
            cast = false;

            if (!target.IsFriendlyTarget(this)) target = this; //offical is only party target

            int duration = 30 + 50 * magic.Level;
            int power = GetAttackPower(magic.GetPower(MinSC), magic.GetPower(MaxSC) + 1);
            int chance = 9 - (Luck / 3 + magic.Level);

            int[] values = { chance < 2 ? 2 : chance, power };

            switch (target.Race)
            {
                case ObjectType.Player:
                    //Only targets
                    if (target.IsFriendlyTarget(this))
                    {
                        target.AddBuff(new Buff { Type = BuffType.EnergyShield, Caster = this, ExpireTime = Envir.Time + duration * 1000, Visible = true, Values = values });
                        target.OperateTime = 0;
                        LevelMagic(magic);
                        cast = true;
                    }
                    break;
            }
        }
Пример #4
0
        private void Purification(MapObject target, UserMagic magic)
        {
            if (target == null || !target.IsFriendlyTarget(this)) return;

            DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, target);

            ActionList.Add(action);
        }
Пример #5
0
        private void Healing(MapObject target, UserMagic magic)
        {
            if (target == null || !target.IsFriendlyTarget(this)) return;

            int health = GetAttackPower(MinSC, MaxSC) * 2 + magic.GetPower() + Level;

            DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, health, target);

            ActionList.Add(action);
        }
Пример #6
0
        private void EnergyShields(MapObject target, UserMagic magic, out bool cast)
        {
            cast = false;

            if (target == null || !target.IsFriendlyTarget(this)) return;
            UserItem item = GetAmulet(1);
            if (item == null) return;

            int expireTime = GetAttackPower(MinSC, MaxSC) * 2 + (magic.Level + 1) * 10;
            //int value = MaxSC >= 5 ? Math.Min(8, MaxSC / 5) : 1;

            ActionList.Add(new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, expireTime));
        }
Пример #7
0
        public void ProcessSpell(MapObject ob)
        {
            if (Envir.Time < StartTime)
            {
                return;
            }
            List <MapObject> listtargets = new List <MapObject>();

            switch (Spell)
            {
            case Spell.FireWall:
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }

                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(Caster, Value, DefenceType.MAC, false);
                break;

            case Spell.Healing:     //SafeZone
                if (ob.Race != ObjectType.Player && (ob.Race != ObjectType.Monster || ob.Master == null || ob.Master.Race != ObjectType.Player))
                {
                    return;
                }
                if (ob.Dead || ob.HealAmount != 0 || ob.PercentHealth == 100)
                {
                    return;
                }

                ob.HealAmount += 25;
                Broadcast(new S.ObjectEffect {
                    ObjectID = ob.ObjectID, Effect = SpellEffect.Healing
                });
                break;

            case Spell.PoisonCloud:
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }

                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(Caster, Value, DefenceType.MAC, false);
                if (!ob.Dead)
                {
                    ob.ApplyPoison(new Poison
                    {
                        Duration  = 15,
                        Owner     = Caster,
                        PType     = PoisonType.Green,
                        TickSpeed = 2000,
                        Value     = Value / 20
                    }, Caster, false, false);
                }
                break;

            case Spell.HealingCircle:    //五行阵
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                //伤害敌军
                if (ob.IsAttackTarget(Caster))
                {
                    ob.Attacked(Caster, Value * 10 / 8, DefenceType.MAC, false);
                }
                else if (ob.IsFriendlyTarget(Caster))    //治疗友军
                {
                    //if (ob.HealAmount != 0 || ob.PercentHealth == 100) return;
                    if (ob.HealAmount > Value * 2 || ob.PercentHealth == 100)
                    {
                        return;
                    }
                    ob.HealAmount += (ushort)(Value * 2);
                    Broadcast(new S.ObjectEffect {
                        ObjectID = ob.ObjectID, Effect = SpellEffect.Healing
                    });
                }
                break;

            case Spell.MoonMist:    //月影雾
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                //伤害敌军
                if (ob.IsAttackTarget(Caster))
                {
                    ob.Attacked(Caster, Value * 10 / 8, DefenceType.MAC, false);
                }

                break;

            case Spell.Blizzard:
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster != null && Caster.ActiveBlizzard == false)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(Caster, Value, DefenceType.MAC, false);
                if (!ob.Dead && Envir.Random.Next(8) == 0)
                {
                    ob.ApplyPoison(new Poison
                    {
                        Duration  = 5 + Envir.Random.Next(Caster.Freezing),
                        Owner     = Caster,
                        PType     = PoisonType.Slow,
                        TickSpeed = 2000,
                    }, Caster);
                }
                break;

            case Spell.MeteorStrike:
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster != null && Caster.ActiveBlizzard == false)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(Caster, Value, DefenceType.MAC, false);
                break;

            case Spell.ExplosiveTrap:
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                if (DetonatedTrap)
                {
                    return;                   //make sure explosion happens only once
                }
                DetonateTrapNow();
                ob.Attacked(Caster, Value, DefenceType.MAC, false);
                break;

            case Spell.MapLava:
                if (ob is PlayerObject)
                {
                    PlayerObject pOb = (PlayerObject)ob;
                    if (pOb.Observer)
                    {
                        return;
                    }
                    //这里要有伤害啊
                    ob.Struck(Value, DefenceType.MAC);
                }
                break;

            case Spell.MapLightning:
            {
                if (ob is PlayerObject player)
                {
                    if (player.Account.AdminAccount && player.Observer)
                    {
                        return;
                    }
                    player.Struck(Value, DefenceType.MAC);
                }
            }
            break;

            case Spell.MapQuake1:
            case Spell.MapQuake2:
                if (Value == 0)
                {
                    return;
                }
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.MAC);
                break;

            case Spell.Portal:
                if (ob.Race != ObjectType.Player)
                {
                    return;
                }
                if (Caster != ob && (Caster == null || (Caster.GroupMembers == null) || (!Caster.GroupMembers.Contains((PlayerObject)ob))))
                {
                    return;
                }

                if (ExitMap == null)
                {
                    return;
                }

                MirDirection dir = ob.Direction;

                Point newExit = Functions.PointMove(ExitCoord, dir, 1);

                if (!ExitMap.ValidPoint(newExit))
                {
                    return;
                }

                ob.Teleport(ExitMap, newExit, false);

                Value = Value - 1;

                if (Value < 1)
                {
                    ExpireTime = Envir.Time;
                    return;
                }

                break;


            case Spell.MonKITO:
                if (Tick == 2)
                {
                    Param = true;
                    Broadcast(GetInfo());
                    ExpireTime  = Envir.Time;
                    listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2);
                    for (int o = 0; o < listtargets.Count; o++)
                    {
                        MapObject _ob = listtargets[o];
                        if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster)
                        {
                            continue;
                        }
                        if (!_ob.IsAttackTarget(MonCaster))
                        {
                            continue;
                        }
                        _ob.Attacked(MonCaster, Value, DefenceType.MAC);
                    }
                }
                break;

            case Spell.MonFireCircle:
                if (Tick >= 6)
                {
                    ExpireTime = Envir.Time;
                }
                if (Tick > 1)
                {
                    Param = true;
                    Broadcast(GetInfo());
                    Param       = false;
                    listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2);
                    for (int o = 0; o < listtargets.Count; o++)
                    {
                        MapObject _ob = listtargets[o];
                        if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster)
                        {
                            continue;
                        }
                        if (!_ob.IsAttackTarget(MonCaster))
                        {
                            continue;
                        }
                        _ob.Attacked(MonCaster, Value, DefenceType.MAC);
                    }
                }
                break;

            case Spell.MonPoisonFog:
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (!ob.IsAttackTarget(MonCaster))
                {
                    return;
                }
                ob.Attacked(MonCaster, Value, DefenceType.MAC);
                break;

            case Spell.MonRotateAxe:
                if (Tick > 1)
                {
                    listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2);
                    for (int o = 0; o < listtargets.Count; o++)
                    {
                        MapObject _ob = listtargets[o];
                        if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster)
                        {
                            continue;
                        }
                        if (!_ob.IsAttackTarget(MonCaster))
                        {
                            continue;
                        }
                        _ob.Attacked(MonCaster, Value, DefenceType.MAC);
                    }
                }
                break;

            case Spell.MonGhostFlag1:    //鬼旗,附近5格的友军,解毒,加血
                if (Tick > 1)
                {
                    listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 5);
                    for (int o = 0; o < listtargets.Count; o++)
                    {
                        MapObject _ob = listtargets[o];
                        if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster)
                        {
                            continue;
                        }
                        if (!_ob.IsFriendlyTarget(MonCaster))
                        {
                            continue;
                        }
                        _ob.PoisonList.Clear();
                        _ob.HealAmount = (ushort)Math.Min(ushort.MaxValue, _ob.HealAmount + Value);
                    }
                }
                break;

            case Spell.MonGhostHead:
                if (Tick >= RandomUtils.Next(2, 5))
                {
                    Param = true;
                    Broadcast(GetInfo());
                    ExpireTime  = Envir.Time;
                    listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2);
                    for (int o = 0; o < listtargets.Count; o++)
                    {
                        MapObject _ob = listtargets[o];
                        if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster)
                        {
                            continue;
                        }
                        if (!_ob.IsAttackTarget(MonCaster))
                        {
                            continue;
                        }
                        _ob.Attacked(MonCaster, Value, DefenceType.MAC);
                    }
                }
                break;
            }
        }