public void ProcessSpell(MapObject ob)
        {
            if (Envir.Time < StartTime) return;
            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.None, 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.Blizzard:
                    if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) return;
                    if (ob.Dead) return;
                    if (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.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:
                case Spell.MapLightning:
                    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);

                    break;
            }
        }
Beispiel #2
0
        public void ProcessSpell(MapObject ob)
        {
            if (Envir.Time < StartTime)
            {
                return;
            }
            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.None, false);
                if (!ob.Dead)
                {
                    ob.ApplyPoison(new Poison
                    {
                        Duration  = 15,
                        Owner     = Caster,
                        PType     = PoisonType.Green,
                        TickSpeed = 2000,
                        Value     = Value / 20
                    }, Caster);
                }
                break;

            case Spell.Blizzard:
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster.ActiveBlizzard == false)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(Caster, Value, DefenceType.MACAgility, 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.ActiveBlizzard == false)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(Caster, Value, DefenceType.MACAgility, 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:
            case Spell.MapLightning:
                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);

                break;
            }
        }
Beispiel #3
0
        public void ProcessSpell(MapObject ob)
        {
            if (Envir.Time < StartTime)
            {
                return;
            }
            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.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.Stats[Stat.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;
                }
                DetonateTrapNow();
                ob.Attacked(Caster, Value, DefenceType.MAC, false);
            }
            break;

            case Spell.MapLava:
            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;
                }

                var portal = Envir.Objects.SingleOrDefault(ob => ob.Race == ObjectType.Spell &&
                                                           ob != this && ob.Node != null &&
                                                           ((SpellObject)ob).Spell == Spell.Portal &&
                                                           ((SpellObject)ob).Caster == Caster);

                if (portal != null)
                {
                    Point newExit = Functions.PointMove(portal.CurrentLocation, ob.Direction, 1);

                    if (!portal.CurrentMap.ValidPoint(newExit))
                    {
                        return;
                    }

                    ob.Teleport(portal.CurrentMap, newExit, false);
                }

                Value -= 1;

                if (Value < 1)
                {
                    ExpireTime = 0;
                }
            }
            break;
            }
        }
Beispiel #4
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;
            }
        }
Beispiel #5
0
        public void ProcessSpell(MapObject ob)
        {
            if (Envir.Time < StartTime)
            {
                return;
            }
            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(((PlayerObject)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(((PlayerObject)Caster), Value, DefenceType.MAC, false);
                if (!ob.Dead)
                {
                    ob.ApplyPoison(new Poison
                        {
                            Duration  = 12,
                            Owner     = Caster,
                            PType     = PoisonType.Green,
                            TickSpeed = TickSpeed,
                            Value     = (Caster.Stats[Stat.MinSC] + Caster.Stats[Stat.MaxSC]) / 2 + BonusDmg
                        }, Caster, false, false);
                }
            }
            break;

            case Spell.Blizzard:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster != null && ((PlayerObject)Caster).ActiveBlizzard == false)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(((PlayerObject)Caster), Value, DefenceType.MAC, false);
                if (!ob.Dead && Envir.Random.Next(8) == 0)
                {
                    ob.ApplyPoison(new Poison
                        {
                            Duration  = 5 + Envir.Random.Next(Caster.Stats[Stat.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 && ((PlayerObject)Caster).ActiveBlizzard == false)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                ob.Attacked(((PlayerObject)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;
                }
                DetonateTrapNow();
                ob.Attacked(((PlayerObject)Caster), Value, DefenceType.MAC, false);
            }
            break;

            case Spell.MapLava:
            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.GeneralMeowMeowThunder:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (ob == Caster)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.MAC);
            }
            break;

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

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.MAC);
            }
            break;

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

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.MAC);
            }
            break;

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

                ob.Struck(Value, DefenceType.MAC);

                if (Envir.Random.Next(3) > 0)
                {
                    ob.ApplyPoison(new Poison {
                            PType = PoisonType.Paralysis, Duration = 5, TickSpeed = 1000
                        }, this);
                }
            }
            break;

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

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.AC);
            }
            break;

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

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.AC);
            }
            break;

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

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.AC);
            }
            break;

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

                var portal = Envir.Spells.SingleOrDefault(ob => ob != this && ob.Node != null &&
                                                          ob.Spell == Spell.Portal &&
                                                          ob.Caster == Caster);

                if (portal != null)
                {
                    Point newExit = Functions.PointMove(portal.CurrentLocation, ob.Direction, 1);

                    if (!portal.CurrentMap.ValidPoint(newExit))
                    {
                        return;
                    }

                    ob.Teleport(portal.CurrentMap, newExit, false);
                }

                Value -= 1;

                if (Value < 1)
                {
                    ExpireTime = 0;
                }
            }
            break;

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

                ob.Struck(Value, DefenceType.MAC);

                if (Envir.Random.Next(8) == 0)
                {
                    ob.ApplyPoison(new Poison {
                            PType = PoisonType.Slow, Duration = 5, TickSpeed = 1000
                        }, this);
                }
            }
            break;

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

                ob.Struck(Value, DefenceType.AC);
                ob.ApplyPoison(new Poison {
                        PType = PoisonType.Dazed, Duration = 5, TickSpeed = 1000
                    }, this);
            }
            break;

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

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.AC);
            }
            break;

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

                if (Value == 0)
                {
                    return;
                }
                ob.Struck(Value, DefenceType.AC);
            }
            break;
            }
        }
Beispiel #6
0
        public void ProcessSpell(MapObject ob)
        {
            if (Envir.Time < StartTime)
            {
                return;
            }
            switch (Spell)
            {
            case Spell.MoonMist:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster != null && !Caster.ActiveBlizzard)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }

                if (ob.Race == ObjectType.Player)
                {
                    ob.Attacked(Caster, PvPValue, DefenceType.ACAgility, false);
                }
                else
                {
                    ob.Attacked(Caster, Value, DefenceType.ACAgility, false);
                }
            }
            break;

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

                if (ob.Race == ObjectType.Player)
                {
                    ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                }
                else
                {
                    ob.Attacked(Caster, Value, DefenceType.MAC, false);
                }
            }
            break;

            case Spell.HealingCircle:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster != null && ob.ObjectID == Caster.ObjectID)
                {
                    return;
                }
                if (ob.Race == ObjectType.Player)
                {
                    if (Caster.AMode == AttackMode.All)
                    {
                        if (ob.IsAttackTarget(Caster))
                        {
                            ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                            return;
                        }
                    }
                    else if (Caster.AMode == AttackMode.Group)
                    {
                        if (Caster.GroupMembers != null &&
                            Caster.GroupMembers.Contains(ob))
                        {
                            if (ob.Health < ob.MaxHealth)
                            {
                                ob.HealAmount  = (ushort)Math.Min(ushort.MaxValue, ob.HealAmount + Value);
                                ob.OperateTime = 0;
                                return;
                            }
                        }
                        else
                        {
                            if (ob.IsAttackTarget(Caster))
                            {
                                ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                                return;
                            }
                        }
                    }
                    else if (Caster.AMode == AttackMode.Guild)
                    {
                        if (Caster.MyGuild != null)
                        {
                            if (ob.Race == ObjectType.Player)
                            {
                                PlayerObject tmp = (PlayerObject)ob;
                                if (tmp.MyGuild != null &&
                                    tmp.MyGuild == Caster.MyGuild)
                                {
                                    if (ob.Health < ob.MaxHealth)
                                    {
                                        ob.HealAmount  = (ushort)Math.Min(ushort.MaxValue, ob.HealAmount + Value);
                                        ob.OperateTime = 0;
                                        return;
                                    }
                                }
                                else
                                {
                                    if (ob.IsAttackTarget(Caster))
                                    {
                                        ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                                        return;
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (ob.IsAttackTarget(Caster))
                            {
                                ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                                return;
                            }
                        }
                    }
                    else if (Caster.AMode == AttackMode.RedBrown)
                    {
                        if (ob.IsAttackTarget(Caster))
                        {
                            if (ob.Race == ObjectType.Player)
                            {
                                PlayerObject tmp = (PlayerObject)ob;        //PKPoints < 200 & Envir.Time > BrownTime
                                if (tmp.PKPoints > 200 && Envir.Time > ob.BrownTime)
                                {
                                    ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                                    return;
                                }
                            }
                        }
                    }
                    else if (ob.Race == ObjectType.Player)
                    {
                        if (ob.Health < ob.MaxHealth)
                        {
                            ob.HealAmount  = (ushort)Math.Min(ushort.MaxValue, ob.HealAmount + Value);
                            ob.OperateTime = 0;
                            return;
                        }
                    }
                }
                else
                {
                    if (ob.IsAttackTarget(Caster))
                    {
                        ob.Attacked(Caster, Value, DefenceType.MAC, false);
                    }
                    return;
                }
            }
            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.MobFireWall:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }

                if (!ob.IsAttackTarget(MobCaster))
                {
                    return;
                }

                ob.Attacked(MobCaster, Value, DefenceType.MAC);
            }
            break;

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

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

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

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

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

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

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

            case Spell.Blizzard:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster != null && !Caster.ActiveBlizzard)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                //  This is the map event, every time the Process is trigger it'll run this code until it's expired
                if (ob.Race == ObjectType.Player)
                {
                    ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                }
                else
                {
                    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.FrozenRains:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }

                if (Caster != null && !Caster.ActiveBlizzard)
                {
                    return;
                }
                if (!ob.IsAttackTarget(Caster))
                {
                    return;
                }
                if (ob.Race == ObjectType.Player)
                {
                    ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                }
                else
                {
                    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.LavaKing:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (Caster != null && !Caster.ActiveBlizzard)
                {
                    return;
                }
                if (Caster != null)
                {
                    if (!ob.IsAttackTarget(Caster))
                    {
                        return;
                    }
                    byte magicLevel = 0;
                    int  poisonVal  = 2;

                    if (ob.Race == ObjectType.Player)
                    {
                        poisonVal =
                            magicLevel == 0 ? 2 :
                            magicLevel == 1 ? 3 :
                            magicLevel == 2 ? 4 : 6;
                    }
                    else
                    {
                        poisonVal =
                            magicLevel == 0 ? 2 :
                            magicLevel == 1 ? 4 :
                            magicLevel == 2 ? 6 : 8;
                    }
                    if (ob.Race == ObjectType.Player)
                    {
                        ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                    }
                    else
                    {
                        ob.Attacked(Caster, Value, DefenceType.MAC, false);
                    }
                    if (!ob.Dead && Envir.Random.Next(8) == 0)
                    {
                        ob.ApplyPoison(new Poison
                            {
                                Duration  = Envir.Random.Next(2, 8),
                                Owner     = Caster,
                                PType     = PoisonType.Burning,
                                TickSpeed = 2000,
                                Value     = poisonVal
                            }, Caster);
                    }
                }
                else if (MobCaster != null)
                {
                    if (!ob.IsAttackTarget(MobCaster))
                    {
                        return;
                    }
                    ob.Attacked(MobCaster, ob.Race == ObjectType.Player ? (int)(Value * 0.75f) : Value, DefenceType.MAC);
                    if (!ob.Dead && Envir.Random.Next(8) == 0)
                    {
                        ob.ApplyPoison(new Poison
                            {
                                Duration  = Envir.Random.Next(2, 8),
                                Owner     = MobCaster,
                                PType     = PoisonType.Burning,
                                TickSpeed = 2000,
                                Value     = ob.Race == ObjectType.Player ? 2 : 4
                            }, Caster);
                    }
                }
                else
                {
                    return;
                }
            }
            break;

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

            case Spell.SoulReaper:
            {
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    return;
                }
                if (ob.Dead)
                {
                    return;
                }
                if (MobCaster == null)
                {
                    if (Caster == null)
                    {
                        return;
                    }
                    if (ob.IsAttackTarget(Caster))
                    {
                        if (ob.Race == ObjectType.Player)
                        {
                            if (ob.Attacked(Caster, PvPValue, DefenceType.MAC) > 0 &&
                                !ob.Dead && Envir.Random.Next(8) == 0)
                            {
                                ob.ApplyPoison(new Poison
                                    {
                                        Duration  = 3,
                                        Owner     = Caster,
                                        PType     = PoisonType.Frozen,
                                        TickSpeed = 2000
                                    }, Caster);
                            }
                        }
                        else
                        if (ob.Attacked(Caster, Value, DefenceType.MAC) > 0 &&
                            !ob.Dead && Envir.Random.Next(8) == 0)
                        {
                            ob.ApplyPoison(new Poison
                                {
                                    Duration  = 3,
                                    Owner     = Caster,
                                    PType     = PoisonType.Frozen,
                                    TickSpeed = 2000
                                }, Caster);
                        }
                    }
                }
                else
                {
                    if (MobCaster.Master == null)
                    {
                        return;
                    }
                    if (!ob.IsAttackTarget(((PlayerObject)MobCaster.Master)))
                    {
                        return;
                    }
                    ob.Attacked(MobCaster, Value, DefenceType.MAC);
                    if (!ob.Dead && Envir.Random.Next(8) == 0)
                    {
                        ob.ApplyPoison(new Poison
                            {
                                Duration  = 3,
                                Owner     = MobCaster,
                                PType     = PoisonType.Frozen,
                                TickSpeed = 2000,
                            }, MobCaster);
                    }
                }
            }
            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();
                if (ob.Race == ObjectType.Player)
                {
                    ob.Attacked(Caster, PvPValue, DefenceType.MAC, false);
                }
                else
                {
                    ob.Attacked(Caster, Value, DefenceType.MAC, false);
                }
            }
            break;

            case Spell.MapLava:
            case Spell.MapLightning:
            case Spell.MapQuake1:
            case Spell.MapQuake2:
            {
                if (Value == 0)
                {
                    return;
                }
                if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster && ob.Race != ObjectType.Hero)
                {
                    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;
            }
        }