You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.8 KiB

namespace ET
{
[FriendClass(typeof(UnitCache))]
public class UnitCacheComponentAwakeSystem : AwakeSystem<UnitCacheComponent>
{
public override void Awake(UnitCacheComponent self)
{
self.UnitCacheKeyList.Clear();
foreach (var type in Game.EventSystem.GetTypes().Values)
{
if (type != typeof (IUnitCache) && typeof (IUnitCache).IsAssignableFrom(type))
{
self.UnitCacheKeyList.Add(type.Name);
}
}
foreach (var key in self.UnitCacheKeyList)
{
UnitCache unitCache = self.AddChild<UnitCache>();
unitCache.key = key;
self.UnitCaches.Add(key, unitCache);
}
}
}
public class UnitCacheComponentDestroySystem: DestroySystem<UnitCacheComponent>
{
public override void Destroy(UnitCacheComponent self)
{
foreach (var unitCache in self.UnitCaches.Values)
{
unitCache?.Dispose();
}
self.UnitCaches.Clear();
}
}
[FriendClass(typeof(UnitCacheComponent))]
[FriendClass(typeof(UnitCache))]
public static class UnitCacheComponentSystem
{
public static async ETTask AddOrUpdate(this UnitCacheComponent self, long unitId, ListComponent<Entity> entityList)
{
using (ListComponent<Entity> list = ListComponent<Entity>.Create())
{
foreach (var entity in entityList)
{
string key = entity.GetType().Name;
if (!self.UnitCaches.TryGetValue(key, out UnitCache unitCache))
{
unitCache = self.AddChild<UnitCache>();
unitCache.key = key;
self.UnitCaches.Add(key, unitCache);
}
unitCache.AddOrUpdate(entity);
list.Add(entity);
}
if (list.Count > 0)
{
await DBManagerComponent.Instance.GetZoneDB(self.DomainZone()).Save(unitId, list);
}
}
}
public static async ETTask<Entity> Get(this UnitCacheComponent self, long unitId, string key)
{
if (!self.UnitCaches.TryGetValue(key, out UnitCache unitCache))
{
unitCache = self.AddChild<UnitCache>();
unitCache.key = key;
self.UnitCaches.Add(key, unitCache);
}
return await unitCache.Get(unitId);
}
public static void Delete(this UnitCacheComponent self, long unitId)
{
foreach (var cache in self.UnitCaches.Values)
{
cache.Delete(unitId);
}
}
}
}