public virtual bool Attack(MapObject Ob) { if (Ob == null || Ob == this || Envir.Rand.Next(Ob.Agility + 1) > Accuracy) { return(false); } int Armour = Envir.Rand.Next(Ob.MinAC, Ob.MaxAC + 1); int Damage = Envir.Rand.Next(MinDC, MaxDC + 1); // Get Luck if (Damage - Armour <= 0) { return(false); } Ob.HP -= Damage - Armour; Ob.Struck(this); return(true); }
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; } }
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: //ArcherSpells - Explosive Trap 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; } }
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; } }
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.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.Account.AdminAccount && pOb.Observer) { return; } } break; case Spell.MapLightning: if (ob is PlayerObject) { PlayerObject pOb = (PlayerObject)ob; if (pOb.Account.AdminAccount && pOb.Observer) { return; } } 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; } }
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; } }
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; } }
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; } }