/// <summary> /// 使用技能,这个需要手动调用 /// </summary> /// <param name="self"></param> /// <param name="skillId"></param> /// <returns></returns> public static UseSkillRet UseSkill(SkillObj self, int skillId) { UseSkillRet ret = UseSkillRet.Success; if (BattleModule.IsActionLimited(self, ActionLimitType.UseSkill)) { return(UseSkillRet.ActionLimit); } if (self.IsDead()) { return(UseSkillRet.Dead); } //检查特殊状态 if (!self.CanUseSkill(skillId)) { return(UseSkillRet.None); } SkillConfig_New skillConfig = self.GetSkillConfig(skillId); if (skillConfig == null) { return(UseSkillRet.None); } //检查技能消耗 if (!UseSkillCheckDeplete(self, skillConfig)) { return(UseSkillRet.Deplete); } string skillLogicId = self.GetSkillLogicId(skillConfig); if (!SkillLogics.ContainsKey(skillLogicId)) { return(UseSkillRet.None); } SkillLogic skillLogic = SkillLogics[skillLogicId]; if (skillLogic != null) { //检查CD if (!skillLogic.CheckCD(self, skillConfig)) { string key = self.GetSkillCDKey(skillConfig); self.LogInfo("skill:[{0}] CD ing [{1}]:[{2}]".F(self.GetSkillID(skillConfig), key, self.GetCD(key))); return(UseSkillRet.CD); } SkillInfo_New skillInfo = skillLogic.Begin(self, skillConfig); if (skillInfo != null) { skillLogic.BeginCD(self, skillInfo, skillConfig); self.AddSkillList(skillInfo); self.LogInfo("Skill Begin Successed [{0}]".F(skillId)); } else { self.LogInfo("Skill Begin Failed [{0}]".F(skillId)); } } return(ret); }
/// <summary> /// 单人技能的tick,这个需要手动调用 /// </summary> /// <param name="self"></param> public static void Tick_Battle(SkillObj self) { if (self.IsDead()) { return; } var skillList = self.GetSkillList(true); var buffList = self.GetBuffList(true); var CDKeyList = self.GetCDKeyList(); //buff if (buffList != null) { foreach (var buffInfo in buffList) { BuffLogic buffLogic = GetBuffLogic(buffInfo, self); if (buffLogic != null) { int buffId = self.GetBuffID(buffInfo); BuffConfig_New buffConfig = self.GetBuffConfig(buffId); buffLogic.Tick(self, buffInfo, buffConfig); } else { self.LogInfo("something error {0}".F(self.GetBuffID(buffInfo))); } } } //技能 if (skillList != null) { foreach (var skillInfo in skillList) { SkillLogic skillLogic = GetSkillLogic(skillInfo, self); if (skillLogic != null) { int skillId = self.GetSkillID(skillInfo); SkillConfig_New skillConfig = self.GetSkillConfig(skillId); skillLogic.Tick(self, skillInfo, skillConfig); } else { self.LogInfo("something error2 {0}".F(self.GetSkillID(skillInfo))); } } } //CD if (CDKeyList != null) { foreach (var key in CDKeyList) { self.SetCD(key, self.GetCD(key) - self.GetDeltaTime()); } } }
public static bool IsActionLimited(SkillObj self, ActionLimitType limit) { var skillList = self.GetSkillList(); var buffList = self.GetBuffList(); //buff if (buffList != null) { foreach (var buffInfo in buffList) { BuffLogic buffLogic = GetBuffLogic(buffInfo, self); if (buffLogic != null) { int buffId = self.GetBuffID(buffInfo); BuffConfig_New buffConfig = self.GetBuffConfig(buffId); if (buffLogic.IsActionLimited(self, limit, buffInfo, buffConfig)) { return(true); } } else { self.LogInfo("something error {0}".F(self.GetBuffID(buffInfo))); } } } //技能 if (skillList != null) { foreach (var skillInfo in skillList) { SkillLogic skillLogic = GetSkillLogic(skillInfo, self); if (skillLogic != null) { int skillId = self.GetSkillID(skillInfo); SkillConfig_New skillConfig = self.GetSkillConfig(skillId); if (skillLogic.IsActionLimited(self, limit, skillInfo, skillConfig)) { return(true); } } else { self.LogInfo("something error2 {0}".F(self.GetSkillID(skillInfo))); } } } return(false); }
private static SkillLogic GetSkillLogic(SkillInfo_New skillInfo, SkillObj logObj) { int skillId = logObj.GetSkillID(skillInfo); SkillConfig_New buffConfig = logObj.GetSkillConfig(skillId); if (buffConfig == null) { logObj.LogInfo("SkillConfig not found skillid[{0}]".F(skillId)); return(null); } string skillLogicId = logObj.GetSkillLogicId(buffConfig); if (!SkillLogics.ContainsKey(skillLogicId)) { logObj.LogInfo("SkillLogic not found skillid[{0}] SkillLogicId[{1}]".F(skillId, skillLogicId)); return(null); } SkillLogic skillLogic = SkillLogics[skillLogicId]; return(skillLogic); }
/// <summary> /// 造成伤害或治疗 /// </summary> /// <param name="tarObj"></param> /// <param name="srcObj"></param> /// <param name="damage">大于0是伤害,小于0是治疗</param> public static void DamageTarget(SkillObj tarObj, SkillObj srcObj, Damage damage) { SkillObj realSrcObj = srcObj; if (tarObj == null || tarObj.IsDead()) { return; } if (realSrcObj != null && damage.srcId > 0 && realSrcObj.GetID() != damage.srcId) { realSrcObj = tarObj.GetSkillObj(damage.srcId); } BattleModule.CalcDamage(tarObj, realSrcObj, damage); //先修正伤害 BattleModule.DamageFix(tarObj, realSrcObj, damage); //质量和造成伤害都是这个 //造成伤害 if (damage.value >= 0) { tarObj.OnDamage(damage, realSrcObj); } else { tarObj.OnDamage(damage, realSrcObj); } //检查技能与BUFF的相应触发 if (realSrcObj != null && !realSrcObj.IsDead()) { var srcSkillList = realSrcObj.GetSkillList(); var srcBuffList = realSrcObj.GetBuffList(); //Source skill fix if (srcSkillList != null) { foreach (var skillInfo in srcSkillList) { SkillLogic skillLogic = GetSkillLogic(skillInfo, realSrcObj); int skillId = realSrcObj.GetSkillID(skillInfo); if (skillLogic != null) { SkillConfig_New skillConfig = realSrcObj.GetSkillConfig(skillId); if (damage.value >= 0) { skillLogic.OnDamageTarget(realSrcObj, tarObj, damage, skillInfo, skillConfig); } else { skillLogic.OnHealTarget(realSrcObj, tarObj, damage, skillInfo, skillConfig); } } else { realSrcObj.LogInfo("something error in BattleModule.DamageTarget src skill:[{0}]".F(skillId)); } } } //Source buff fix if (srcBuffList != null) { foreach (var buffInfo in srcBuffList) { BuffLogic buffLogic = GetBuffLogic(buffInfo, realSrcObj); int buffId = realSrcObj.GetBuffID(buffInfo); if (buffLogic != null) { BuffConfig_New buffConfig = realSrcObj.GetBuffConfig(buffId); if (damage.value >= 0) { buffLogic.OnDamageTarget(realSrcObj, tarObj, damage, buffInfo, buffConfig); } else { buffLogic.OnHealTarget(realSrcObj, tarObj, damage, buffInfo, buffConfig); } } else { realSrcObj.LogInfo("something error in BattleModule.DamageTarget src buff:[{0}]".F(buffId)); } } } } var tarSkillList = tarObj.GetSkillList(); var tarBuffList = tarObj.GetBuffList(); //Target skill fix if (!tarObj.IsDead()) { if (tarSkillList != null) { foreach (var skillInfo in tarSkillList) { SkillLogic skillLogic = GetSkillLogic(skillInfo, tarObj); int skillId = tarObj.GetSkillID(skillInfo); if (skillLogic != null) { SkillConfig_New skillConfig = tarObj.GetSkillConfig(skillId); if (damage.value >= 0) { skillLogic.OnBeHurt(tarObj, realSrcObj, damage, skillInfo, skillConfig); } else { skillLogic.OnBeHeal(tarObj, realSrcObj, damage, skillInfo, skillConfig); } } else { tarObj.LogInfo("something error in BattleModule.DamageTarget tar skill:[{0}]".F(skillId)); } } } //Target buff fix if (tarBuffList != null) { foreach (var buffInfo in tarBuffList) { BuffLogic buffLogic = GetBuffLogic(buffInfo, tarObj); int buffId = tarObj.GetBuffID(buffInfo); if (buffLogic != null) { BuffConfig_New buffConfig = tarObj.GetBuffConfig(buffId); if (damage.value >= 0) { buffLogic.OnBeHurt(tarObj, realSrcObj, damage, buffInfo, buffConfig); } else { buffLogic.OnBeHeal(tarObj, realSrcObj, damage, buffInfo, buffConfig); } } else { tarObj.LogInfo("something error in BattleModule.DamageTarget tar buff:[{0}]".F(buffId)); } } } } if (tarObj.IsDead()) { if (tarSkillList != null) { foreach (var skillInfo in tarSkillList) { SkillLogic skillLogic = GetSkillLogic(skillInfo, tarObj); int skillId = tarObj.GetSkillID(skillInfo); if (skillLogic != null) { SkillConfig_New skillConfig = tarObj.GetSkillConfig(skillId); skillLogic.OnDie(tarObj, realSrcObj, skillInfo, skillConfig); } else { tarObj.LogInfo("something error in BattleModule.DamageTarget tar skill:[{0}]".F(skillId)); } } } //Target buff fix if (tarBuffList != null) { foreach (var buffInfo in tarBuffList) { BuffLogic buffLogic = GetBuffLogic(buffInfo, tarObj); int buffId = tarObj.GetBuffID(buffInfo); if (buffLogic != null) { BuffConfig_New buffConfig = tarObj.GetBuffConfig(buffId); buffLogic.OnDie(tarObj, realSrcObj, buffInfo, buffConfig); } else { tarObj.LogInfo("something error in BattleModule.DamageTarget tar buff:[{0}]".F(buffId)); } } } bool ret = tarObj.OnDie(realSrcObj); } }
private static void DamageFix(SkillObj tarObj, SkillObj srcObj, Damage damage) { if (tarObj == null) { return; } if (srcObj != null) { var srcSkillList = srcObj.GetSkillList(); var srcBuffList = srcObj.GetBuffList(); //Source skill fix if (srcSkillList != null) { foreach (var skillInfo in srcSkillList) { SkillLogic skillLogic = GetSkillLogic(skillInfo, srcObj); int skillId = srcObj.GetSkillID(skillInfo); if (skillLogic != null) { SkillConfig_New skillConfig = srcObj.GetSkillConfig(skillId); skillLogic.DamageTargetFix(srcObj, tarObj, damage, skillInfo, skillConfig); } else { srcObj.LogInfo("something error in BattleModule.DamageFix src skill:[{0}]".F(skillId)); } } } //Source buff fix if (srcBuffList != null) { foreach (var buffInfo in srcBuffList) { BuffLogic buffLogic = GetBuffLogic(buffInfo, srcObj); int buffId = srcObj.GetBuffID(buffInfo); if (buffLogic != null) { BuffConfig_New skillConfig = srcObj.GetBuffConfig(buffId); buffLogic.DamageTargetFix(srcObj, tarObj, damage, buffInfo, skillConfig); } else { srcObj.LogInfo("something error in BattleModule.DamageFix src buff:[{0}]".F(buffId)); } } } } { var tarBuffList = tarObj.GetBuffList(); var tarSkillList = tarObj.GetSkillList(); //Target skill fix if (tarSkillList != null) { foreach (var skillInfo in tarSkillList) { SkillLogic skillLogic = GetSkillLogic(skillInfo, tarObj); int skillId = tarObj.GetSkillID(skillInfo); if (skillLogic != null) { SkillConfig_New skillConfig = tarObj.GetSkillConfig(skillId); skillLogic.BeHurtDamageFix(tarObj, srcObj, damage, skillInfo, skillConfig); } else { tarObj.LogInfo("something error in BattleModule.DamageFix tar skill:[{0}]".F(skillId)); } } } //Target buff fix if (tarBuffList != null) { foreach (var buffInfo in tarBuffList) { BuffLogic buffLogic = GetBuffLogic(buffInfo, tarObj); int buffId = tarObj.GetBuffID(buffInfo); if (buffLogic != null) { BuffConfig_New skillConfig = tarObj.GetBuffConfig(buffId); buffLogic.BeHurtDamageFix(tarObj, srcObj, damage, buffInfo, skillConfig); } else { tarObj.LogInfo("something error in BattleModule.DamageFix tar buff:[{0}]".F(buffId)); } } } } }
private BattleInitClass() { var asm = Assembly.GetExecutingAssembly(); foreach (var b in asm.GetTypes()) { if (b.IsSubclassOf(typeof(SkillLogic))) { //自动填充SkillLogics SkillLogic ins = asm.CreateInstance(b.FullName) as SkillLogic; BattleModule.SkillLogics.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(SkillLogicState))) { //自动填充SkillLogicStates SkillLogicState ins = asm.CreateInstance(b.FullName) as SkillLogicState; BattleModule.SkillLogicStates.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(TargetSelect))) { //自动填充TargetSelect TargetSelect ins = asm.CreateInstance(b.FullName) as TargetSelect; BattleModule.TargetSelects.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(TargetType))) { //自动填充TargetType TargetType ins = asm.CreateInstance(b.FullName) as TargetType; BattleModule.TargetTypes.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(BuffLogicState))) { //自动填充BuffLogicStates BuffLogicState ins = asm.CreateInstance(b.FullName) as BuffLogicState; BattleModule.BuffLogicStates.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(BuffLogic))) { //自动填充BuffLogicStates BuffLogic ins = asm.CreateInstance(b.FullName) as BuffLogic; BattleModule.BuffLogics.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(BuffSuperpositionLogic))) { //自动填充BuffSuperpositionLogics BuffSuperpositionLogic ins = asm.CreateInstance(b.FullName) as BuffSuperpositionLogic; BattleModule.BuffSuperpositionLogics.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(SkillBulletMovingLogic))) { //自动填充SkillBulletMovingLogic SkillBulletMovingLogic ins = asm.CreateInstance(b.FullName) as SkillBulletMovingLogic; BattleModule.SkillBulletMovingLogics.Add(b.Name, ins); } else if (b.IsSubclassOf(typeof(SkillBulletCollisionLogic))) { //自动填充SkillBulletCollisionLogic SkillBulletCollisionLogic ins = asm.CreateInstance(b.FullName) as SkillBulletCollisionLogic; BattleModule.SkillBulletCollisionLogics.Add(b.Name, ins); } } }