Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        public Reporting(PlayerObject player)
        {
            Player = player;

            string baseDir = Settings.ReportPath + player.Name;

            if (!Directory.Exists(baseDir))
                Directory.CreateDirectory(baseDir);

            _baseDir = baseDir;
        }
Exemplo n.º 3
0
 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];
 }
Exemplo n.º 4
0
        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;
        }
Exemplo n.º 5
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
         });
 }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        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;
            }
        }
Exemplo n.º 8
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;
 }
Exemplo n.º 9
0
 public override bool IsFriendlyTarget(PlayerObject ally)
 {
     return true;
 }
Exemplo n.º 10
0
 public override void SendHealth(PlayerObject player)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 11
0
 public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 12
0
        public void Broadcast(Packet p, Point location, PlayerObject Player)
        {
            if (p == null) return;

            if (Functions.InRange(location, Player.CurrentLocation, Globals.DataRange))
            {
                Player.Enqueue(p);
            }
        }
Exemplo n.º 13
0
 public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true)
 {
     return(0);
 }
Exemplo n.º 14
0
 public override bool IsAttackTarget(PlayerObject attacker)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 15
0
 public override bool IsFriendlyTarget(PlayerObject ally)
 {
     return(true);
 }
Exemplo n.º 16
0
 public override bool IsAttackTarget(PlayerObject attacker)
 {
     return(false);
 }
Exemplo n.º 17
0
 public AssassinHero(CharacterInfo info, PlayerObject owner) : base(info, owner)
 {
 }
Exemplo n.º 18
0
 public abstract bool IsAttackTarget(PlayerObject attacker);
Exemplo n.º 19
0
 public override bool IsFriendlyTarget(PlayerObject ally)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 20
0
 public virtual void Remove(PlayerObject player)
 {
     player.Enqueue(new S.ObjectRemove {ObjectID = ObjectID});
 }
Exemplo n.º 21
0
 public override void SendHealth(PlayerObject player)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 22
0
 public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true)
 {
     return 0;
 }
Exemplo n.º 23
0
 public virtual void Remove(PlayerObject player)
 {
     player.Enqueue(new S.ObjectRemove {
         ObjectID = ObjectID
     });
 }
Exemplo n.º 24
0
 public override bool IsAttackTarget(PlayerObject attacker)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 25
0
 public abstract bool IsAttackTarget(PlayerObject attacker);
Exemplo n.º 26
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;
            }
        }
Exemplo n.º 27
0
 public abstract int Attacked(PlayerObject attacker, int damage, DefenceType type  = DefenceType.ACAgility, bool damageWeapon = true);
Exemplo n.º 28
0
        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;
        }
Exemplo n.º 29
0
 public MountInfo(PlayerObject ob)
 {
     Player = ob;
 }
Exemplo n.º 30
0
 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);
 }
Exemplo n.º 31
0
 public abstract int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true);
Exemplo n.º 32
0
 public abstract bool IsFriendlyTarget(PlayerObject ally);
Exemplo n.º 33
0
        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;
            }
        }
Exemplo n.º 34
0
 public virtual void Add(PlayerObject player)
 {
     if (Race == ObjectType.Player)
     {
         PlayerObject me = (PlayerObject)this;
         player.Enqueue(me.GetInfoEx(player));
     }
     else
         player.Enqueue(GetInfo());
 }
Exemplo n.º 35
0
 public virtual bool Harvest(PlayerObject player)
 {
     return(false);
 }
Exemplo n.º 36
0
 public virtual bool Harvest(PlayerObject player)
 {
     return false;
 }
Exemplo n.º 37
0
        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);
                    }
                }
            }
        }
Exemplo n.º 38
0
 public abstract bool IsFriendlyTarget(PlayerObject ally);
Exemplo n.º 39
0
 public abstract void SendHealth(PlayerObject player);
Exemplo n.º 40
0
 public abstract void SendHealth(PlayerObject player);
Exemplo n.º 41
0
        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;
        }
Exemplo n.º 42
0
 public ConquestObject(PlayerObject owner, string name)
 {
 }
Exemplo n.º 43
0
        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);
        }
Exemplo n.º 44
0
 public override bool IsAttackTarget(PlayerObject attacker)
 {
     return false;
 }
Exemplo n.º 45
0
        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);
        }
Exemplo n.º 46
0
 public override int Attacked(PlayerObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 47
0
        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;
        }
Exemplo n.º 48
0
 public override bool IsFriendlyTarget(PlayerObject ally)
 {
     throw new NotSupportedException();
 }
Exemplo n.º 49
0
 public override void Add(PlayerObject player)
 {
     player.Enqueue(GetInfo());
     SendHealth(player);
 }
Exemplo n.º 50
0
        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;
            }
        }
Exemplo n.º 51
0
        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;
        }
Exemplo n.º 52
0
 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 });
 }
Exemplo n.º 53
0
 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();
     }
 }
Exemplo n.º 54
0
        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;
        }
Exemplo n.º 55
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.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;
            }
        }