CTT/Server/Hotfix/Game/System/Bag/GoodsEffectComponentSystem.cs

185 lines
6.8 KiB
C#
Raw Normal View History

2021-04-08 20:09:59 +08:00
using Cal.DataTable;
using System;
using System.Collections.Generic;
namespace ET
{
public class GoodsEffectComponentAwakeystem : AwakeSystem<GoodsEffectComponent>
{
public override void Awake(GoodsEffectComponent self)
{
GoodsEffectComponent.Instance = self;
}
}
public class GoodsEffectComponentUpdateSystem : UpdateSystem<GoodsEffectComponent>
{
public override void Update(GoodsEffectComponent self)
{
self.Update();
}
}
public static class GoodsEffectComponentSystem
{
public static string AcquireGoodsEffect(this GoodsEffectComponent self, Unit unit, GoodsBase goodsBase, bool isLock)
{
try
{
var effect = (GoodsEffectType)goodsBase.EffectType;
Type tempType = self.GetEffectType(effect);
if (self._goodsEffectPoolDic.TryGetValue(tempType, out var buffBase))
{
if (buffBase.Count > 0)
{
var tempBuffBase = buffBase.Dequeue();
return tempBuffBase.Init(unit, goodsBase, isLock);
}
}
var temp = (GoodsEffect)Activator.CreateInstance(tempType);
return temp.Init(unit, goodsBase, isLock);
}
catch (Exception e)
{
Log.Error(e);
}
return string.Empty;
}
//!断线重连时调用
public static void ReAcquireGoodsEffect(this GoodsEffectComponent self, Unit unit, GoodsBase goodsBase, long endTime)
{
try
{
var effect = (GoodsEffectType)goodsBase.EffectType;
Type tempType = self.GetEffectType(effect);
if (self._goodsEffectPoolDic.TryGetValue(tempType, out var buffBase))
{
if (buffBase.Count > 0)
{
var tempBuffBase = buffBase.Dequeue();
tempBuffBase.ReInit(unit, goodsBase, endTime);
return;
}
}
var temp = (GoodsEffect)Activator.CreateInstance(tempType);
temp.ReInit(unit, goodsBase, endTime);
}
catch (Exception e)
{
Log.Error(e);
}
}
private static Type GetEffectType(this GoodsEffectComponent self, GoodsEffectType effectType) => effectType switch
{
GoodsEffectType.AddHpOrMp => typeof(AddHpOrMpGoodsEffect),
GoodsEffectType.AddHp => typeof(AddHpGoodsEffect),
GoodsEffectType.AddMp => typeof(AddMpGoodsEffect),
GoodsEffectType.AddGoods => typeof(AddGoodsEffect),
GoodsEffectType.AddEquipOrMaterialBySpecial => typeof(AddEquipOrMaterialBySpecialEffect),
GoodsEffectType.AddSpecialGoods => typeof(AddSpecialGoodsEffect),
GoodsEffectType.BackHome => typeof(BackHomeGoodsEffect),
GoodsEffectType.AddHpBuff => typeof(AddHpBuffGoodsEffect),
GoodsEffectType.AddMpBuff => typeof(AddMpBuffGoodsEffect),
GoodsEffectType.AddBattleExpSpeed => typeof(AddBattleExpSpeedGoodsEffect),
GoodsEffectType.AddIdleExpSpeed => typeof(AddIdleExpSpeedGoodsEffect),
GoodsEffectType.ChatHorn => throw new NotImplementedException(),
GoodsEffectType.AddPetExp => throw new NotImplementedException(),
GoodsEffectType.AddPetExpSpeed => throw new NotImplementedException(),
GoodsEffectType.AddPetIntimacy => throw new NotImplementedException(),
GoodsEffectType.LearnSkill => typeof(LearnSkillGoodsEffect),
GoodsEffectType.AddEnergy => typeof(AddEnergyGoodsEffect),
GoodsEffectType.AddMainAITime => typeof(AddMainAITimeGoodsEffect),
GoodsEffectType.AddMainVIPAITime => typeof(AddMainVIPAITimeGoodsEffect),
_ => throw new Exception("Goods 类型名错误,检查表格"),
};
public static void AddGoodsBuff(this GoodsEffectComponent self, long id, GoodsEffectType type, GoodsEffect goodsEffect)
{
try
{
if (!self._goodsEffectBuffDic.TryGetValue(id, out var dic))
{
dic = self._goodsEffectBuffDic[id] = new Dictionary<int, GoodsEffect>();
}
dic[(int)type] = goodsEffect;
}
catch (Exception e)
{
Log.Error(e);
}
}
public static GoodsEffect GetGoodsBuffType(this GoodsEffectComponent self, long id, GoodsEffectType type)
{
try
{
if (self._goodsEffectBuffDic.TryGetValue(id, out var dic))
{
if (dic.TryGetValue((int)type, out var goodsEffect))
{
return goodsEffect;
}
}
}
catch (Exception e)
{
Log.Error(e);
}
return null;
}
public static IEnumerable<GoodsEffect> GetAllEffect(this GoodsEffectComponent self, long id)
{
if (self._goodsEffectBuffDic.TryGetValue(id, out var dic))
{
return dic.Values;
}
return null;
}
private static List<ValueTuple<long, int>> _needRemoveList = new List<ValueTuple<long, int>>();
internal static void Update(this GoodsEffectComponent self)
{
try
{
foreach (var kv in self._goodsEffectBuffDic)
{
var dic = kv.Value;
foreach (var _kv in dic)
{
var effect = _kv.Value;
if (effect.BuffState == BuffState.Running)
{
effect.Execute();
}
else if (effect.BuffState == BuffState.Finished)
{
_needRemoveList.Add((kv.Key, _kv.Key));
}
}
}
if (_needRemoveList.Count != 0)
{
foreach (var id_type in _needRemoveList)
{
self._goodsEffectBuffDic[id_type.Item1].Remove(id_type.Item2);
if (self._goodsEffectBuffDic[id_type.Item1].Count == 0)
{
self._goodsEffectBuffDic.Remove(id_type.Item1);
}
}
_needRemoveList.Clear();
}
}
catch (Exception e)
{
Log.Error(e);
}
}
}
}