using System; using System.Collections.Generic; using System.Text; namespace ET { public class FamilyDestroySystem : DestroySystem { public override void Destroy(Family self) { self.level = 0; self.hornor = 0; self.RequestList.Clear(); self.notice = null; self.name = null; self.positionMap.Clear(); self.contributionDic.Clear(); self.bossRewardDic.Clear(); } } public static class FamilySystem { private const int Max_FamilyMember_Count = 30; private const int Max_RequestFamilyMember_Count = 20; private readonly static Dictionary ContributionArr = new Dictionary { { FamilyPosition.FamilyLeader,0.5f }, { FamilyPosition.FamilyDeputyLeader,0.4f }, { FamilyPosition.FamilyMember,0.3f }, }; public static void Add(this Family self, FamilyPosition familyPosition, long id) { if (!self.contributionDic.TryAdd(id, 0)) { Log.Error($"dic has the key == {id}"); } if (!self.positionMap.ContainsKey(familyPosition)) { self.positionMap[familyPosition] = new List(); } self.positionMap[familyPosition].Add(id); } public static void AddContribution(this Family self, long id, int contribute) { if (!self.contributionDic.TryGetValue(id, out int old)) old = 0; old += contribute; self.contributionDic[id] = old; float percent = ContributionArr[self.GetFamilyPosition(id)]; self.AddHornor((int)(old * percent)); } public static void AddHornor(this Family self, int hornor) { self.hornor += hornor; } public static async ETTask AutoTransferLeader(this Family self) { if (!self.positionMap.TryGetValue(FamilyPosition.FamilyDeputyLeader, out List deputyLeader)) { if (!self.positionMap.TryGetValue(FamilyPosition.FamilyMember, out List memberList)) { //!解散 await FamilyComponent.Instance.DeleteFamily(self); return; } long id = memberList[0]; if (memberList.Count > 1) { memberList.RemoveAt(0); } else self.positionMap.Remove(FamilyPosition.FamilyMember); self.positionMap[FamilyPosition.FamilyLeader][0] = id; } else { long id = deputyLeader[0]; if (deputyLeader.Count > 1) { deputyLeader.RemoveAt(0); } else self.positionMap.Remove(FamilyPosition.FamilyDeputyLeader); self.positionMap[FamilyPosition.FamilyLeader][0] = id; } } public static void TransferPosition(this Family self) { } public static void AddReward(this Family self, int bossId, long id, int itemId, int count) { if (!self.bossRewardDic.TryGetValue(bossId, out List>>> dic)) { self.bossRewardDic[bossId] = dic = new List>>>(); } int index = dic.FindIndex(t => t.Key == id); KeyValuePair>> kv; if (index == -1) { kv = KeyValuePair.Create(id, new List>() { KeyValuePair.Create(itemId, count) }); dic.Add(kv); } else { kv = dic[index]; kv.Deconstruct(out _, out List> list); list.Add(KeyValuePair.Create(itemId, count)); dic[index] = KeyValuePair.Create(id, list); } } public static void ClearReward(this Family self, int bossId, long id) { if (!self.bossRewardDic.TryGetValue(bossId, out List>>> dic)) { return; } for (int i = dic.Count - 1; i >= 0; i--) { KeyValuePair>> kv = dic[i]; if (kv.Key == id) { kv.Value.Clear(); break; } } } public static bool HasReward(this Family self, int bossId, long id) { if (!self.bossRewardDic.TryGetValue(bossId, out List>>> dic)) { return false; } for (int i = dic.Count - 1; i >= 0; i--) { KeyValuePair>> kv = dic[i]; if (kv.Key == id) { return kv.Value.Count > 0; } } return false; } public static FamilyPosition GetFamilyPosition(this Family self, long id) { if (self.IsLeader(id)) return FamilyPosition.FamilyLeader; else if (self.IsManager(id)) return FamilyPosition.FamilyDeputyLeader; else return FamilyPosition.FamilyMember; } public static bool IsManager(this Family self, long id) { return self.IsLeader(id) || self.IsViteLeader(id); } /// /// 族长 /// /// /// /// public static bool IsLeader(this Family self, long id) { if (!self.positionMap.TryGetValue(FamilyPosition.FamilyLeader, out List list)) { return false; } long leader = list[0]; return leader == id; } /// /// 副族长 /// /// /// /// public static bool IsViteLeader(this Family self, long id) { if (!self.positionMap.TryGetValue(FamilyPosition.FamilyDeputyLeader, out List leaderList)) { return false; } if (leaderList != null) { foreach (long item in leaderList) { if (item == id) return true; } } return false; } public static IEnumerable GetAllId(this Family self) { return self.contributionDic.Keys; } /// /// 收集成员信息 /// /// /// /// /// /// public static async ETTask CollectFamilyMemberInfo(this Family self, System.Collections.Generic.List list, System.Collections.Generic.List requestInfoList) { if (self == null) { Log.Error($"family==null"); return; } if (list == null) return; foreach (long userId in self.contributionDic.Keys) { long lastLoginTime = -1; User user = await UserHelper.Query(userId); if (user != null) lastLoginTime = user.lastLoginTime; if (user.IsOnline()) { lastLoginTime = 0; } else { } FamilyMemberInfo info = new FamilyMemberInfo { Id = user.Id, Level = user.Level, Name = user.NickName, Job = JobHelper.GetJobType(user.JobId), LastLginTime = lastLoginTime }; list.Add(info); foreach (KeyValuePair kv in self.contributionDic) { info.ContributionList.Add(new FamilyContributionMap { Id = kv.Key, Value = kv.Value }); } } requestInfoList?.AddRange(self.RequestList); } /// /// 申请加入家族 /// /// /// /// /// /// /// /// public static string RequestEnterFamily(this Family self, User user) { Family family = self; if (family.contributionDic.Count >= Max_FamilyMember_Count) { return "此家族成员已达上限"; } if (family.RequestList.Count >= Max_RequestFamilyMember_Count) { return "申请列表达到上限"; } //!被邀请列表 bool hasRequest = false; foreach (RequestAddFriendInfo item in family.RequestList) { if (item.Id == user.Id) hasRequest = true; } if (hasRequest) { return "已经申请过了,请等待对方审核!"; } family.RequestList.Add(new RequestAddFriendInfo { Id = user.Id, Name = user.NickName, Level = user.Level, Job = JobHelper.GetJobType(user.JobId), Sex = JobHelper.GetSexType(user.JobId), }); return null; } public static bool Caintains(this Family self,long id) { return self.contributionDic.ContainsKey(id); } /// /// 处理加入的申请 /// /// /// /// /// /// /// /// public static async ETTask HandleRequest(this Family self, User user, bool isAgree, long unitId, System.Collections.Generic.List list, System.Collections.Generic.List requestInfoList) { Family family = self; if (!family.IsManager(user.Id)) { return "权限不足"; } if (family.contributionDic.Count >= Max_FamilyMember_Count) { return "家族人数已满"; } if (!isAgree) { await RemoveInrequestList(self, family, user, unitId); return null; } if (family.Caintains(unitId)) { return "该玩家已经加入家族"; } //!添加别人 User otherUser = await UserComponent.Instance.Query(unitId); if (!string.IsNullOrEmpty(otherUser.Family)) { return "对方已有家族"; } otherUser.Family = family.name; UserComponent.Instance.Save(otherUser).Coroutine(); family.Add(FamilyPosition.FamilyMember, otherUser.Id); await RemoveInrequestList(self, family, user, unitId); //!更新后的列表 await self.CollectFamilyMemberInfo(list, requestInfoList); return null; //!从申请列表中移除 static async ETTask RemoveInrequestList(Family self, Family family, User user, long unitId) { List mineList = family.RequestList; for (int i = mineList.Count - 1; i >= 0; i--) { if (mineList[i].Id == unitId) mineList.RemoveAt(i); } await self.GetParent().Save(family); } } /// /// 删除成员 /// /// /// /// /// /// public static async ETTask DeleteMember(this Family self, Unit unit, long unitId, System.Collections.Generic.List list) { Family family = self; if (!family.IsManager(unit.Id)) { return "权限不足"; } if (family.IsManager(unitId) && !family.IsLeader(unit.Id)) { return "权限不足"; } family.contributionDic.Remove(unitId); foreach (KeyValuePair> kv in family.positionMap) { kv.Value.Remove(unitId); } User user = await UserComponent.Instance.Query(unitId); if (user != null) { user.Family = ""; UserComponent.Instance.Save(user).Coroutine(); } //!更新后的列表 await self.CollectFamilyMemberInfo(list, null); return null; } public static async ETTask ForceDeleteMember(this Family self, long unitId) { Family family = self; if (family.IsLeader(unitId)) { await FamilyComponent.Instance.DeleteFamily(family); return; } family.contributionDic.Remove(unitId); foreach (KeyValuePair> kv in family.positionMap) { kv.Value.Remove(unitId); } User user = await UserComponent.Instance.Query(unitId); if (user != null) { user.Family = ""; UserComponent.Instance.Save(user).Coroutine(); } } /// /// 离开家族 /// /// /// /// public static async ETTask LeaveFamily(this Family self, User user) { Family family = self; List leader = family.positionMap[FamilyPosition.FamilyLeader]; if (leader == null) { Log.Error($"leader == null where family name is {family.name}"); return "系统错误"; } if (leader[0] == user.Id) { //!自动转让族长 await family.AutoTransferLeader(); } user.Family = ""; UserComponent.Instance.Save(user).Coroutine(); if (family != null) { if (family.contributionDic.Count == 0) return null; family.contributionDic.Remove(user.Id); await self.GetParent().Save(family); } return null; } } }