private BuffInstanceInfo NewBuffInstance(int buffId) { BuffInstanceInfo instanceInfo = GetUnusedBuffInstanceInfoFromPool(buffId); if (null == instanceInfo) { BuffConfig config = BuffConfigProvider.Instance.GetBuffConfig(buffId); if (null != config) { ConfigManager.Instance.LoadIfNotExist(buffId, 2, HomePath.Instance.GetAbsolutePath(config.Script)); } IInstance instance = ConfigManager.Instance.NewInstance(buffId, 2); if (null == instance) { LogUtil.Error("ImpactSystem.NewImpactInstance : Can't load impact config, impact:{0}.", buffId); } BuffInstanceInfo res = new BuffInstanceInfo { BuffId = buffId, BuffInstance = instance, IsUsed = true }; AddImpactInstanceInfoToPool(buffId, res); return(res); } else { instanceInfo.IsUsed = true; return(instanceInfo); } }
private void AddImpactInstanceInfoToPool(int buffId, BuffInstanceInfo info) { if (m_BuffInstancePool.TryGetValue(buffId, out List <BuffInstanceInfo> infos)) { infos.Add(info); } else { infos = new List <BuffInstanceInfo>(); infos.Add(info); m_BuffInstancePool.Add(buffId, infos); } }
private BuffInstanceInfo GetUnusedBuffInstanceInfoFromPool(int buffId) { BuffInstanceInfo info = null; if (m_BuffInstancePool.TryGetValue(buffId, out List <BuffInstanceInfo> infos)) { foreach (var buffInfo in infos) { if (!buffInfo.IsUsed) { info = buffInfo; break; } } } return(info); }
public void Execute() { long time = (long)(m_Contexts.input.time.Value * 1000); foreach (GameEntity entity in m_ImpactEntities) { BuffComponent buffComponent = entity.buff; foreach (var pair in buffComponent.InstanceInfos) { int buffId = pair.Key; var infos = pair.Value; for (int i = infos.Count - 1; i >= 0; i--) { var info = infos[i]; info.BuffInstance.Tick(time); if (info.BuffInstance.IsTerminated) { RecycleImpactInstance(info); entity.isBuffAttrChanged = true; infos.Remove(info); } } } foreach (var startParam in buffComponent.StartParams) { //SkillSystem.Instance.BreakSkill(entity); BuffConfig buffConfig = BuffConfigProvider.Instance.GetBuffConfig(startParam.Id); if (null != buffConfig) { int maxCount = buffConfig.MaxCount; if (!buffComponent.InstanceInfos.TryGetValue(startParam.Id, out List <BuffInstanceInfo> infos)) { infos = new List <BuffInstanceInfo>(); buffComponent.InstanceInfos.Add(startParam.Id, infos); } if (maxCount == 0 && infos.Count > 0) { continue; } else if (maxCount > 0 && infos.Count >= maxCount) { for (int i = 0; i < infos.Count - maxCount + 1; ++i) { if (!infos[i].BuffInstance.IsTerminated) { infos[i].BuffInstance.SendMessage("onbreak"); infos[i].BuffInstance.IsTerminated = true; } } } BuffInstanceInfo instance = NewBuffInstance(startParam.Id); if (null != instance) { instance.BuffInstance.SenderId = startParam.SenderId; instance.BuffInstance.SenderPosition = startParam.SenderPosition; instance.BuffInstance.SenderDirection = startParam.SenderDirection; instance.BuffInstance.Target = entity; instance.BuffInstance.Context = Contexts.sharedInstance.game; instance.BuffInstance.AddVariable("@@id", entity.id.value); instance.BuffInstance.GlobalVariables = m_GlobalVariables; instance.BuffInstance.Start(); infos.Add(instance); entity.isBuffAttrChanged = true; } } } buffComponent.StartParams.Clear(); } }
private void RecycleImpactInstance(BuffInstanceInfo info) { info.BuffInstance.Reset(); info.IsUsed = false; }