public float PriceRate(PlayerObject player, bool baseRate = false) { if (Conq == null || baseRate) return Info.Rate / 100F; if (player.MyGuild != null && player.MyGuild.Guildindex == Conq.Owner) return Info.Rate / 100F; else return (((Info.Rate / 100F) * Conq.npcRate) + Info.Rate) / 100F; }
public Reporting(PlayerObject player) { Player = player; string baseDir = Settings.ReportPath + player.Name; if (!Directory.Exists(baseDir)) Directory.CreateDirectory(baseDir); _baseDir = baseDir; }
public GuildObject(PlayerObject owner, string name) { Name = name; Rank Owner = new Rank() { Name = "Leader", Options = (RankOptions)255 , Index = 0}; GuildMember Leader = new GuildMember() { name = owner.Info.Name, Player = owner, Id = owner.Info.Index, LastLogin = Envir.Now, Online = true}; Owner.Members.Add(Leader); Ranks.Add(Owner); Membercount++; NeedSave = true; if (Level < Settings.Guild_ExperienceList.Count) MaxExperience = Settings.Guild_ExperienceList[Level]; if (Level < Settings.Guild_MembercapList.Count) MemberCap = Settings.Guild_MembercapList[Level]; }
public override void Process() { if (Decoration) return; if (Caster != null && Caster.Node == null) Caster = null; if (Envir.Time > ExpireTime || ((Spell == Spell.FireWall || Spell == Spell.ExplosiveTrap) && Caster == null) || (Spell == Spell.TrapHexagon && Target != null) || (Spell == Spell.Trap && Target != null)) { if (Spell == Spell.TrapHexagon && Target != null || Spell == Spell.Trap && Target != null) { MonsterObject ob = (MonsterObject)Target; if (Envir.Time < ExpireTime && ob.ShockTime != 0) return; } if (Spell == Spell.Reincarnation) { Caster.ReincarnationReady = true; Caster.ReincarnationExpireTime = Envir.Time + 6000; } CurrentMap.RemoveObject(this); Despawn(); return; } if (Spell == Spell.Reincarnation && !Caster.ActiveReincarnation) { CurrentMap.RemoveObject(this); Despawn(); return; } if (Spell == Spell.ExplosiveTrap && FindObject(Caster.ObjectID, 20) == null && Caster != null) { CurrentMap.RemoveObject(this); Despawn(); return; } if (Envir.Time < TickTime) return; TickTime = Envir.Time + TickSpeed; Cell cell = CurrentMap.GetCell(CurrentLocation); for (int i = 0; i < cell.Objects.Count; i++) ProcessSpell(cell.Objects[i]); if ((Spell == Spell.MapLava) || (Spell == Spell.MapLightning)) Value = 0; }
public void SendGuildStatus(PlayerObject member) { member.Enqueue(new ServerPackets.GuildStatus() { GuildName = Name, GuildRankName = member.MyGuildRank != null? member.MyGuildRank.Name: "", Experience = Experience, MaxExperience = MaxExperience, MemberCount = Membercount, MaxMembers = MemberCap, Gold = Gold, Level = Level, Voting = Voting, SparePoints = SparePoints, ItemCount = (byte)StoredItems.Length, BuffCount = (byte)0,//(byte)BuffList.Count, MyOptions = member.MyGuildRank != null? member.MyGuildRank.Options: (RankOptions)0, MyRankId = member.MyGuildRank != null? member.MyGuildRank.Index: 256 }); }
public void Chat(string Message) { if (Message.Length == 0) { return; } int TempI; string TempS; Packet TempP = null; switch (Message[0]) { case '/': // PM TempS = Message.Substring(1); TempI = TempS.IndexOf(' '); if (TempI != -1) { TempS = TempS.Substring(0, TempI); TempI += 2; } else { TempI = Message.Length; } PlayerObject P = Network.GetPlayer(TempS); if (P == null) { QueuePacket(new S.ObjectChat { Message = string.Format("User {0} not found.", TempS), Type = MirChatType.RedSystem }); return; } P.QueuePacket(new S.ObjectChat { Name = Name, Message = Message.Substring(TempI), Type = MirChatType.Whisper }); return; case '!': if (Message.Length == 1) { if (ShoutTime > Main.Time) { ReceiveMessage(string.Format("You cannot shout for another {0} seconds.", (ShoutTime - Main.Time) / 1000), MirChatType.RedSystem); return; } TempP = new S.ObjectChat { Name = Name, Message = Message.Substring(1), Type = MirChatType.Shout }; for (int I = 0; I < CurrentMap.Players.Count; I++) { if (CurrentMap.Players[I] == this) { continue; } CurrentMap.Players[I].QueuePacket(TempP); } ShoutTime = Main.Time + ShoutDelay; break; } switch (Message[1]) { case '!': // Group break; case '~': //Guild break; default: //Shout if (ShoutTime > Main.Time) { ReceiveMessage(string.Format("You cannot shout for another {0} seconds.", (ShoutTime - Main.Time) / 1000), MirChatType.RedSystem); return; } TempP = new S.ObjectChat { Name = Name, Message = Message.Substring(1), Type = MirChatType.Shout }; for (int I = 0; I < CurrentMap.Players.Count; I++) { if (CurrentMap.Players[I] == this) { continue; } CurrentMap.Players[I].QueuePacket(TempP); } ShoutTime = Main.Time + ShoutDelay; break; } break; case '@': //Command TempS = Message.Substring(1); TempI = TempS.IndexOf(' '); if (TempI != -1) { TempS = TempS.Substring(0, TempI); TempI += 2; } else { TempI = Message.Length; } ReceiveMessage(string.Format("Command {0} not found.", TempS), MirChatType.RedSystem); return; default: // Normal TempP = new S.ObjectChat { Name = Name, Message = Message, Type = MirChatType.Normal }; List <PlayerObject> TempList = NearByPlayers; for (int I = 0; I < TempList.Count; I++) { TempList[I].QueuePacket(TempP); } break; } if (TempP != null) { QueuePacket(TempP); } }
public override void Process() { if (Decoration) { return; } if (Caster != null && Caster.Node == null) { Caster = null; } if (Envir.Time > ExpireTime || ((Spell == Spell.FireWall || Spell == Spell.Portal || Spell == Spell.ExplosiveTrap || Spell == Spell.Reincarnation) && Caster == null) || (Spell == Spell.TrapHexagon && Target != null) || (Spell == Spell.Trap && Target != null)) { if (Spell == Spell.TrapHexagon && Target != null || Spell == Spell.Trap && Target != null) { MonsterObject ob = (MonsterObject)Target; if (Envir.Time < ExpireTime && ob.ShockTime != 0) { return; } } if (Spell == Spell.Reincarnation && Caster != null) { Caster.ReincarnationReady = true; Caster.ReincarnationExpireTime = Envir.Time + 6000; } CurrentMap.RemoveObject(this); Despawn(); return; } if (Spell == Spell.Reincarnation && !Caster.ActiveReincarnation) { CurrentMap.RemoveObject(this); Despawn(); return; } if (Spell == Spell.ExplosiveTrap && FindObject(Caster.ObjectID, 20) == null && Caster != null) { CurrentMap.RemoveObject(this); Despawn(); return; } if (Envir.Time < TickTime) { return; } TickTime = Envir.Time + TickSpeed; Cell cell = CurrentMap.GetCell(CurrentLocation); for (int i = 0; i < cell.Objects.Count; i++) { ProcessSpell(cell.Objects[i]); } if ((Spell == Spell.MapLava) || (Spell == Spell.MapLightning)) { Value = 0; } }
public bool NewRank(PlayerObject Self) { if (Ranks.Count >= byte.MaxValue) { Self.ReceiveChat("You cannot have anymore ranks.", ChatType.System); return false; } int NewIndex = Ranks.Count > 1? Ranks.Count -1: 1; Rank NewRank = new Rank(){Index = NewIndex, Name = String.Format("Rank-{0}",NewIndex), Options = (RankOptions)0}; Ranks.Insert(NewIndex, NewRank); Ranks[Ranks.Count - 1].Index = Ranks.Count - 1; List<Rank> NewRankList = new List<Rank>(); NewRankList.Add(NewRank); SendServerPacket(new ServerPackets.GuildMemberChange() { Name = Self.Name, Status = (byte)6, Ranks = NewRankList}); NeedSave = true; return true; }
public override bool IsFriendlyTarget(PlayerObject ally) { return true; }
public override void SendHealth(PlayerObject player) { throw new NotSupportedException(); }
public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true) { throw new NotSupportedException(); }
public void Broadcast(Packet p, Point location, PlayerObject Player) { if (p == null) return; if (Functions.InRange(location, Player.CurrentLocation, Globals.DataRange)) { Player.Enqueue(p); } }
public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true) { return(0); }
public override bool IsAttackTarget(PlayerObject attacker) { throw new NotSupportedException(); }
public override bool IsFriendlyTarget(PlayerObject ally) { return(true); }
public override bool IsAttackTarget(PlayerObject attacker) { return(false); }
public AssassinHero(CharacterInfo info, PlayerObject owner) : base(info, owner) { }
public abstract bool IsAttackTarget(PlayerObject attacker);
public override bool IsFriendlyTarget(PlayerObject ally) { throw new NotSupportedException(); }
public virtual void Remove(PlayerObject player) { player.Enqueue(new S.ObjectRemove {ObjectID = ObjectID}); }
public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true) { return 0; }
public virtual void Remove(PlayerObject player) { player.Enqueue(new S.ObjectRemove { ObjectID = ObjectID }); }
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; } }
public abstract int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true);
public void NewMember(PlayerObject newmember) { if (Ranks.Count < 2) Ranks.Add(new Rank() { Name = "Members", Index = 1}); Rank currentrank = Ranks[Ranks.Count - 1]; GuildMember Member = new GuildMember() { name = newmember.Info.Name, Player = newmember, Id = newmember.Info.Index, LastLogin = Envir.Now, Online = true }; currentrank.Members.Add(Member); PlayerLogged(newmember, true, true); Membercount++; NeedSave = true; }
public MountInfo(PlayerObject ob) { Player = ob; }
public void PlayerLogged(PlayerObject member, bool online, bool New = false) { for (int i = 0; i < Ranks.Count; i++) for (int j = 0; j < Ranks[i].Members.Count; j++) { if (Ranks[i].Members[j].Id == member.Info.Index) { if (online) { Ranks[i].Members[j].Player = member; Ranks[i].Members[j].Online = true; } else { Ranks[i].Members[j].LastLogin = Envir.Now; Ranks[i].Members[j].Player = null; Ranks[i].Members[j].Online = false; NeedSave = true; } } } SendServerPacket(new ServerPackets.GuildMemberChange() {Name = member.Name, Status = (byte)(New? 2: online? 1: 0)}); if (online && !New) SendGuildStatus(member); }
public abstract bool IsFriendlyTarget(PlayerObject ally);
public override void Process() { if (Decoration) { return; } if (LMS_Circle) { if (Envir.Time > ExpireTime) { CurrentMap.RemoveObject(this); Despawn(); } return; } if (Caster == null && MobCaster == null) { return; } if (Caster != null && Caster.Node == null) { Caster = null; } if (MobCaster != null && MobCaster.Node == null) { MobCaster = null; } if ( ( MobCaster == null && Caster == null && ( Spell == Spell.FireWall || Spell == Spell.HealingCircle || Spell == Spell.Portal || Spell == Spell.ExplosiveTrap || Spell == Spell.Reincarnation || Spell == Spell.MobFireWall || Spell == Spell.MobBlizzard || Spell == Spell.MobMeteorStrike || Spell == Spell.MobPoisonCloud || Spell == Spell.MeteorStrike || Spell == Spell.LavaKing || Spell == Spell.Blizzard || Spell == Spell.FrozenRains || Spell == Spell.MoonMist ) ) || (Envir.Time > ExpireTime) || (Spell == Spell.Trap && Target != null)) { if (Spell == Spell.TrapHexagon && Target != null || Spell == Spell.Trap && Target != null) { MonsterObject ob = (MonsterObject)Target; if (Envir.Time < ExpireTime && ob.ShockTime != 0) { return; } } if (MobCaster is HeroObject tmp) { if (tmp != null) { tmp.LavaKingCasting = false; } } if (Spell == Spell.Reincarnation && Caster != null) { Caster.ReincarnationReady = true; Caster.ReincarnationExpireTime = Envir.Time + 6000; } CurrentMap.RemoveObject(this); Despawn(); return; } if (Spell == Spell.Reincarnation && !Caster.ActiveReincarnation) { CurrentMap.RemoveObject(this); Despawn(); return; } if (Spell == Spell.ExplosiveTrap && FindObject(Caster.ObjectID, 20) == null && Caster != null) { CurrentMap.RemoveObject(this); Despawn(); return; } if (Spell == Spell.FireWall && FindObject(Caster.ObjectID, 12) == null && Caster != null) // Ice Firewall last time. { CurrentMap.RemoveObject(this); Despawn(); return; } if (Envir.Time < TickTime) { return; } TickTime = Envir.Time + TickSpeed; Cell cell = CurrentMap.GetCell(CurrentLocation); for (int i = 0; i < cell.Objects.Count; i++) { ProcessSpell(cell.Objects[i]); } if ((Spell == Spell.MapLava) || (Spell == Spell.MapLightning)) { Value = 0; } }
public virtual void Add(PlayerObject player) { if (Race == ObjectType.Player) { PlayerObject me = (PlayerObject)this; player.Enqueue(me.GetInfoEx(player)); } else player.Enqueue(GetInfo()); }
public virtual bool Harvest(PlayerObject player) { return(false); }
public virtual bool Harvest(PlayerObject player) { return false; }
public void BroadcastHealthChange() { if (Race != ObjectType.Player && Race != ObjectType.Monster) { return; } byte time = Math.Min(byte.MaxValue, (byte)Math.Max(5, (RevTime - Envir.Time) / 1000)); Packet p = new S.ObjectHealth { ObjectID = ObjectID, Percent = PercentHealth, Expire = time }; if (Envir.Time < RevTime) { CurrentMap.Broadcast(p, CurrentLocation); return; } if (Race == ObjectType.Monster && !AutoRev) { return; } if (Race == ObjectType.Player) { if (GroupMembers != null) //Send pet HP to group { for (int i = 0; i < GroupMembers.Count; i++) { PlayerObject member = GroupMembers[i]; if (this == member) { continue; } if (member.CurrentMap != CurrentMap || !Functions.InRange(member.CurrentLocation, CurrentLocation, Globals.DataRange)) { continue; } member.Enqueue(p); } } return; } if (Master != null && Master.Race == ObjectType.Player) { PlayerObject player = (PlayerObject)Master; player.Enqueue(p); if (player.GroupMembers != null) //Send pet HP to group { for (int i = 0; i < player.GroupMembers.Count; i++) { PlayerObject member = player.GroupMembers[i]; if (player == member) { continue; } if (member.CurrentMap != CurrentMap || !Functions.InRange(member.CurrentLocation, CurrentLocation, Globals.DataRange)) { continue; } member.Enqueue(p); } } } if (EXPOwner != null && EXPOwner.Race == ObjectType.Player) { PlayerObject player = (PlayerObject)EXPOwner; if (player.IsMember(Master)) { return; } player.Enqueue(p); if (player.GroupMembers != null) { for (int i = 0; i < player.GroupMembers.Count; i++) { PlayerObject member = player.GroupMembers[i]; if (player == member) { continue; } if (member.CurrentMap != CurrentMap || !Functions.InRange(member.CurrentLocation, CurrentLocation, Globals.DataRange)) { continue; } member.Enqueue(p); } } } }
public abstract void SendHealth(PlayerObject player);
public void TakeConquest(PlayerObject player = null, GuildObject winningGuild = null) { if (winningGuild == null && (player == null || player.MyGuild == null || player.MyGuild.Conquest != null)) { return; } if (winningGuild != null && winningGuild.Conquest != null) { return; } if (player != null && player.MyGuild != null && player.MyGuild.Conquest != null) { return; } GuildObject tmpPrevious = null; switch (GameType) { case ConquestGame.CapturePalace: if (player == null) { return; } if (StartType == ConquestType.Request) { if (player.MyGuild.Guildindex != AttackerID) { break; } } if (Guild != null) { tmpPrevious = Guild; Guild.Conquest = null; AttackerID = tmpPrevious.Guildindex; } Owner = player.MyGuild.Guildindex; Guild = player.MyGuild; player.MyGuild.Conquest = this; EndWar(GameType); break; case ConquestGame.KingOfHill: case ConquestGame.Classic: if (StartType == ConquestType.Request) { if (winningGuild.Guildindex != AttackerID) { break; } } if (Guild != null) { tmpPrevious = Guild; Guild.Conquest = null; AttackerID = tmpPrevious.Guildindex; } Owner = winningGuild.Guildindex; Guild = winningGuild; Guild.Conquest = this; break; case ConquestGame.ControlPoints: Owner = winningGuild.Guildindex; Guild = winningGuild; Guild.Conquest = this; List <ConquestFlagObject> keys = new List <ConquestFlagObject>(ControlPoints.Keys); foreach (ConquestFlagObject key in keys) { key.ChangeOwner(Guild); ControlPoints[key] = new Dictionary <GuildObject, int>(); } break; } for (int i = 0; i < FlagList.Count; i++) { FlagList[i].Guild = Guild; FlagList[i].UpdateImage(); FlagList[i].UpdateColour(); } UpdatePlayers(Guild); if (tmpPrevious != null) { UpdatePlayers(tmpPrevious); } NeedSave = true; }
public ConquestObject(PlayerObject owner, string name) { }
public bool ChangeRank(PlayerObject self, string memberName, byte rankIndex, string rankName = "Members") { if ((self.MyGuild != this) || (self.MyGuildRank == null)) { return(false); } if (rankIndex >= Ranks.Count) { return(false); } GuildMember Member = null; GuildRank MemberRank = null; for (int i = 0; i < Ranks.Count; i++) { for (int j = 0; j < Ranks[i].Members.Count; j++) { if (Ranks[i].Members[j].Name == memberName) { Member = Ranks[i].Members[j]; MemberRank = Ranks[i]; goto Found; } } } Found: if (Member == null) { return(false); } MirDatabase.CharacterInfo Character = Envir.GetCharacterInfo(memberName); if (Character == null) { return(false); } if ((rankIndex == 0) && (Character.Level < Settings.Guild_RequiredLevel)) { self.ReceiveChat(String.Format("A guild leader needs to be at least level {0}", Settings.Guild_RequiredLevel), ChatType.System); return(false); } if ((MemberRank.Index >= self.MyGuildRank.Index) && (self.MyGuildRank.Index != 0)) { return(false); } if (MemberRank.Index == 0) { if (MemberRank.Members.Count <= 2) { self.ReceiveChat("A guild needs at least 2 leaders.", ChatType.System); return(false); } for (int i = 0; i < MemberRank.Members.Count; i++) { if ((MemberRank.Members[i].Player != null) && (MemberRank.Members[i] != Member)) { goto AllOk; } } self.ReceiveChat("You need at least 1 leader online.", ChatType.System); return(false); } AllOk: Ranks[rankIndex].Members.Add(Member); MemberRank.Members.Remove(Member); MemberRank = Ranks[rankIndex]; List <GuildRank> NewRankList = new List <GuildRank> { Ranks[rankIndex] }; NeedSave = true; PlayerObject player = (PlayerObject)Member.Player; if (player != null) { player.MyGuildRank = Ranks[rankIndex]; player.Enqueue(new ServerPackets.GuildMemberChange() { Name = self.Info.Name, Status = (byte)8, Ranks = NewRankList }); player.BroadcastInfo(); } for (int i = 0; i < Ranks.Count; i++) { for (int j = 0; j < Ranks[i].Members.Count; j++) { if ((Ranks[i].Members[j].Player != null) && (Ranks[i].Members[j].Player != Member.Player)) { player = (PlayerObject)Ranks[i].Members[j].Player; player.Enqueue(new ServerPackets.GuildMemberChange() { Name = Member.Name, Status = (byte)5, RankIndex = (byte)MemberRank.Index }); player.GuildMembersChanged = true; } } } return(true); }
public override bool IsAttackTarget(PlayerObject attacker) { return false; }
public bool DeleteMember(PlayerObject Kicker, string membername) { //careful this can lead to guild with no ranks or members(or no leader) GuildMember Member = null; GuildRank MemberRank = null; if ((Kicker.MyGuild != this) || (Kicker.MyGuildRank == null)) { return(false); } for (int i = 0; i < Ranks.Count; i++) { for (int j = 0; j < Ranks[i].Members.Count; j++) { if (Ranks[i].Members[j].Name == membername) { Member = Ranks[i].Members[j]; MemberRank = Ranks[i]; goto Found; } } } Found: if (Member == null) { return(false); } if (((Kicker.MyGuildRank.Index >= MemberRank.Index) && (Kicker.MyGuildRank.Index != 0)) && (Kicker.Info.Name != membername)) { Kicker.ReceiveChat("Your rank is not adequate.", ChatType.System); return(false); } if (MemberRank.Index == 0) { if (MemberRank.Members.Count < 2) { Kicker.ReceiveChat("You cannot leave the guild when you're leader.", ChatType.System); return(false); } for (int i = 0; i < MemberRank.Members.Count; i++) { if ((MemberRank.Members[i].Online) && (MemberRank.Members[i] != Member)) { goto AllOk; } } Kicker.ReceiveChat("You need at least 1 leader online.", ChatType.System); return(false); } AllOk: MemberDeleted(membername, (PlayerObject)Member.Player, Member.Name == Kicker.Info.Name); if (Member.Player != null) { PlayerObject LeavingMember = (PlayerObject)Member.Player; LeavingMember.RefreshStats(); } MemberRank.Members.Remove(Member); NeedSave = true; Info.Membercount--; return(true); }
public override bool IsFriendlyTarget(PlayerObject ally) { if (Master == null) return false; if (Master == ally) return true; switch (ally.AMode) { case AttackMode.Group: return Master.GroupMembers != null && Master.GroupMembers.Contains(ally); case AttackMode.Guild: return false; case AttackMode.EnemyGuild: return true; case AttackMode.RedBrown: return Master.PKPoints < 200 & Envir.Time > Master.BrownTime; } return true; }
public override void Add(PlayerObject player) { player.Enqueue(GetInfo()); SendHealth(player); }
public override bool IsAttackTarget(PlayerObject attacker) { if (attacker == null || attacker.Node == null) return false; if (Dead) return false; if (Master == null) return true; if (attacker.AMode == AttackMode.Peace) return false; if (Master == attacker) return attacker.AMode == AttackMode.All; if (Master.Race == ObjectType.Player && (attacker.InSafeZone || InSafeZone)) return false; switch (attacker.AMode) { case AttackMode.Group: return Master.GroupMembers == null || !Master.GroupMembers.Contains(attacker); case AttackMode.Guild: { if (!(Master is PlayerObject)) return false; PlayerObject master = (PlayerObject)Master; return master.MyGuild == null || master.MyGuild != attacker.MyGuild; } case AttackMode.EnemyGuild: { if (!(Master is PlayerObject)) return false; PlayerObject master = (PlayerObject)Master; return (master.MyGuild != null && attacker.MyGuild != null) && master.MyGuild.IsEnemy(attacker.MyGuild); } case AttackMode.RedBrown: return Master.PKPoints >= 200 || Envir.Time < Master.BrownTime; default: return true; } }
public void CheckVisible(PlayerObject Player, bool Force = false) { VisibleLog.TryGetValue(Player.Info.Index, out bool canSee); if (Conq != null && Conq.WarIsOn) { if (canSee) { CurrentMap.Broadcast(new S.ObjectRemove { ObjectID = ObjectID }, CurrentLocation, Player); } VisibleLog[Player.Info.Index] = false; return; } if (Info.FlagNeeded != 0 && !Player.Info.Flags[Info.FlagNeeded]) { if (canSee) { CurrentMap.Broadcast(new S.ObjectRemove { ObjectID = ObjectID }, CurrentLocation, Player); } VisibleLog[Player.Info.Index] = false; return; } if (Info.MinLev != 0 && Player.Level < Info.MinLev || Info.MaxLev != 0 && Player.Level > Info.MaxLev) { if (canSee) { CurrentMap.Broadcast(new S.ObjectRemove { ObjectID = ObjectID }, CurrentLocation, Player); } VisibleLog[Player.Info.Index] = false; return; } if (Info.ClassRequired != "" && Player.Class.ToString() != Info.ClassRequired) { if (canSee) { CurrentMap.Broadcast(new S.ObjectRemove { ObjectID = ObjectID }, CurrentLocation, Player); } VisibleLog[Player.Info.Index] = false; return; } if (Visible && !canSee) { CurrentMap.Broadcast(GetInfo(), CurrentLocation, Player); } else if (Force && Visible) { CurrentMap.Broadcast(GetInfo(), CurrentLocation, Player); } VisibleLog[Player.Info.Index] = true; }
public override void SendHealth(PlayerObject player) { if (!player.IsMember(Master) && !(player.IsMember(EXPOwner) && AutoRev) && Envir.Time > RevTime) return; byte time = Math.Min(byte.MaxValue, (byte) Math.Max(5, (RevTime - Envir.Time)/1000)); player.Enqueue(new S.ObjectHealth { ObjectID = ObjectID, Percent = PercentHealth, Expire = time }); }
public void MemberDeleted(string name, PlayerObject formermember, bool kickself) { PlayerObject player = null; for (int i = 0; i < Ranks.Count; i++) for (int j = 0; j < Ranks[i].Members.Count; j++) { if ((Ranks[i].Members[j].Player != null) && (Ranks[i].Members[j].Player != formermember)) { player = (PlayerObject)Ranks[i].Members[j].Player; player.Enqueue(new ServerPackets.GuildMemberChange() { Name = name, Status = (byte)(kickself ? 4:3) }); player.GuildMembersChanged = true; } } if (formermember != null) { formermember.Info.GuildIndex = -1; formermember.MyGuild = null; formermember.MyGuildRank = null; formermember.ReceiveChat(kickself ? "You have left your guild." : "You have been removed from your guild.", ChatType.Guild); formermember.Enqueue(new ServerPackets.GuildStatus() { GuildName = "", GuildRankName = "", MyOptions = (RankOptions)0 }); formermember.BroadcastInfo(); } }
public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true) { if (Target == null && attacker.IsAttackTarget(this)) { Target = attacker; } int armour = 0; switch (type) { case DefenceType.ACAgility: if (Envir.Random.Next(Agility + 1) > attacker.Accuracy) { BroadcastDamageIndicator(DamageType.Miss); return 0; } armour = GetAttackPower(MinAC, MaxAC); break; case DefenceType.AC: armour = GetAttackPower(MinAC, MaxAC); break; case DefenceType.MACAgility: if (Envir.Random.Next(Agility + 1) > attacker.Accuracy) { BroadcastDamageIndicator(DamageType.Miss); return 0; } armour = GetAttackPower(MinMAC, MaxMAC); break; case DefenceType.MAC: armour = GetAttackPower(MinAC, MaxAC); break; case DefenceType.Agility: if (Envir.Random.Next(Agility + 1) > attacker.Accuracy) { BroadcastDamageIndicator(DamageType.Miss); return 0; } break; } armour = (int)Math.Max(int.MinValue, (Math.Min(int.MaxValue, (decimal)(armour * ArmourRate)))); damage = (int)Math.Max(int.MinValue, (Math.Min(int.MaxValue, (decimal)(damage * DamageRate)))); if (damageWeapon) attacker.DamageWeapon(); damage += attacker.AttackBonus; if ((attacker.CriticalRate * Settings.CriticalRateWeight) > Envir.Random.Next(100)) { Broadcast(new S.ObjectEffect { ObjectID = ObjectID, Effect = SpellEffect.Critical}); damage = Math.Min(int.MaxValue, damage + (int)Math.Floor(damage * (((double)attacker.CriticalDamage / (double)Settings.CriticalDamageWeight) * 10))); } if (armour >= damage) { BroadcastDamageIndicator(DamageType.Miss); return 0; } if (attacker.LifeOnHit > 0) attacker.ChangeHP(attacker.LifeOnHit); if (Target != this && attacker.IsAttackTarget(this)) { if (attacker.Info.MentalState == 2) { if (Functions.MaxDistance(CurrentLocation, attacker.CurrentLocation) < (8 - attacker.Info.MentalStateLvl)) Target = attacker; } else Target = attacker; } if (BindingShotCenter) ReleaseBindingShot(); ShockTime = 0; if (Master != null && Master != attacker) if (Envir.Time > Master.BrownTime && Master.PKPoints < 200) attacker.BrownTime = Envir.Time + Settings.Minute; if (EXPOwner == null || EXPOwner.Dead) EXPOwner = attacker; if (EXPOwner == attacker) EXPOwnerTime = Envir.Time + EXPOwnerDelay; ushort LevelOffset = (ushort)(Level > attacker.Level ? 0 : Math.Min(10, attacker.Level - Level)); if (attacker.HasParalysisRing && type != DefenceType.MAC && type != DefenceType.MACAgility && 1 == Envir.Random.Next(1, 15)) { ApplyPoison(new Poison { PType = PoisonType.Paralysis, Duration = 5, TickSpeed = 1000 }, attacker); } if (attacker.Freezing > 0 && type != DefenceType.MAC && type != DefenceType.MACAgility) { if ((Envir.Random.Next(Settings.FreezingAttackWeight) < attacker.Freezing) && (Envir.Random.Next(LevelOffset) == 0)) ApplyPoison(new Poison { PType = PoisonType.Slow, Duration = Math.Min(10, (3 + Envir.Random.Next(attacker.Freezing))), TickSpeed = 1000 }, attacker); } if (attacker.PoisonAttack > 0 && type != DefenceType.MAC && type != DefenceType.MACAgility) { if ((Envir.Random.Next(Settings.PoisonAttackWeight) < attacker.PoisonAttack) && (Envir.Random.Next(LevelOffset) == 0)) ApplyPoison(new Poison { PType = PoisonType.Green, Duration = 5, TickSpeed = 1000, Value = Math.Min(10, 3 + Envir.Random.Next(attacker.PoisonAttack)) }, attacker); } Broadcast(new S.ObjectStruck { ObjectID = ObjectID, AttackerID = attacker.ObjectID, Direction = Direction, Location = CurrentLocation }); if (attacker.HpDrainRate > 0) { attacker.HpDrain += Math.Max(0, ((float)(damage - armour) / 100) * attacker.HpDrainRate); if (attacker.HpDrain > 2) { int HpGain = (int)Math.Floor(attacker.HpDrain); attacker.ChangeHP(HpGain); attacker.HpDrain -= HpGain; } } attacker.GatherElement(); if (attacker.Info.Mentor != 0 && attacker.Info.isMentor) { Buff buff = attacker.Buffs.Where(e => e.Type == BuffType.Mentor).FirstOrDefault(); if (buff != null) { CharacterInfo Mentee = Envir.GetCharacterInfo(attacker.Info.Mentor); PlayerObject player = Envir.GetPlayer(Mentee.Name); if (player.CurrentMap == attacker.CurrentMap && Functions.InRange(player.CurrentLocation, attacker.CurrentLocation, Globals.DataRange) && !player.Dead) { damage += ((damage / 100) * Settings.MentorDamageBoost); } } } BroadcastDamageIndicator(DamageType.Hit, armour - damage); ChangeHP(armour - damage); return armour - damage; }
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.ElectricBomb: 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.Stun, TickSpeed = 2000, }, Caster); } break; case Spell.FreezingStorm: 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 = 440, }, Caster); } break; case Spell.DragonStrike: 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.Red, TickSpeed = 440, }, 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; } }