/******************************************************************************** * 文件名: Guild.cs * 全路径: \Script\Player\Guild\Guild.cs * 创建人: 李嘉 * 创建时间:2014-04-22 * * 功能说明:帮会基础数据 * 修改记录: *********************************************************************************/ using UnityEngine; using System.Collections; using System; using System.Collections.Generic; using Games.GlobeDefine; public class Guild { public enum BuildType { None = -2, guildInfo = -1, house, coin, library, } public static Dictionary GuildJobName = new Dictionary() { {(int)GameDefine_Globe.GUILD_JOB.CHIEF,"#{25004}" }, {(int)GameDefine_Globe.GUILD_JOB.VICE_CHIEF,"#{25005}" }, {(int)GameDefine_Globe.GUILD_JOB.TANGZHU,"#{25006}" }, {(int)GameDefine_Globe.GUILD_JOB.XIANGZHU,"#{25007}" }, {(int)GameDefine_Globe.GUILD_JOB.ELITE,"#{25008}" }, {(int)GameDefine_Globe.GUILD_JOB.MEMBER,"#{25009}" }, {(int)GameDefine_Globe.GUILD_JOB.RESERVE,"#{25010}" }, {(int)GameDefine_Globe.GUILD_JOB.PRERESERVE,"#{25011}" }, }; public Guild() { CleanUp(); } public void CleanUp() { m_GuildGuid = GlobeVar.INVALID_GUID; m_GuildName = ""; m_GuildLevel = 0; m_GuildChiefGuid = GlobeVar.INVALID_GUID; m_nPSCanAcceptTimes = 0; buildLevels.Clear(); buildCooldown.Clear(); if (null == m_GuildMemberList) { m_GuildMemberList = new Dictionary(); } if(null == m_GuildApplyList) { m_GuildApplyList = new Dictionary(); } m_GuildMemberList.Clear(); m_GuildApplyList.Clear(); if(Singleton.Instance.MainPlayer!=null) { Singleton.Instance.MainPlayer.ChangePaoShangState(""); } GuildRedShow(); } private UInt64 m_GuildGuid; //帮会GUID public System.UInt64 GuildGuid { get { return m_GuildGuid; } set { m_GuildGuid = value; } } private string m_GuildName; //帮会GUID public string GuildName { get { return m_GuildName; } set { m_GuildName = value; } } private int m_GuildLevel; //帮会等级 public int GuildLevel { get { return m_GuildLevel; } set { m_GuildLevel = value; } } private int m_GuildJob; //自己在帮会的职位 public int GuildJob { get { return m_GuildJob; } set { m_GuildJob = value; } } private int m_GuildLevelCoolDown; //帮会等级冷却时间 public int GuildLevelCoolDown { get { return m_GuildLevelCoolDown; } set { m_GuildLevelCoolDown = value; } } private UInt64 m_GuildChiefGuid; //帮主Guid public System.UInt64 GuildChiefGuid { get { return m_GuildChiefGuid; } set { m_GuildChiefGuid = value; } } private string m_GuildChiefName; //帮主名字 public string GuildChiefName { get { return m_GuildChiefName; } set { m_GuildChiefName = value; } } private string m_GuildCreatorName; //帮主名字 public string GuildCreatorName { get { return m_GuildCreatorName; } set { m_GuildCreatorName = value; } } private int m_GuildExp; //帮会活跃度 public int GuildExp { get { return m_GuildExp; } set { m_GuildExp = value; } } private int m_GuildCurMem; //帮会当前人数 public int GuildCurMem { get { return m_GuildCurMem; } set { m_GuildCurMem = value; } } private int m_GuildMaxMem; //帮会最大人数 public int GuildMaxMem { get { return m_GuildMaxMem; } set { m_GuildMaxMem = value; } } private int m_GuildPay; //帮会维护费用 public int GuildPay { get { return m_GuildPay; } set { m_GuildPay = value; } } private long m_GuildMoney; //帮会资金 public long GuildMoney { get { return m_GuildMoney; } set { m_GuildMoney = value; } } private int m_GuildContribute; //帮会贡献 public int GuildContribute { get { return m_GuildContribute; } set { m_GuildContribute = value; Games.Events.EventDispatcher.Instance.SendMessage(Games.Events.EventId.FRESHSAMEUSETIP); XiulianRedPoint(); } } private int m_GuildTotleCombat; //帮会总战力 public int GuildTotleCombat { get { return m_GuildTotleCombat; } set { m_GuildTotleCombat = value; } } private int m_GuildMatchCamp; //帮会总战力 public int GuildMatchCam { get { return m_GuildMatchCamp; } set { m_GuildMatchCamp = value; } } private int m_lastChangeNameTime; //上次改名时间戳 public int LastChangeNameTime { get { return m_lastChangeNameTime; } set { m_lastChangeNameTime = value; } } private string m_GuildNotice; //帮会公告 public string GuildNotice { get { return m_GuildNotice; } set { m_GuildNotice = value; } } private int m_AutoApproveState; //自动同意申请状态 public int AutoApproveState { get { return m_AutoApproveState; } set { m_AutoApproveState = value; } } private int m_AutoApproveLevel; //自动同意申请限制等级 public int AutoApproveLevel { get { return m_AutoApproveLevel; } set { m_AutoApproveLevel = value; } } private Dictionary buildCooldown = new Dictionary(); private Dictionary buildLevels = new Dictionary(); private Dictionary m_GuildMemberList = null; //帮会成员列表 public Dictionary GuildMemberList { get { return m_GuildMemberList; } } private Dictionary m_GuildApplyList = null; //帮会申请列表 public Dictionary GuildApplyList { get { return m_GuildApplyList; } } private int _GuildWineCollectState = 1; //行酒令采集任务状态 public int GuildWineCollectState { get { return _GuildWineCollectState; } set { _GuildWineCollectState = value;Games.Events.EventDispatcher.Instance.Dispatch(Games.Events.EventId.GuildWine); } } private int _GuildWarState = 0; //帮战状态 public int GuildWarState { get { return _GuildWarState; } set { _GuildWarState = value; ActivityDataManager.Instance.SyncActivityLeaveBoss((int)ActivityDataManager.Activity_Type.ACTIVITY_TYPE_GUILD_UNION_MATCH, _GuildWarState == 0 ? 0 : -1); if (ActiveBtns.Instance() != null) ActiveBtns.Instance().RefreshBtns((int)ActivityDataManager.Activity_Type.ACTIVITY_TYPE_GUILD_UNION_MATCH); } } private int _FeastState = 0; public int FeastState { get { return _FeastState; } set { _FeastState = value; } } private int _GuildWineDrinkState = 1; //行酒令喝酒任务状态 public int GuildWineDrinkState { get { return _GuildWineDrinkState; } set { _GuildWineDrinkState = value; Games.Events.EventDispatcher.Instance.Dispatch(Games.Events.EventId.GuildWine); } } // private UInt64 m_PreserveGuildGuid; //玩家当前加入的待审批帮会Guid,在申请帮会列表的时候同步 // public System.UInt64 PreserveGuildGuid // { // get { return m_PreserveGuildGuid; } // set { m_PreserveGuildGuid = value; } // } private int m_nPSCanAcceptTimes; public int PSCanAcceptTimes { get { return m_nPSCanAcceptTimes; } set { m_nPSCanAcceptTimes = value; } } public void UpdateData(GC_GUILD_RET_INFO info) { //清空之前的数据 //CleanUp(); if(info!=null) GuildContribute = info.Contribute; //判断消息包数据合法性 if (null == info || info.GuildGuid == GlobeVar.INVALID_GUID) { return; } //填充数据 GuildGuid = info.GuildGuid; GuildLevel = info.GuildLevel; GuildName = info.GuildName; GuildChiefGuid = info.GuildChiefGuid; GuildChiefName = info.GuildChiefName; GuildCreatorName = info.CreatorName; GuildExp = info.GuildExp; GuildNotice = info.Notice; GuildCurMem = info.CurMemberNum; GuildMaxMem = info.MaxMemberNum; GuildTotleCombat = info.TotalCombat; GuildPay = info.DayCost; GuildMoney = info.Wealth; GuildJob = info.Guildjob; GuildContribute = info.Contribute; buildLevels[(int)BuildType.house] = info.HouseLevel; buildLevels[(int)BuildType.library] = info.CollegeLevel; buildLevels[(int)BuildType.coin] = info.GoldOreLevel; LastChangeNameTime = (int)info.LastChangeNameTime; m_GuildMatchCamp = info.UnionMatchCamp; if (info.HasPscanacpttimes) { PSCanAcceptTimes = info.Pscanacpttimes; } if (info.Type == (int)CG_GUILD_REQ_INFO.REQ_TYPE.REQ_TYPE_MEMBET_LIST) { GuildMemberList.Clear(); } if (info.Type == (int)CG_GUILD_REQ_INFO.REQ_TYPE.REQ_TYPE_APPLY_LIST) { m_GuildApplyList.Clear(); } AttrWithBuildLevel(); XiulianRedPoint(); for (int i = 0; i < info.memberInfoCount; ++i ) { MemberBaseInfo memberInfo = info.GetMemberInfo(i); if (memberInfo.Guid == GlobeVar.INVALID_GUID) continue; GuildMember member = new GuildMember(); member.Guid = memberInfo.Guid; member.MemberName = memberInfo.Name; member.Profession = memberInfo.Prof; member.Level = memberInfo.Level; member.ComBatVal = memberInfo.Combat; member.Job = memberInfo.Job; member.Repair = memberInfo.Repair; member.Practice = memberInfo.Practice; member.CurrWeekContribute = memberInfo.Weekcontribute; member.HistoryContribute = memberInfo.Historycontribute; member.Contribute = memberInfo.Nowcontribute; member.WarTimes = memberInfo.Guildwarcout; member.State = memberInfo.OnlineState; member.LastLogout = memberInfo.Lastlogouttm; if (info.Type == (int)CG_GUILD_REQ_INFO.REQ_TYPE.REQ_TYPE_MEMBET_LIST) { GuildMemberList[memberInfo.Guid] = member; if (m_GuildApplyList.ContainsKey(memberInfo.Guid)) m_GuildApplyList.Remove(memberInfo.Guid); } if (info.Type == (int)CG_GUILD_REQ_INFO.REQ_TYPE.REQ_TYPE_APPLY_LIST) { m_GuildApplyList[memberInfo.Guid] = member; } } GuildRedShow(); //按照VIP等级排序 //SortMemberListByVIP(m_GuildMemberList); //按照等级排序 //SortMemberListByLevel(m_GuildMemberList); //按照在线状态进行排序 //SortMemberListByOnLine(m_GuildMemberList); //按照职位排序 //SortMemberListByJob(m_GuildMemberList); // 玩家自己永远第一位,帮主第二位,然后按照官职排,最后按照等级排列 SortMemberListByJob(m_GuildMemberList); } public void GuildRedShow() { // 职位是否可以接收红点 if (GuildJob == (int)GameDefine_Globe.GUILD_JOB.CHIEF || GuildJob == (int)GameDefine_Globe.GUILD_JOB.VICE_CHIEF || GuildJob == (int)GameDefine_Globe.GUILD_JOB.TANGZHU || GuildJob == (int)GameDefine_Globe.GUILD_JOB.XIANGZHU) { if (m_GuildApplyList.Count > 0) { RedTipPoint.RedPointStateChange(RedTipPoint.PointType.GuildApply, true); return; } } RedTipPoint.RedPointStateChange(RedTipPoint.PointType.GuildApply, false); } public int GetBuildLevel(BuildType type) { if(buildLevels.ContainsKey((int)type)) { return buildLevels[(int)type]; } return -1; } public int GetBuildCoolDown(BuildType type) { if (buildCooldown.ContainsKey((int)type)) { return buildCooldown[(int)type]; } return -1; } public void SetBuildInfo(GC_GUILD_BUILDING_INFO packet) { for(int i=0;i 0 ? (int)Time.realtimeSinceStartup + packet.GetCooldown(i) : 0; } else { Module.Log.LogModule.ErrorLog("Build Level : " + packet.GetLevel(i)); buildLevels[packet.GetType(i)] = packet.GetLevel(i); int cooldown = packet.GetCooldown(i); buildCooldown[packet.GetType(i)] = cooldown > 0 ? (int)Time.realtimeSinceStartup + packet.GetCooldown(i) : 0; } } if(packet.HasGuildwealth) m_GuildMoney = packet.Guildwealth; } public int GetGuildFormalMemberCount() { int nNum = 0; foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Job != (int)GameDefine_Globe.GUILD_JOB.RESERVE) { nNum++; } } return nNum; } public int GetGuildReserveMemberCount() { int nNum = 0; foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Job == (int)GameDefine_Globe.GUILD_JOB.RESERVE) { nNum++; } } return nNum; } //设置成员的职位 public void SetMemberJob(UInt64 memberGuid,int job) { if (m_GuildMemberList == null) return; foreach (KeyValuePair member in m_GuildMemberList) { GuildMember mem = member.Value; if (mem.IsValid() && mem.Guid == memberGuid) { mem.Job = job; m_GuildMemberList[mem.Guid] = mem; break; } } GuildMember MainPlayer = GetMainPlayerGuildInfo(); if(job == (int)GameDefine_Globe.GUILD_JOB.CHIEF) { if (MainPlayer != null && MainPlayer.Job == (int)GameDefine_Globe.GUILD_JOB.CHIEF) { MainPlayer.Job = (int)GameDefine_Globe.GUILD_JOB.MEMBER; m_GuildMemberList[MainPlayer.Guid] = MainPlayer; } GuildChiefGuid = memberGuid; } if (Singleton.Instance.MainPlayer != null && Singleton.Instance.MainPlayer.GUID == memberGuid) { GuildJob = job; GuildRedShow(); } SortMemberListByJob(m_GuildMemberList); Games.Events.EventDispatcher.Instance.SendMessage(Games.Events.EventId.OperatorResult, null); } public GCGame.Table.Tab_GuildJurisdiction GetMemberJurisdic(ulong memberGuid) { int job = (int)GameDefine_Globe.GUILD_JOB.INVALID; if (Singleton.Instance.MainPlayer!=null && Singleton.Instance.MainPlayer.GUID == memberGuid) { job = GuildJob; } else { foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Guid == memberGuid) { job = member.Value.Job; break; } } } GCGame.Table.Tab_GuildJurisdiction table = GCGame.Table.TableManager.GetGuildJurisdictionByID(job, 0); if (table != null) return table; return null; } public GuildMember GetVICE_CHIEF() { foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Job == (int)GameDefine_Globe.GUILD_JOB.VICE_CHIEF) { return member.Value; } } return null; } public int GetMemberCountJob(int job) { int count = 0; foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Job == job) { count++; } } return count; } //根据会员Guid获得其职位 public int GetMemberJob(UInt64 memberGuid) { if (memberGuid == GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid) return GuildJob; int nJob = (int)GameDefine_Globe.GUILD_JOB.INVALID; foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Guid == memberGuid) { nJob = member.Value.Job; break; } } return nJob; } //根据会员Guid获得其等级 public int GetMemberLevel(UInt64 memberGuid) { int nLevel = (int)GameDefine_Globe.GUILD_JOB.INVALID; foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Guid == memberGuid) { nLevel = member.Value.Level; break; } } return nLevel; } //根据会员Guid获得其贡献度 public int GetMemberContribute(UInt64 memberGuid) { int nContribute = (int)GameDefine_Globe.GUILD_JOB.INVALID; foreach (KeyValuePair member in m_GuildMemberList) { if (member.Value.IsValid() && member.Value.Guid == memberGuid) { nContribute = member.Value.Contribute; break; } } return nContribute; } //获得MainPlayer的帮会信息 public GuildMember GetMainPlayerGuildInfo() { GuildMember mainPlayerGuildInfo; if (null != Singleton.GetInstance().MainPlayer && GuildMemberList.TryGetValue(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid, out mainPlayerGuildInfo)) { return mainPlayerGuildInfo; } return null; } protected Dictionary SortMemberListByJob(Dictionary dic) { List> myList = new List>(dic); myList.Sort(delegate(KeyValuePair s1, KeyValuePair s2) { if(s1.Value.State != s2.Value.State) { return s2.Value.State.CompareTo(s1.Value.State); } else { if(s1.Value.Job != s2.Value.Job) { return s1.Value.Job.CompareTo(s2.Value.Job); } else { if(s1.Value.Level!=s2.Value.Level) { return s2.Value.Level.CompareTo(s1.Value.Level); } } } return s2.Value.LastLogout.CompareTo(s1.Value.LastLogout); }); dic.Clear(); foreach (KeyValuePair pair in myList) { dic.Add(pair.Key, pair.Value); } return dic; } protected Dictionary SortMemberListByOnLine(Dictionary dic) { List> myList = new List>(dic); myList.Sort(delegate(KeyValuePair s1, KeyValuePair s2) { return s2.Value.State.CompareTo(s1.Value.State); }); dic.Clear(); foreach (KeyValuePair pair in myList) { dic.Add(pair.Key, pair.Value); } return dic; } protected Dictionary SortMemberListByVIP(Dictionary dic) { List> myList = new List>(dic); myList.Sort(delegate(KeyValuePair s1, KeyValuePair s2) { return s2.Value.VIP.CompareTo(s1.Value.VIP); }); dic.Clear(); foreach (KeyValuePair pair in myList) { dic.Add(pair.Key, pair.Value); } return dic; } protected Dictionary SortMemberListByLevel(Dictionary dic) { List> myList = new List>(dic); myList.Sort(delegate(KeyValuePair s1, KeyValuePair s2) { return s2.Value.Level.CompareTo(s1.Value.Level); }); dic.Clear(); foreach (KeyValuePair pair in myList) { dic.Add(pair.Key, pair.Value); } return dic; } protected void SortByNewRule() { // 先按照帮主第一玩家第二的规则排 Dictionary tempList = new Dictionary (); foreach (KeyValuePair member in m_GuildMemberList)// 会长 { if (member.Value.IsValid() && member.Value.Job == (int)GameDefine_Globe.GUILD_JOB.CHIEF) { tempList.Add(member.Key,member.Value); break; } } foreach (KeyValuePair member in m_GuildMemberList)// 玩家自己 { if (tempList.ContainsKey(member.Key)) { break; } if (member.Value.IsValid() && member.Key == GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid) { tempList.Add(member.Key,member.Value); break; } } foreach (KeyValuePair member in m_GuildMemberList)// 副帮主 { if (tempList.ContainsKey(member.Key)) { continue; } if (member.Value.IsValid() && member.Value.Job == (int)GameDefine_Globe.GUILD_JOB.VICE_CHIEF) { tempList.Add(member.Key,member.Value); continue; } } SortedDictionary levelTempList = new SortedDictionary (new MySortU()); foreach (KeyValuePair member in m_GuildMemberList)// 按照等级排序,需要排除键值相同的情况所以指定SortedDictionary中的compare方法 { if (tempList.ContainsKey(member.Key)) // 已经排过的不处理 { continue; } levelTempList.Add((uint)(200 - member.Value.Level), member.Value); // 按照等级降序排列 } foreach(var levelItem in levelTempList) { tempList.Add(levelItem.Value.Guid,levelItem.Value); } m_GuildMemberList.Clear (); m_GuildMemberList = tempList; } #region public Dictionary m_AttrInfos = new Dictionary(); public Dictionary m_AttrTypes = new Dictionary(); //帮会修炼信息 public void FreshNewInfo(GC_PERSON_PRACTICE_INFO infos) { if (infos == null) return; if (m_AttrInfos.Count <= 0 && m_AttrTypes.Count <= 0) { var table = GCGame.Table.TableManager.GetGuildAttrPractice().Values; foreach (var attrInfo in table) { GuildXiulianWnd.AttrInfo attr = new GuildXiulianWnd.AttrInfo(); attr.attrID = attrInfo.Id; attr.attrTab = attrInfo; m_AttrInfos[attr.attrID] = attr; m_AttrTypes[attrInfo.TypeId] = attrInfo.TypeName; } } int libraryLevel = GameManager.gameManager.PlayerDataPool.GuildInfo.GetBuildLevel(Guild.BuildType.library); for (int i = 0; i < infos.practiceidCount; i++) { if (infos.practiceexpCount <= i) break; if (infos.practicelevelCount <= i) break; GuildXiulianWnd.AttrInfo newInfo = new GuildXiulianWnd.AttrInfo(); if (m_AttrInfos.TryGetValue(infos.GetPracticeid(i), out newInfo)) { newInfo.attrExp = infos.GetPracticeexp(i); int level = infos.GetPracticelevel(i); if (level == 0 && libraryLevel < newInfo.attrTab.GuildCollegeLevel) newInfo.attrLevel = -1; else newInfo.attrLevel = infos.GetPracticelevel(i); } } XiulianRedPoint(); } public void AttrWithBuildLevel() { if (m_AttrInfos.Count <= 0 && m_AttrTypes.Count <= 0) { var table = GCGame.Table.TableManager.GetGuildAttrPractice().Values; foreach (var attrInfo in table) { GuildXiulianWnd.AttrInfo attr = new GuildXiulianWnd.AttrInfo(); attr.attrID = attrInfo.Id; attr.attrTab = attrInfo; m_AttrInfos[attr.attrID] = attr; m_AttrTypes[attrInfo.TypeId] = attrInfo.TypeName; } } int libraryLevel = GameManager.gameManager.PlayerDataPool.GuildInfo.GetBuildLevel(Guild.BuildType.library); List keys = new List(); for(int i=0;i=0 || attrInfo.Value.attrTab.GuildCollegeLevel <= libraryLevel) && attrInfo.Value.attrLevel < attrInfo.Value.attrTab.getLevelCount() && attrInfo.Value.attrTab.GetNeedLevelbyIndex(attrInfo.Value.attrLevel) <= GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level) { long haveCost = GameManager.gameManager.PlayerDataPool.Money.GetMoneyByType((MONEYTYPE)attrInfo.Value.attrTab.MoneyType); int costMoney = attrInfo.Value.attrTab.MoneyNum; int CostContribute = attrInfo.Value.attrTab.ContributeNum; int haveContribute = GameManager.gameManager.PlayerDataPool.GuildInfo.GuildContribute; if(haveCost >= costMoney && haveContribute >= CostContribute) { RedTipPoint.RedPointStateChange(RedTipPoint.PointType.GuildXiulian, true); return; } } } RedTipPoint.RedPointStateChange(RedTipPoint.PointType.GuildXiulian, false); } public void AskXiulianInfo() { CG_REQ_GUILD_PRACTICE send = (CG_REQ_GUILD_PRACTICE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_GUILD_PRACTICE); send.SetOptiontype((int)CG_REQ_GUILD_PRACTICE.OPTION_TYPE.PERSON_PRACTICE); send.AddPracticeid(0); send.IsAllowWithSilver = 0; send.SendPacket(); } #endregion } public class MySort : IComparer { #region IComparer 成员 public int Compare(int x, int y) { //排序 int iResult = x - y; if(iResult == 0) iResult = -1; // 排除重复 return iResult; } #endregion } public class MySortU : IComparer { #region IComparer 成员 public int Compare(uint x, uint y) { //排序 int iResult = (int)x - (int)y; if(iResult == 0) iResult = -1; // 排除重复 return iResult; } #endregion } //反序排序,数字大的在前前 public class MySortURverse : IComparer { #region IComparer 成员 public int Compare(uint x, uint y) { //排序 int iResult = (int)x - (int)y; if (iResult == 0) iResult = -1; // 排除重复 return -iResult; } #endregion }