Beispiel #1
0
        public PlayerObject(CharacterInfo info, MirConnection connection)
        {
            if (info.Player != null)
                throw new InvalidOperationException("Player.Info not Null.");

            info.Player = this;
            Connection = connection;
            Info = info;
            Account = Connection.Account;

            if (Level == 255 || Account.AdminAccount)
            {
                IsGM = true;
                SMain.Enqueue(string.Format("{0} is now a GM", Name));
            }

            if (Level == 0) NewCharacter();

            RefreshStats();

            if (HP == 0)
            {
                SetHP(MaxHP);
                SetMP(MaxMP);
                CurrentLocation = BindLocation;
                CurrentMapIndex = BindMapIndex;
            }
        }
Beispiel #2
0
        public PlayerInfoForm(uint playerId)
        {
            InitializeComponent();

            PlayerObject player = SMain.Envir.GetPlayer(playerId);

            if (player == null)
            {
                Close();
                return;
            }

            Character = SMain.Envir.GetCharacterInfo(player.Name);

            UpdatePlayerInfo();
        }
Beispiel #3
0
        private void ProcessPlayersOnlineTab()
        {
            if (PlayersOnlineListView.Items.Count != Envir.Players.Count)
            {
                PlayersOnlineListView.Items.Clear();

                for (int i = PlayersOnlineListView.Items.Count; i < Envir.Players.Count; i++)
                {
                    Server.MirDatabase.CharacterInfo character = Envir.Players[i].Info;

                    ListViewItem tempItem = character.CreateListView();

                    PlayersOnlineListView.Items.Add(tempItem);
                }
            }
        }
        public PlayerObject(CharacterInfo info, MirConnection connection)
        {
            if (info.Player != null)
                throw new InvalidOperationException("Player.Info not Null.");

            info.Player = this;
            info.Mount = new MountInfo(this);

            Connection = connection;
            Info = info;
            Account = Connection.Account;

            Report = new Reporting(this);

            if (Account.AdminAccount)
            {
                IsGM = true;
                SMain.Enqueue(string.Format("{0} is now a GM", Name));
            }

            if (Level == 0) NewCharacter();

            if (Info.GuildIndex != -1)
            {
                MyGuild = Envir.GetGuild(Info.GuildIndex);
            }
            RefreshStats();

            if (HP == 0)
            {
                SetHP(MaxHP);
                SetMP(MaxMP);

                CurrentLocation = BindLocation;
                CurrentMapIndex = BindMapIndex;

                if (Info.PKPoints >= 200)
                {
                    Map temp = Envir.GetMapByNameAndInstance(Settings.PKTownMapName, 1);
                    Point tempLocation = new Point(Settings.PKTownPositionX, Settings.PKTownPositionY);

                    if (temp != null && temp.ValidPoint(tempLocation))
                    {
                        CurrentMapIndex = temp.Info.Index;
                        CurrentLocation = tempLocation;
                    }
                }
            }
        }
 private void CleanUp()
 {
     Connection.Player = null;
     Info.Player = null;
     Info.Mount = null;
     Connection = null;
     Account = null;
     Info = null;
 }
Beispiel #6
0
        public bool Receive()
        {
            if (!Sent) return false; //mail not sent yet

            if (RecipientInfo == null)
            {
                RecipientInfo = SMain.Envir.GetCharacterInfo(RecipientIndex);

                if (RecipientInfo == null) return false;
            }

            RecipientInfo.Mail.Add(this); //add to players inbox
            
            if(RecipientInfo.Player != null)
            {
                RecipientInfo.Player.NewMail = true; //notify player of new mail  --check in player process
            }

            SMain.Envir.Mail.Remove(this); //remove from postbox

            return true;
        }
Beispiel #7
0
        private void GuildListView_DoubleClick(object sender, EventArgs e)
        {
            ListViewNF list = (ListViewNF)sender;

            if (list.SelectedItems.Count > 0)
            {
                ListViewItem item  = list.SelectedItems[0];
                int          index = Int32.Parse(item.Text);

                Server.MirObjects.GuildObject Guild = Envir.GetGuild(index);

                MirForms.GuildItemForm form = new MirForms.GuildItemForm()
                {
                    GuildName = Guild.Name,
                    main      = this,
                };

                if (Guild == null)
                {
                    return;
                }

                foreach (var i in Guild.StoredItems)
                {
                    if (i == null)
                    {
                        continue;
                    }
                    ListViewItem tempItem = new ListViewItem(i.Item.UniqueID.ToString())
                    {
                        Tag = this
                    };

                    Server.MirDatabase.CharacterInfo character = Envir.GetCharacterInfo((int)i.UserId);
                    if (character != null)
                    {
                        tempItem.SubItems.Add(character.Name);
                    }
                    else if (i.UserId == -1)
                    {
                        tempItem.SubItems.Add("Server");
                    }
                    else
                    {
                        tempItem.SubItems.Add("Unknown");
                    }

                    tempItem.SubItems.Add(i.Item.Name);
                    tempItem.SubItems.Add(i.Item.Count.ToString());
                    tempItem.SubItems.Add(i.Item.CurrentDura.ToString() + "/" + i.Item.MaxDura.ToString());

                    form.GuildItemListView.Items.Add(tempItem);
                }

                foreach (var r in Guild.Ranks)
                {
                    foreach (var m in r.Members)
                    {
                        ListViewItem tempItem = new ListViewItem(m.name)
                        {
                            Tag = this
                        };
                        tempItem.SubItems.Add(r.Name);
                        form.MemberListView.Items.Add(tempItem);
                    }
                }


                form.ShowDialog();
            }
        }
Beispiel #8
0
        private void ClearDailyQuests(CharacterInfo info)
        {
            //CharacterInfo c1 = info;
            //foreach (int flagId in
            //    from q in QuestInfoList
            //   // let flagId = 1000 + q.Index
            //    where c1.Flags[flagId] && q.Type == QuestType.Daily
            //    select flagId)
            //{
            //    info.Flags[flagId] = false;
            //}

            foreach (var quest in QuestInfoList)
            {
                if (quest.Type != QuestType.Daily) continue;

                for (int i = 0; i < info.CompletedQuests.Count; i++)
                {
                    if (info.CompletedQuests[i] != quest.Index) continue;

                    info.CompletedQuests.RemoveAt(i);
                }
            }

            if (info.Player != null)
            {
                info.Player.GetCompletedQuests();
            }
        }
Beispiel #9
0
 public void RemoveRank(CharacterInfo info)
 {
     List<Rank_Character_Info> Ranking;
     int Rankindex = -1;
     //first check overall top           
     if (info.Level >= RankBottomLevel[0])
     {
         Ranking = RankTop;
         Rankindex = FindRank(Ranking, info, 0);
         if (Rankindex >= 0)
         {
             Ranking.RemoveAt(Rankindex);
             for (int i = Rankindex; i < Ranking.Count(); i++)
             {
                 SetNewRank(Ranking[i], i, 0);
             }
         }
     }
     //next class based top
     if (info.Level >= RankBottomLevel[(byte)info.Class + 1])
     {
         Ranking = RankTop;
         Rankindex = FindRank(Ranking, info, 1);
         if (Rankindex >= 0)
         {
             Ranking.RemoveAt(Rankindex);
             for (int i = Rankindex; i < Ranking.Count(); i++)
             {
                 SetNewRank(Ranking[i], i, 1);
             }
         }
     }
 }
Beispiel #10
0
        public bool UpdateRank(List<Rank_Character_Info> Ranking, CharacterInfo info, byte type)
        {
            int CurrentRank = FindRank(Ranking, info, type);
            if (CurrentRank == -1) return false;//not in ranking list atm
            
            int NewRank = CurrentRank;
            //next find our updated rank
            for (int i = CurrentRank-1; i >= 0; i-- )
            {
                if ((Ranking[i].level > info.Level) || ((Ranking[i].level == info.Level) && (Ranking[i].Experience > info.Experience))) break;
                    NewRank =i;
            }

            Ranking[CurrentRank].level = info.Level;
            Ranking[CurrentRank].Experience = info.Experience;

            if (NewRank < CurrentRank)
            {//if we gained any ranks
                Ranking.Insert(NewRank, Ranking[CurrentRank]);
                Ranking.RemoveAt(CurrentRank + 1);
                for (int i = NewRank + 1; i < Math.Min(Ranking.Count, CurrentRank +1); i++)
                {
                    SetNewRank(Ranking[i], i + 1, type);
                }
            }
            info.Rank[type] = NewRank+1;
            
            return true;
        }
Beispiel #11
0
 public int FindRank(List<Rank_Character_Info> Ranking, CharacterInfo info, byte type)
 {
     int startindex = info.Rank[type];
     if (startindex > 0) //if there's a previously known rank then the user can only have gone down in the ranking (or stayed the same)
     {
         for (int i = startindex-1; i < Ranking.Count; i++)
         {
             if (Ranking[i].Name == info.Name)
                 return i;
         }
         info.Rank[type] = 0;//set the rank to 0 to tell future searches it's not there anymore
     }
     else //if there's no previously known ranking then technicaly it shouldnt be listed, but check anyway?
     {
         //currently not used so not coded it < if there's a reason to, easy to add :p
     }
     return -1;//index can be 0
 }
Beispiel #12
0
 public bool TryAddRank(List<Rank_Character_Info> Ranking, CharacterInfo info, byte type)
 {
     Rank_Character_Info NewRank = new Rank_Character_Info() { Name = info.Name, Class = info.Class, Experience = info.Experience, level = info.Level, PlayerId = info.Index, info = info };
     int NewRankIndex = InsertRank(Ranking, NewRank);
     if (NewRankIndex == 0) return false;
     for (int i = NewRankIndex; i < Ranking.Count; i++ )
     {
         SetNewRank(Ranking[i], i + 1, type);
     }
     info.Rank[type] = NewRankIndex;
     return true;
 }
Beispiel #13
0
 public void CheckRankUpdate(CharacterInfo info)
 {
     List<Rank_Character_Info> Ranking;
     //first check overall top 20
     Rank_Character_Info NewRank;
     if (info.Level >= RankBottomLevel[0])
     {
         Ranking = RankTop20;
         if (!UpdateRank(Ranking, info))
         {
             NewRank = new Rank_Character_Info() { Name = info.Name, Class = info.Class, Experience = info.Experience, level = info.Level/*, rank = 1*/, PlayerId = info.Index };
             if (InsertRank(Ranking, NewRank))
             {
                 if (Ranking.Count > 20)
                     Ranking.RemoveAt(20);
             }
         }
         if (Ranking.Count >= 20)
         { 
             NewRank = Ranking.Last();
             if (NewRank != null)
                 RankBottomLevel[0] = NewRank.level;
         }
     }
     //now check class top 20
     if (info.Level >= RankBottomLevel[(byte)info.Class + 1])
     {
         Ranking = RankClass20[(byte)info.Class];
         if (!UpdateRank(Ranking, info))
         {
             NewRank = new Rank_Character_Info() { Name = info.Name, Class = info.Class, Experience = info.Experience, level = info.Level/*, rank = 1*/, PlayerId = info.Index };
             if (InsertRank(Ranking, NewRank))
             {
                 if (Ranking.Count > 20)
                     Ranking.RemoveAt(20);
             }
         }
         if (Ranking.Count >= 20)
         {
             NewRank = Ranking.Last();
             if (NewRank != null)
                 RankBottomLevel[(byte)info.Class + 1] = NewRank.level;
         }
     }
 }
Beispiel #14
0
 public bool UpdateRank(List<Rank_Character_Info> Ranking, CharacterInfo info)
 {
     for (int i = 0; i < Ranking.Count; i++ )
     {
         if (Ranking[i] == null) break;//safety first
         if (Ranking[i].Name == info.Name)
         {
             Ranking[i].level = info.Level;
             Ranking[i].Experience = info.Experience;
             int NewRank = -1;
             for(int j = i-1; j >= 0; j--)
             {
                 if (Ranking[j] == null) break;//safety first
                 if ((Ranking[j].level > Ranking[i].level) || (Ranking[j].Experience > Ranking[i].Experience)) break;
                 NewRank = j;
             }
             if (NewRank > -1)
             {
                 Ranking.Insert(NewRank, Ranking[i]);
                 Ranking.RemoveAt(i + 1);
             }
             
             return true;
         }
     }
     return false;
 }
Beispiel #15
0
 public FriendInfo(CharacterInfo info, bool blocked)
 {
     Index = info.Index;
     Blocked = blocked;
     Memo = "";
 }
Beispiel #16
0
        public void NewCharacter(ClientPackets.NewCharacter p, MirConnection c)
        {
            if (!Settings.AllowNewCharacter)
            {
                c.Enqueue(new ServerPackets.NewCharacter {Result = 0});
                return;
            }

            if (!CharacterReg.IsMatch(p.Name))
            {
                c.Enqueue(new ServerPackets.NewCharacter {Result = 1});
                return;
            }

            if (p.Gender != MirGender.Male && p.Gender != MirGender.Female)
            {
                c.Enqueue(new ServerPackets.NewCharacter {Result = 2});
                return;
            }

            if (p.Class != MirClass.Warrior && p.Class != MirClass.Wizard && p.Class != MirClass.Taoist &&
                p.Class != MirClass.Assassin && p.Class != MirClass.Archer)
            {
                c.Enqueue(new ServerPackets.NewCharacter {Result = 3});
                return;
            }

            if((p.Class == MirClass.Assassin && !Settings.AllowCreateAssassin) ||
                (p.Class == MirClass.Archer && !Settings.AllowCreateArcher))
            {
                c.Enqueue(new ServerPackets.NewCharacter { Result = 3 });
                return;
            }

            int count = 0;

            for (int i = 0; i < c.Account.Characters.Count; i++)
            {
                if (c.Account.Characters[i].Deleted) continue;

                if (++count >= Globals.MaxCharacterCount)
                {
                    c.Enqueue(new ServerPackets.NewCharacter {Result = 4});
                    return;
                }
            }

            lock (AccountLock)
            {
                if (CharacterExists(p.Name))
                {
                    c.Enqueue(new ServerPackets.NewCharacter {Result = 5});
                    return;
                }

                CharacterInfo info = new CharacterInfo(p, c) { Index = ++NextCharacterID, AccountInfo = c.Account };

                c.Account.Characters.Add(info);
                CharacterList.Add(info);

                c.Enqueue(new ServerPackets.NewCharacterSuccess {CharInfo = info.ToSelectInfo()});
            }
        }
Beispiel #17
0
        public void CheckRankUpdate(CharacterInfo info)
        {
            List<Rank_Character_Info> Ranking;
            Rank_Character_Info NewRank;
            
            //first check overall top           
            if (info.Level >= RankBottomLevel[0])
            {
                Ranking = RankTop;
                if (!UpdateRank(Ranking, info,0))
                {
                    if (TryAddRank(Ranking, info, 0))
                    {
                        if (Ranking.Count > RankCount)
                        {
                            SetNewRank(Ranking[RankCount], 0, 0);
                            Ranking.RemoveAt(RankCount);

                        }
                    }
                }
                if (Ranking.Count >= RankCount)
                { 
                    NewRank = Ranking[Ranking.Count -1];
                    if (NewRank != null)
                        RankBottomLevel[0] = NewRank.level;
                }
            }
            //now check class top
            if (info.Level >= RankBottomLevel[(byte)info.Class + 1])
            {
                Ranking = RankClass[(byte)info.Class];
                if (!UpdateRank(Ranking, info,1))
                {
                    if (TryAddRank(Ranking, info, 1))
                    {
                        if (Ranking.Count > RankCount)
                        {
                            SetNewRank(Ranking[RankCount], 0, 1);
                            Ranking.RemoveAt(RankCount);
                        }
                    }
                }
                if (Ranking.Count >= RankCount)
                {
                    NewRank = Ranking[Ranking.Count -1];
                    if (NewRank != null)
                        RankBottomLevel[(byte)info.Class + 1] = NewRank.level;
                }
            }
        }
Beispiel #18
0
        private void ClearDailyQuests(CharacterInfo info)
        {
            foreach (var quest in QuestInfoList)
            {
                if (quest.Type != QuestType.Daily) continue;

                for (int i = 0; i < info.CompletedQuests.Count; i++)
                {
                    if (info.CompletedQuests[i] != quest.Index) continue;

                    info.CompletedQuests.RemoveAt(i);
                } 
            }

            if (info.Player != null)
            {
                info.Player.GetCompletedQuests();
            }       
        }
Beispiel #19
0
        private void ClearDailyQuests(CharacterInfo info)
        {
            CharacterInfo c1 = info;
            foreach (int flagId in
                from q in QuestInfoList
                let flagId = 1000 + q.Index
                where c1.Flags[flagId] && q.Type == QuestType.Daily
                select flagId)
            {
                info.Flags[flagId] = false;
            }

            if (info.Player != null)
            {
                info.Player.GetCompletedQuests();
            }
        }