//用于上层逻辑检查通过后调用 public void StartSkill(int actorId, int skillId, float facedir) { GameObject obj = LogicSystem.GetGameObject(actorId); if (null != obj) { SkillLogicInfo logicInfo = m_SkillLogicInfos.Find(info => info.Sender == obj && info.SkillId == skillId); if (logicInfo != null) { return; } ChangeDir(obj, facedir); SkillInstanceInfo inst = NewSkillInstance(skillId); if (null != inst) { m_SkillLogicInfos.Add(new SkillLogicInfo(obj, inst)); } else { LogicSystem.NotifyGfxStopSkill(obj, skillId); return; } logicInfo = m_SkillLogicInfos.Find(info => info.Sender == obj && info.SkillId == skillId); if (null != logicInfo) { if (OnGfxShillStart != null) { OnGfxShillStart(obj, skillId); } LogicSystem.NotifyGfxAnimationStart(obj, true); logicInfo.SkillInst.Start(logicInfo.Sender); } } }
public SkillInstance Analyze(int skillId) { SkillInstanceInfo inst = NewSkillInstance(skillId); if (null != inst) { inst.m_SkillInstance.Analyze(null); List <int> impacts = new List <int>(); List <string> resources = new List <string>(); for (int i = 0; i < inst.m_SkillInstance.SummonNpcSkills.Count; i++) { AnalyzeNpcSkills(inst.m_SkillInstance.SummonNpcSkills[i], ref impacts, ref resources); } /* * foreach (int skill in inst.m_SkillInstance.SummonNpcSkills) { * AnalyzeNpcSkills(skill, ref impacts, ref resources); * }*/ inst.m_SkillInstance.EnableImpactsToOther.AddRange(impacts); inst.m_SkillInstance.Resources.AddRange(resources); return(inst.m_SkillInstance); } else { return(null); } }
public void PreloadSkillInstance(TableConfig.Skill skillData) { if (null != skillData) { SkillInstanceInfo info = NewSkillInstanceImpl(skillData.id, skillData); if (null != info) { RecycleSkillInstance(info); if (null != info.m_SkillInstance.EmitSkillInstances) { foreach (var pair in info.m_SkillInstance.EmitSkillInstances) { SkillInstanceInfo iinfo = NewInnerSkillInstanceImpl(PredefinedSkill.c_EmitSkillId, pair.Value); RecycleSkillInstance(iinfo); } } if (null != info.m_SkillInstance.HitSkillInstances) { foreach (var pair in info.m_SkillInstance.HitSkillInstances) { SkillInstanceInfo iinfo = NewInnerSkillInstanceImpl(PredefinedSkill.c_HitSkillId, pair.Value); RecycleSkillInstance(iinfo); } } } } }
public void PreloadSkillInstance(int skillId) { SkillInstanceInfo info = NewSkillInstance(skillId); if (null != info) { RecycleSkillInstance(info); } }
public void Execute() { long time = (long)(m_Contexts.input.time.Value * 1000); var entities = m_SkillEntities.GetEntities(); foreach (GameEntity entity in entities) { SkillComponent skillComponent = entity.skill; SkillInstanceInfo info = skillComponent.Instance; if (null != info) { info.SkillInstance.Tick(time); if (info.SkillInstance.IsTerminated) { RecycleSkillInstance(info); skillComponent.Instance = null; entity.ReplaceLastSkill(info.SkillId, info.Category, time); } } if (null != skillComponent.StartParam) { if (skillComponent.Instance == null) { SkillInstanceInfo instance = NewSkillInstance(skillComponent.StartParam.Id); if (null != instance && null != instance.SkillInstance) { instance.Category = skillComponent.StartParam.Category; instance.SkillInstance.SenderId = skillComponent.StartParam.SenderId; instance.SkillInstance.Target = entity; instance.SkillInstance.SenderPosition = skillComponent.StartParam.SenderPosition;; instance.SkillInstance.SenderDirection = skillComponent.StartParam.SenderDirection; instance.SkillInstance.Context = Contexts.sharedInstance.game; instance.SkillInstance.AddVariable("@@id", entity.id.value); instance.SkillInstance.GlobalVariables = m_GlobalVariables; instance.SkillInstance.Start(); entity.ReplaceSkill(instance, null); } else { entity.ReplaceSkill(null, null); } } else { skillComponent.StartParam = null; } } } }
private void AddStoryInstanceInfoToPool(int skillId, SkillInstanceInfo info) { if (m_SkillInstancePool.TryGetValue(skillId, out List <SkillInstanceInfo> infos)) { infos.Add(info); } else { infos = new List <SkillInstanceInfo> { info }; m_SkillInstancePool.Add(skillId, infos); } }
private void AddSkillInstanceInfoToPool(int skillId, SkillInstanceInfo info) { if (m_SkillInstancePool.ContainsKey(skillId)) { List <SkillInstanceInfo> infos = m_SkillInstancePool[skillId]; infos.Add(info); } else { List <SkillInstanceInfo> infos = new List <SkillInstanceInfo>(); infos.Add(info); m_SkillInstancePool.Add(skillId, infos); } }
private void AnalyzeNpcSkills(int skillId, ref List <int> impacts, ref List <string> resources) { SkillInstanceInfo instance = NewSkillInstance(skillId); if (null != instance) { instance.m_SkillInstance.Analyze(null); impacts.AddRange(instance.m_SkillInstance.EnableImpactsToOther); resources.AddRange(instance.m_SkillInstance.Resources); foreach (int npcSkillId in instance.m_SkillInstance.SummonNpcSkills) { AnalyzeNpcSkills(npcSkillId, ref impacts, ref resources); } RecycleSkillInstance(instance); } }
private SkillInstanceInfo GetUnusedSkillInstanceInfoFromPool(int skillId) { SkillInstanceInfo info = null; if (m_SkillInstancePool.TryGetValue(skillId, out List <SkillInstanceInfo> infos)) { foreach (var skillInfo in infos) { if (!skillInfo.IsUsed) { info = skillInfo; break; } } } return(info); }
private SkillInstanceInfo NewSkillInstance(int skillId) { SkillInstanceInfo instanceInfo = GetUnusedSkillInstanceInfoFromPool(skillId); if (null == instanceInfo) { //do load if (!SkillScriptsManager.Instance.LoadIfNotExits(skillId, 0)) { SkillConfig config = SkillConfigProvider.Instance.GetSkillConfig(skillId); if (null != config) { ConfigManager.Instance.LoadIfNotExist(skillId, 0, HomePath.Instance.GetAbsolutePath(config.Script)); } } IInstance instance = ConfigManager.Instance.NewInstance(skillId, 0); if (null == instance) { LogUtil.Error("Can't load skill config, skill:{0}!", skillId); } if (instance is CSharpInstance cshapInstance) { cshapInstance.Init(); instance = cshapInstance.Clone(); } SkillInstanceInfo res = new SkillInstanceInfo { SkillId = skillId, SkillInstance = instance, BreakSections = new List <BreakSection>(), IsUsed = true }; AddStoryInstanceInfoToPool(skillId, res); return(res); } else { instanceInfo.IsUsed = true; return(instanceInfo); } }
private SkillInstanceInfo GetUnusedSkillInstanceInfoFromPool(int skillId) { SkillInstanceInfo info = null; List <SkillInstanceInfo> infos; if (m_SkillInstancePool.TryGetValue(skillId, out infos)) { int ct = infos.Count; for (int ix = 0; ix < ct; ++ix) { if (!infos[ix].m_IsUsed) { info = infos[ix]; break; } } } return(info); }
private SkillInstanceInfo GetUnusedSkillInstanceInfoFromPool(int skillId) { SkillInstanceInfo info = null; if (m_SkillInstancePool.ContainsKey(skillId)) { List <SkillInstanceInfo> infos = m_SkillInstancePool[skillId]; int ct = infos.Count; for (int ix = 0; ix < ct; ++ix) { if (!infos[ix].m_IsUsed) { info = infos[ix]; break; } } } return(info); }
private void PreloadNewSkillInstance(int skillId) { SkillLogicData skillData = SkillConfigProvider.Instance.ExtractData(SkillConfigType.SCT_SKILL, skillId) as SkillLogicData; if (null != skillData) { string filePath = HomePath.GetAbsolutePath(FilePathDefine_Client.C_SkillDslPath + skillData.SkillDataFile); SkillConfigManager.Instance.LoadSkillIfNotExist(skillId, filePath); SkillInstance inst = SkillConfigManager.Instance.NewSkillInstance(skillId); if (inst != null) { SkillInstanceInfo res = new SkillInstanceInfo(); res.m_SkillId = skillId; res.m_SkillInstance = inst; res.m_IsUsed = true; AddSkillInstanceInfoToPool(skillId, res); RecycleSkillInstance(res); } } }
private SkillInstanceInfo NewInnerSkillInstance(int skillId, SkillInstance innerInstance) { int newSkillId = CalcUniqueInnerSkillId(skillId, innerInstance); if (newSkillId <= 0) { return(null); } SkillInstanceInfo instInfo = GetUnusedSkillInstanceInfoFromPool(newSkillId); if (null == instInfo) { return(NewInnerSkillInstanceImpl(skillId, innerInstance)); } else { instInfo.m_IsUsed = true; return(instInfo); } }
private SkillInstanceInfo NewSkillInstance(int skillId) { SkillInstanceInfo instInfo = GetUnusedSkillInstanceInfoFromPool(skillId); if (null == instInfo) { SkillLogicData skillData = SkillConfigProvider.Instance.ExtractData(SkillConfigType.SCT_SKILL, skillId) as SkillLogicData; if (null != skillData) { string filePath = HomePath.GetAbsolutePath(FilePathDefine_Server.C_SkillDslPath + skillData.SkillDataFile); SkillConfigManager.Instance.LoadSkillIfNotExist(skillId, filePath); SkillInstance inst = SkillConfigManager.Instance.NewSkillInstance(skillId); if (null != inst) { SkillInstanceInfo res = new SkillInstanceInfo(); res.m_SkillId = skillId; res.m_SkillInstance = inst; res.m_IsUsed = true; AddSkillInstanceInfoToPool(skillId, res); return(res); } else { LogSystem.Error("Can't find skill dsl or skill dsl error, skill:{0} !", skillId); return(null); } } else { LogSystem.Error("Can't find skill config, skill:{0} !", skillId); return(null); } } else { instInfo.m_IsUsed = true; return(instInfo); } }
private SkillInstanceInfo NewInnerSkillInstanceImpl(int skillId, SkillInstance innerInstance) { int newSkillId = CalcUniqueInnerSkillId(skillId, innerInstance); if (newSkillId <= 0) { return(null); } SkillInstance newInst = innerInstance.Clone(); newInst.DslSkillId = skillId; SkillInstanceInfo res = new SkillInstanceInfo(); res.m_SkillId = skillId; res.m_SkillInstance = newInst; res.m_IsUsed = true; AddSkillInstanceInfoToPool(newSkillId, res); return(res); }
private SkillInstanceInfo NewSkillInstanceImpl(int skillId, TableConfig.Skill skillData) { string filePath = GameFramework.HomePath.GetAbsolutePath(FilePathDefine_Client.C_DslPath + skillData.dslFile); SkillConfigManager.Instance.LoadSkillIfNotExist(skillData.id, filePath); SkillInstance inst = SkillConfigManager.Instance.NewSkillInstance(skillData.id); if (inst == null) { GameFramework.LogSystem.Error("Can't load skill config, skill:{0} !", skillId); return(null); } SkillInstanceInfo res = new SkillInstanceInfo(); res.m_SkillId = skillId; res.m_SkillInstance = inst; res.m_IsUsed = true; AddSkillInstanceInfoToPool(skillId, res); return(res); }
private SkillInstanceInfo NewSkillInstance(int skillId, TableConfig.Skill skillData) { SkillInstanceInfo instInfo = GetUnusedSkillInstanceInfoFromPool(skillId); if (null == instInfo) { if (null != skillData) { return(NewSkillInstanceImpl(skillId, skillData)); } else { GameFramework.LogSystem.Error("Can't find skill config, skill:{0} TableConfig.Skill is null!", skillId); return(null); } } else { instInfo.m_IsUsed = true; return(instInfo); } }
private List <int> AnalyzeNpcSkills(int skillId, SkillInstance owner) { List <int> impacts = new List <int>(); SkillInstanceInfo instance = NewSkillInstance(skillId); if (null != instance) { instance.m_SkillInstance.Analyze(null); impacts.AddRange(instance.m_SkillInstance.EnableImpactsToOther); if (instance.m_SkillInstance.IsSimulate) { owner.IsSimulate = true; owner.MaxSkillLifeTime = instance.m_SkillInstance.MaxSkillLifeTime; } foreach (int npcSkillId in instance.m_SkillInstance.SummonNpcSkills) { List <int> npcImpacts = AnalyzeNpcSkills(npcSkillId, owner); impacts.AddRange(npcImpacts); } RecycleSkillInstance(instance); } return(impacts); }
private void RecycleSkillInstance(SkillInstanceInfo info) { info.SkillInstance.Reset(); info.BreakSections.Clear(); info.IsUsed = false; }
private SkillInstanceInfo NewInnerSkillInstanceImpl(int skillId, SkillInstance innerInstance) { int newSkillId = CalcUniqueInnerSkillId(skillId, innerInstance); if (newSkillId <= 0) return null; SkillInstance newInst = innerInstance.Clone(); newInst.DslSkillId = skillId; SkillInstanceInfo res = new SkillInstanceInfo(); res.m_SkillId = skillId; res.m_SkillInstance = newInst; res.m_IsUsed = true; AddSkillInstanceInfoToPool(newSkillId, res); return res; }
private void AddSkillInstanceInfoToPool(int skillId, SkillInstanceInfo info) { if (m_SkillInstancePool.ContainsKey(skillId)) { List<SkillInstanceInfo> infos = m_SkillInstancePool[skillId]; infos.Add(info); } else { List<SkillInstanceInfo> infos = new List<SkillInstanceInfo>(); infos.Add(info); m_SkillInstancePool.Add(skillId, infos); } }
private SkillInstanceInfo NewSkillInstance(int skillId) { SkillInstanceInfo instInfo = GetUnusedSkillInstanceInfoFromPool(skillId); if (null == instInfo) { string filePath = GetSkillFilePath(skillId); if (string.IsNullOrEmpty(filePath)) { SkillConfigManager.Instance.LoadSkillIfNotExist(skillId, filePath); SkillInstance inst = SkillConfigManager.Instance.NewSkillInstance(skillId); if (inst == null) { Logger.Error("Can't load skill config, skill:{0} !", skillId); return null; } SkillInstanceInfo res = new SkillInstanceInfo(); res.m_SkillId = skillId; res.m_SkillInstance = inst; res.m_IsUsed = true; AddSkillInstanceInfoToPool(skillId, res); return res; } else { Logger.Error("Can't find skill config, skill:{0} !", skillId); return null; } } else { instInfo.m_IsUsed = true; return instInfo; } }
internal void StartSkill(int objId, int skillId) { CharacterInfo obj = CurScene.SceneContext.GetCharacterInfoById(objId); if (null != obj) { SkillInstanceInfo inst = NewSkillInstance(skillId); if (null != inst) { obj.GetSkillStateInfo().SetCurSkillInfo(skillId); SkillInfo skillInfo = obj.GetSkillStateInfo().GetCurSkillInfo(); if (null != skillInfo) { if (MakeSkillCast(obj, skillInfo)) { ArkCrossEngineMessage.Msg_RC_SyncProperty propBuilder = DataSyncUtility.BuildSyncPropertyMessage(obj); Scene scene = obj.SceneContext.CustomData as Scene; if (null != scene) { scene.NotifyAllUser(propBuilder); } } else { skillInfo.m_EnableImpactsToMyself = null; skillInfo.m_EnableImpactsToOther = null; skillInfo.m_LeftEnableMoveCount = 0; skillInfo.m_LeftEnableImpactsToMyself.Clear(); skillInfo.m_LeftEnableImpactsToOther.Clear(); return; } skillInfo.IsSkillActivated = true; m_SkillLogicInfos.Add(new SkillLogicInfo(objId, inst)); SkillLogicInfo logicInfo = m_SkillLogicInfos.Find(info => info.SenderId == objId && info.SkillId == skillId); if (null != logicInfo) { //目前没有与技能释放者相关的分析属性,对每个技能暂时只需要分析一次 if (null == skillInfo.m_EnableImpactsToMyself || null == skillInfo.m_EnableImpactsToOther) { if (!logicInfo.SkillInst.AlreadyAnalyzed) { logicInfo.SkillInst.Analyze(obj); foreach (int skill in logicInfo.SkillInst.SummonNpcSkills) { List <int> impacts = AnalyzeNpcSkills(skill, logicInfo.SkillInst); logicInfo.SkillInst.EnableImpactsToOther.AddRange(impacts); } } skillInfo.m_EnableMoveCount = logicInfo.SkillInst.EnableMoveCount; skillInfo.m_MaxMoveDistance = logicInfo.SkillInst.MaxMoveDelta; skillInfo.m_EnableImpactsToOther = logicInfo.SkillInst.EnableImpactsToOther; skillInfo.m_EnableImpactsToMyself = logicInfo.SkillInst.EnableImpactsToMyself; skillInfo.m_EnableSummonNpcs = logicInfo.SkillInst.SummonNpcs; /* * LogSys.Log(LOG_TYPE.WARN, "Skill {0} EnableMoveCount {1} MaxMoveDistanceSqr {2}\n\tEnableImpactsToOther {3}\n\tEnableImpactsToMyself {4}\n\tSummonNpcSkills {5}", skillId, skillInfo.m_EnableMoveCount, skillInfo.m_MaxMoveDistanceSqr, * string.Join<int>(",", skillInfo.m_EnableImpactsToOther), * string.Join<int>(",", skillInfo.m_EnableImpactsToMyself), * string.Join<int>(",", logicInfo.SkillInst.SummonNpcSkills)); */ } skillInfo.m_LeftEnableMoveCount = skillInfo.m_EnableMoveCount; skillInfo.m_LeftEnableImpactsToMyself.AddRange(skillInfo.m_EnableImpactsToMyself); skillInfo.m_LeftEnableImpactsToOther.Clear(); if (logicInfo.SkillInst.IsSimulate) { obj.GetSkillStateInfo().SimulateEndTime = TimeUtility.GetServerMilliseconds() + logicInfo.SkillInst.MaxSkillLifeTime; } logicInfo.SkillInst.Start(obj); /* * DashFire.LogSystem.Warn("StartSkill {0} {1} EnableMoveCount {2} MaxMoveDistance {3}\n\tEnableImpactsToOther {4}\n\tEnableImpactsToMyself {5}\n\tSummonNpcSkills {6}", objId, skillId, skillInfo.m_LeftEnableMoveCount, skillInfo.m_MaxMoveDistanceSqr, * string.Join<int>(",", skillInfo.m_EnableImpactsToOther), * string.Join<int>(",", skillInfo.m_EnableImpactsToMyself), * string.Join<int>(",", logicInfo.SkillInst.SummonNpcSkills)); */ } } else { LogSystem.Error("{0} StartSkill can't find skill {1}", objId, skillId); } } } else { LogSystem.Debug("not find game obj by id " + objId); } }
public bool StartSkill(int actorId, TableConfig.Skill configData, int seq, params Dictionary <string, object>[] locals) { bool ret = false; if (null == configData) { LogSystem.Error("{0} can't cast skill, config is null !", actorId, seq); Helper.LogCallStack(); return(false); } if (!EntityController.Instance.CanCastSkill(actorId, configData, seq)) { EntityController.Instance.CancelCastSkill(actorId); LogSystem.Warn("{0} can't cast skill {1} {2}, cancel.", actorId, configData.id, seq); EntityController.Instance.CancelIfImpact(actorId, configData, seq); return(false); } GfxSkillSenderInfo senderInfo = EntityController.Instance.BuildSkillInfo(actorId, configData, seq); if (null != senderInfo && null != senderInfo.GfxObj) { int skillId = senderInfo.SkillId; GameObject obj = senderInfo.GfxObj; SkillLogicInfo logicInfo = m_SkillLogicInfos.Find(info => info.GfxObj == obj && info.SkillId == skillId && info.Seq == seq); if (logicInfo != null) { LogSystem.Warn("{0} is casting skill {1} {2}, cancel.", actorId, skillId, seq); EntityController.Instance.CancelIfImpact(actorId, configData, seq); return(false); } SkillInstanceInfo inst = null; SkillInstance innerInstance = null; if (skillId == PredefinedSkill.c_EmitSkillId) { for (int i = 0; i < locals.Length; ++i) { object instObj; if (locals[i].TryGetValue("emitskill", out instObj)) { innerInstance = instObj as SkillInstance; } } if (null == innerInstance) { LogSystem.Warn("{0} use predefined skill {1} {2} but not found emitskill, cancel.", actorId, skillId, seq); //EntityController.Instance.CancelIfImpact(actorId, configData, seq); //return false; } } else if (skillId == PredefinedSkill.c_HitSkillId) { for (int i = 0; i < locals.Length; ++i) { object instObj; if (locals[i].TryGetValue("hitskill", out instObj)) { innerInstance = instObj as SkillInstance; } } if (null == innerInstance) { LogSystem.Warn("{0} use predefined skill {1} {2} but not found hitskill, cancel.", actorId, skillId, seq); //EntityController.Instance.CancelIfImpact(actorId, configData, seq); //return false; } } if (null == innerInstance) { inst = NewSkillInstance(skillId, senderInfo.ConfigData); } else { inst = NewInnerSkillInstance(skillId, innerInstance); } if (null != inst) { m_SkillLogicInfos.Add(new SkillLogicInfo(senderInfo, inst)); } else { LogSystem.Warn("{0} cast skill {1} {2}, alloc failed.", actorId, skillId, seq); EntityController.Instance.CancelIfImpact(actorId, configData, seq); return(false); } logicInfo = m_SkillLogicInfos.Find(info => info.GfxObj == obj && info.SkillId == skillId && info.Seq == seq); if (null != logicInfo) { if (null != locals) { int localCount = locals.Length; for (int i = 0; i < localCount; ++i) { foreach (KeyValuePair <string, object> pair in locals[i]) { logicInfo.SkillInst.SetVariable(pair.Key, pair.Value); } } } GameObject target = senderInfo.TargetGfxObj; if (null != target && target != obj && configData.type == (int)SkillOrImpactType.Skill) { Trigers.TriggerUtil.Lookat(obj, target.transform.position); } EntityController.Instance.ActivateSkill(actorId, skillId, seq); logicInfo.SkillInst.Start(logicInfo.Sender); ret = true; } } return(ret); }
private void RecycleSkillInstance(SkillInstanceInfo info) { info.m_SkillInstance.Reset(); info.m_IsUsed = false; }
public SkillLogicInfo(GfxSkillSenderInfo sender, SkillInstanceInfo info) { m_Sender = sender; m_SkillInfo = info; }
internal SkillLogicInfo(GfxSkillSenderInfo sender, SkillInstanceInfo info) { m_Sender = sender; m_SkillInfo = info; }
public SkillLogicInfo(GameObject obj, SkillInstanceInfo info) { m_Sender = obj; m_SkillInfo = info; }
private void RecycleSkillInstance(SkillInstanceInfo info) { info.Recycle(); }
private SkillInstanceInfo NewSkillInstanceImpl(int skillId, TableConfig.Skill skillData) { string filePath = GameFramework.HomePath.GetAbsolutePath(FilePathDefine_Server.C_DslPath + skillData.dslFile); SkillConfigManager.Instance.LoadSkillIfNotExist(skillData.dslSkillId, filePath); SkillInstance inst = SkillConfigManager.Instance.NewSkillInstance(skillData.dslSkillId); if (inst == null) { GameFramework.LogSystem.Error("Can't load skill config, skill:{0} dsl skill:{1}!", skillId, skillData.dslSkillId); return null; } SkillInstanceInfo res = new SkillInstanceInfo(); res.m_SkillId = skillId; res.m_SkillInstance = inst; res.m_IsUsed = true; AddSkillInstanceInfoToPool(skillId, res); return res; }
internal SkillLogicInfo(int objId, SkillInstanceInfo info) { m_SenderId = objId; m_SkillInfo = info; }
private void AddSkillInstanceInfoToPool(int skillId, SkillInstanceInfo info) { List<SkillInstanceInfo> infos; if (m_SkillInstancePool.TryGetValue(skillId, out infos)) { infos.Add(info); } else { infos = new List<SkillInstanceInfo>(); infos.Add(info); m_SkillInstancePool.Add(skillId, infos); } }