using Cal; using Cal.DataTable; using System; using System.Collections.Generic; namespace ET { public class PetAwakeSystem : AwakeSystem { public override void Awake(Pet self) { self.level = 1; self.name = "宠物"; 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) { var 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.isShow = false; self.addToCharacter.Clear(); self.getAttributeFunc = null; } } public static class PetSystem { public static void Load(this Pet self) { self.getAttributeFunc += self.GetAttribute; self.Init(); } public static void Init(this Pet self) { int key = (int)AttributeType.力量; if (!self.addToCharacter.ContainsKey(key)) self.addToCharacter[key] = 0; key = (int)AttributeType.敏捷; if (!self.addToCharacter.ContainsKey(key)) self.addToCharacter[key] = 0; key = (int)AttributeType.精神; if (!self.addToCharacter.ContainsKey(key)) self.addToCharacter[key] = 0; key = (int)AttributeType.智慧; if (!self.addToCharacter.ContainsKey(key)) self.addToCharacter[key] = 0; key = (int)AttributeType.体质; if (!self.addToCharacter.ContainsKey(key)) self.addToCharacter[key] = 0; key = (int)AttributeType.耐力; if (!self.addToCharacter.ContainsKey(key)) self.addToCharacter[key] = 0; } public static float GetAttribute(this Pet self, AttributeType attributeType) { float bound = 0f; foreach (var kv in self.addToCharacter) { if ((int)attributeType == kv.Key) bound += kv.Value; } return bound; } public static string AddLevel(this Pet self, int level) { self.level += level; using var listComponent = ListComponent.Create(); listComponent.List.AddRange(self.addToCharacter.Keys); foreach (var key in listComponent.List) { self.addToCharacter[key] += 10 * 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; int stage = GetStage(self.level); while (exp > GetNeedExp(stage, self.level)) { stage = GetStage(self.level + addLevel); exp -= GetNeedExp(stage, 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 stage, int level) { PetLevelConfig petLevelConfig = PetLevelConfigCategory.Instance.Get(stage); return petLevelConfig.Exp + petLevelConfig.ExpByLevel * level; } private static int GetStage(int level) { var arr = new int[] { 0, 50, 100, 200, 500, 1000 }; for (int i = 0; i < arr.Length; i++) { var item = arr[i]; if (level <= item) { return i; } } return arr.Length - 1; } 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; } } }