using System;
namespace ET
{
public static class UnitCacheHelper
{
///
/// 保存或更新玩家缓存
///
///
///
public static async ETTask AddOrUpdateUnitCache(this T self) where T : Entity, IUnitCache
{
Other2UnitCache_AddOrUpdateUnit message = new Other2UnitCache_AddOrUpdateUnit() { UnitId = self.Id };
message.EntityTypes.Add(typeof(T).FullName);
message.EntityBytes.Add(MongoHelper.ToBson(self));
await MessageHelper.CallActor(StartSceneConfigCategory.Instance.GetUnitCacheConfig(self.Id).InstanceId, message);
}
public static async ETTask GetUnitCache(Scene scene, long unitId)
{
long instanceId = StartSceneConfigCategory.Instance.GetUnitCacheConfig(unitId).InstanceId;
Other2UnitCache_GetUnit message = new Other2UnitCache_GetUnit() { UnitId = unitId };
UnitCache2Other_GetUnit queryUnit = (UnitCache2Other_GetUnit) await MessageHelper.CallActor(instanceId, message);
if (queryUnit.Error != ErrorCode.ERR_Success || queryUnit.EntityList.Count <= 0)
{
return null;
}
int index = queryUnit.ComponentNameList.IndexOf(nameof (Unit));
Unit unit = queryUnit.EntityList[index] as Unit;
if (unit == null)
{
return null;
}
scene.AddChild(unit);
foreach (var entity in queryUnit.EntityList)
{
if (entity == null || entity is Unit)
{
continue;
}
unit.AddComponent(entity);
}
return unit;
}
///
/// 获取玩家组件缓存
///
///
///
///
public static async ETTask GetUnitComponentCache(long unitId) where T : Entity, IUnitCache
{
Other2UnitCache_GetUnit message = new Other2UnitCache_GetUnit() { UnitId = unitId };
message.ComponentNameList.Add(typeof(T).Name);
long instanceId = StartSceneConfigCategory.Instance.GetUnitCacheConfig(unitId).InstanceId;
UnitCache2Other_GetUnit queryUnit = (UnitCache2Other_GetUnit) await MessageHelper.CallActor(instanceId, message);
if (queryUnit.Error == ErrorCode.ERR_Success && queryUnit.EntityList.Count > 0)
{
return queryUnit.EntityList[0] as T;
}
return null;
}
///
/// 删除玩家缓存
///
///
public static async ETTask DeleteUnitCache(long unitId)
{
Other2UnitCache_DeleteUnit message = new Other2UnitCache_DeleteUnit() { UnitId = unitId };
long instanceId = StartSceneConfigCategory.Instance.GetUnitCacheConfig(unitId).InstanceId;
await MessageHelper.CallActor(instanceId, message);
}
public static void AddOrUpdateUnitAllCache(Unit unit)
{
Other2UnitCache_AddOrUpdateUnit message = new Other2UnitCache_AddOrUpdateUnit() { UnitId = unit.Id };
message.EntityTypes.Add(unit.GetType().FullName);
message.EntityBytes.Add(MongoHelper.ToBson(unit));
foreach ((Type key, Entity entity) in unit.Components)
{
if (!typeof (IUnitCache).IsAssignableFrom(key))
{
continue;
}
message.EntityTypes.Add(key.FullName);
message.EntityBytes.Add(MongoHelper.ToBson(entity));
}
MessageHelper.CallActor(StartSceneConfigCategory.Instance.GetUnitCacheConfig(unit.Id).InstanceId, message).Coroutine();
}
}
}