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; } }
public PlayerInfoForm(uint playerId) { InitializeComponent(); PlayerObject player = SMain.Envir.GetPlayer(playerId); if (player == null) { Close(); return; } Character = SMain.Envir.GetCharacterInfo(player.Name); UpdatePlayerInfo(); }
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; }
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; }
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(); } }
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(); } }
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); } } } }
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; }
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 }
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; }
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; } } }
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; }
public FriendInfo(CharacterInfo info, bool blocked) { Index = info.Index; Blocked = blocked; Memo = ""; }
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()}); } }
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; } } }
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(); } }
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(); } }