using Cal; using Cal.DataTable; using System; using System.Collections.Generic; using System.Linq; namespace ET { public class PetAwakeSystem: AwakeSystem { public override void Awake(Pet self) { self.level = 1; self.name = "宠物"; self.actionEndTime = 0; self.Load(); } } public class PetLoadSystem: LoadSystem { public override void Load(Pet self) { self.Load(); } } public class PetDeserializeSystem: DeserializeSystem { public override void Deserialize(Pet self) { self.Load(); } } public class PetChangeSystem: ChangeSystem { public override void Change(Pet self) { UnitHelper.SaveComponenet(self).Coroutine(); Unit unit = self.GetParent(); M2C_SyncPet proto = new() { UnitId = self.Id, petId = self.petId, exp = self.exp, isShow = self.isShow, level = self.level, name = self.name, intimacy = self.intimacy, }; BrocastComponent brocastComponent = unit.GetComponent(); brocastComponent?.Brocast(proto); } } public class PetDestroySystem: DestroySystem { public override void Destroy(Pet self) { self.petId = 0; self.exp = 0; self.intimacy = 0; self.actionEndTime = 0; self.isShow = false; self.petState = Pet.PetState.Idle; self.addToCharacter.Clear(); self.getAttributeFunc = null; } } public static class PetSystem { public static void Load(this Pet self) { self.getAttributeFunc += self.GetAttribute; self.Init(); } private static void Init(this Pet self) { } private static float GetAttribute(this Pet self, AttributeType attributeType) { float bound = 0f; foreach (KeyValuePair kv in self.addToCharacter) { if ((int) attributeType == kv.Key) bound += kv.Value; } return bound; } private static string AddLevel(this Pet self, int level) { self.level += level; PetConfig petConfig = PetConfigCategory.Instance.Get(self.petId); foreach (PetConfig.AddAttibuteMap addAttibuteMap in petConfig.AddAttibuteMapArr) { if (!self.addToCharacter.TryGetValue(addAttibuteMap.Key, out float old)) self.addToCharacter[addAttibuteMap.Key] = 0; self.addToCharacter[addAttibuteMap.Key] = old + addAttibuteMap.Value * level; } Log.Info($"宠物升级啦! level:{self.level} exp:{self.exp}"); CharacterHelper.SyncNumeric(self.GetParent()); return null; } public static string AddExp(this Pet self, int exp) { exp += self.exp; int addLevel = 0; while (exp > GetNeedExp(self.petId, self.level)) { exp -= GetNeedExp(self.petId, self.level); addLevel++; } self.exp = Math.Clamp(exp, 0, int.MaxValue); self.AddLevel(addLevel); Game.EventSystem.Change(self); return null; } private static int GetNeedExp(int petId, int level) { PetLevelConfig petLevelConfig = PetLevelConfigCategory.Instance.Get(petId); return petLevelConfig.Exp + petLevelConfig.ExpByLevel * level; } public static void AddIntimacy(this Pet self, int intimacy) { self.intimacy += intimacy; Game.EventSystem.Change(self); } public static void AddActive(this Pet self, int active) { PlayerData data = self.Parent.GetComponent(); data.petActive += active; } public static string ChangeName(this Pet self, string name) { if (!FilterCharHelper.IsInvalid(name)) { return "昵称不能超过7位,不能含有特殊字符"; } self.name = name; Log.Info($"宠物改名:{self.name}"); Game.EventSystem.Change(self); return null; } /// /// 探险 /// /// /// public static string Explore(this Pet self) { if (self.petState is not (Pet.PetState.Idle)) { return "行动中"; } PlayerData data = self.Parent.GetComponent(); if (data.petActive <= 0) return "活跃度不足"; const int index = (int) PetExploreConfigCategory.PetActionType.Explore; var configList = PetExploreConfigCategory.Instance.GetListByType((PetExploreConfigCategory.PetActionType) index); int petActionIndexFlag = IntFlagHelper.GetFlag(data.petActionIndexFlag, index - 1, 2); if (petActionIndexFlag >= configList.Count) return "次数达到上限"; PetExploreConfig config = configList[petActionIndexFlag]; self.actionEndTime = Game.TimeInfo.ClientNow() + config.Time; data.petActive--; self.petState = Pet.PetState.Explore; return null; } /// /// 嬉戏 /// /// /// public static string Play(this Pet self) { if (self.petState is not (Pet.PetState.Idle)) { return "行动中"; } PlayerData data = self.Parent.GetComponent(); if (data.petActive <= 0) return "活跃度不足"; const int index = (int) PetExploreConfigCategory.PetActionType.Play; var configList = PetExploreConfigCategory.Instance.GetListByType((PetExploreConfigCategory.PetActionType) index); int petActionIndexFlag = IntFlagHelper.GetFlag(data.petActionIndexFlag, index - 1, 2); if (petActionIndexFlag >= configList.Count) return "次数达到上限"; PetExploreConfig config = configList[petActionIndexFlag]; self.actionEndTime = Game.TimeInfo.ClientNow() + config.Time; data.petActive--; self.petState = Pet.PetState.Play; return null; } /// /// 锻炼 /// /// /// public static string Experience(this Pet self) { if (self.petState is not (Pet.PetState.Idle)) { return "行动中"; } PlayerData data = self.Parent.GetComponent(); if (data.petActive <= 0) return "活跃度不足"; const int index = (int) PetExploreConfigCategory.PetActionType.Experience; var configList = PetExploreConfigCategory.Instance.GetListByType((PetExploreConfigCategory.PetActionType) index); int petActionIndexFlag = IntFlagHelper.GetFlag(data.petActionIndexFlag, index - 1, 2); if (petActionIndexFlag >= configList.Count) return "次数达到上限"; PetExploreConfig config = configList[petActionIndexFlag]; self.actionEndTime = Game.TimeInfo.ClientNow() + config.Time; data.petActive--; self.petState = Pet.PetState.Experience; return null; } public static string GetActionReword(this Pet self, PetExploreConfigCategory.PetActionType type) { switch (type) { case PetExploreConfigCategory.PetActionType.None: break; case PetExploreConfigCategory.PetActionType.Explore: if (self.petState != Pet.PetState.Explore) return "宠物没有开始此玩法呢"; break; case PetExploreConfigCategory.PetActionType.Play: if (self.petState != Pet.PetState.Play) return "宠物没有开始此玩法呢"; break; case PetExploreConfigCategory.PetActionType.Experience: if (self.petState != Pet.PetState.Experience) return "宠物没有开始此玩法呢"; break; default: throw new ArgumentOutOfRangeException(nameof (type), type, null); } long now = TimeHelper.ClientNow(); if (now < self.actionEndTime) return "宠物忙碌中!"; Unit unit = self.GetParent(); PlayerData data = unit.GetComponent(); int index = (int) type; var configList = PetExploreConfigCategory.Instance.GetListByType((PetExploreConfigCategory.PetActionType) index); int petActionIndexFlag = IntFlagHelper.GetFlag(data.petActionIndexFlag, index - 1, 2); if (petActionIndexFlag >= configList.Count) return "系统错误,次数达到上限"; PetExploreConfig config = configList[petActionIndexFlag]; switch (type) { case PetExploreConfigCategory.PetActionType.None: break; case PetExploreConfigCategory.PetActionType.Explore: //给掉落 using (UnOrderMultiMapComponent rewordMapComponent = UnOrderMultiMapComponent.Create()) { int parentId= config.EndRewordArr.FirstOrDefault(t => t.PetId == self.petId).IncressValue; if (parentId == 0) return "系统错误"; DropHelper.Drop(unit, data, BattleType.None, parentId, rewordMapComponent.MultiMap, 1, "宠物探险", false); using ListComponent listComponent = ListComponent.Create(); foreach (KeyValuePair> kp in rewordMapComponent.MultiMap.GetDictionary()) { foreach ((int id, int count) in kp.Value) { listComponent.List.Add($"[color=#ffff00][/color]获得了[color=#226655]{BagHelper.GetName(id)}x{count}[/color]"); } } Chat.Instance.SendSystemCahtNoBrocast(unit, listComponent.List); } break; case PetExploreConfigCategory.PetActionType.Play: //给亲密度 self.AddIntimacy(config.EndRewordArr[0].IncressValue); break; case PetExploreConfigCategory.PetActionType.Experience: //给经验 self.AddExp(config.EndRewordArr[0].IncressValue); break; default: throw new ArgumentOutOfRangeException(nameof (type), type, null); } self.petState = Pet.PetState.Idle; petActionIndexFlag++; IntFlagHelper.SetFlagValue(ref data.petActionIndexFlag, index - 1, petActionIndexFlag, 2); return null; } } }