瀏覽代碼

【BUG】MMO-20037: 特殊山海技能无释放,无CD导致影响正常的自动战斗修正

meijun 3 年之前
父節點
當前提交
6459bf21d7

+ 2 - 1
Common/CommonAI/Zone/Data.cs

@@ -4274,9 +4274,10 @@ namespace CommonAI.Zone
         public bool AutoLaunch = true;
 
         public LaunchSkill() { }
-        public LaunchSkill(int skillID)
+        public LaunchSkill(int skillID, bool autoLaunch = true)
         {
             this.SkillID = skillID;
+			this.AutoLaunch = autoLaunch;
         }
         public override string ToString()
         {

+ 2 - 2
Common/CommonAI/Zone/Instance/InstanceUnit.Status.cs

@@ -577,14 +577,14 @@ namespace CommonAI.Zone.Instance
             }
         }
 
-        public SkillState AddSkill(SkillTemplate st, bool is_default = false)
+        public SkillState AddSkill(SkillTemplate st, bool autoLaunch, bool is_default = false)
         {
             if (DoTryAddSkill(ref st))
             {
                 if (st != null && !mSkillStatus.ContainsKey(st.ID))
                 {
                     mSyncSkillActivesChanged = true;
-                    SkillState state = new SkillState(st, new LaunchSkill(st.ID), this);
+                    SkillState state = new SkillState(st, new LaunchSkill(st.ID, autoLaunch), this);
                     mAllSkills.Add(st);
                     mSkillStatus.Add(state);
                     if (is_default)

+ 3 - 2
XmdsCommonServer/Plugin/XmdsSkillTemplate/Skills/XmdsBattleSkill.cs

@@ -104,7 +104,8 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills
 							continue;
                         }
 
-                        if (XmdsDataMgr.GetInstance().GetXmdsSkillData(sk.SkillID) == null)
+						XmdsSkillData skillData = XmdsDataMgr.GetInstance().GetXmdsSkillData(sk.SkillID);
+						if (skillData == null)
                         {
                             log.Warn("技能表未配置数据:" + sk.SkillID + ", 伤害走通用序列:" + sk.ToString());
                             continue;
@@ -117,7 +118,7 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills
                         }
 
                         UnitSkillMap.Add(sk.SkillID, stype);
-                        sk.InitSkillParam();
+                        sk.InitSkillParam(skillData);
                     }
                 }
                 catch (Exception err)

+ 6 - 5
XmdsCommonServer/Plugin/XmdsSkillTemplate/Skills/XmdsSkill.cs

@@ -16,6 +16,7 @@ using XmdsCommonServer.XLS.Data;
 using XmdsCommonSkill.Plugin.CardSkill;
 using XmdsCommon.JSGModule.Interface;
 using XmdsCommonServer.Plugin.Base;
+using CommonAI.Zone.Helper;
 
 namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills
 {
@@ -92,9 +93,9 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills
         {
             OnRegistEvent();
             OnBaseInit(info, unit, ref template);
-            
+
 			//伤害监听.
-			if(unit != null)
+			if (unit != null)
 			{
 				unit.RegistCalDamage(OnCallDamageProcess, info, false, this.SkillID);
 				//技能MP消耗预判.
@@ -105,9 +106,9 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills
 		}
 
 		//只调用一次的初始化
-        public void InitSkillParam()
+        public void InitSkillParam(XmdsSkillData skillData)
         {
-            OnBaseDataInit();
+            OnBaseDataInit(skillData);
             OnInitSkillParam();
         }
 
@@ -121,7 +122,7 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills
 
         }
 
-        protected virtual void OnBaseDataInit() { }
+        protected virtual void OnBaseDataInit(XmdsSkillData skillData) { }
 
         protected virtual void OnInitSkillParam()
         {

+ 106 - 95
XmdsCommonServer/Plugin/XmdsVirtual/XmdsVirtual.Skills.cs

@@ -271,6 +271,7 @@ namespace XmdsCommonServer.Plugin
 						gs.TalentSkillLevel2 = skillData.TalentSkillLevel2;
 						gs.TalentSkillLevel3 = skillData.TalentSkillLevel3;
 						gs.SkillTimestampMS = skillCD;
+						gs.AutoLaunch = gs.SkillType != XmdsSkillType.cardSkill;
 
 						if (gs.SkillType == XmdsSkillType.passive || gs.SkillType == XmdsSkillType.petGivePassive)
 						{
@@ -1011,101 +1012,102 @@ namespace XmdsCommonServer.Plugin
 				}
 			}
 
-			public bool changeActiveSkill(int oldSkillID, int newSkillID)
-			{
-				try
-				{
-					if (oldSkillID == 0 || oldSkillID == newSkillID)
-					{
-						return false;
-					}
-					GameSkill oldSkill = mSkillMap.Get(oldSkillID);
-					GameSkill newSkill = mSkillMap.Get(newSkillID);
-					if (oldSkill == null || newSkill != null)
-					{
-						return false;
-					}
-
-					oldSkill.SkillID = newSkillID;
-					newSkill = oldSkill;
-
-					SkillTemplate st = null;
-					UnitSkill us = InitXmdsSkillScript(newSkill, ref st);
-					if (us == null || st == null)
-					{
-						FormatLog(string.Format("XmdsVirtual.Skill can not find SkillScript {0},", newSkill.SkillID));
-						return false;
-					}
-
-					mSkillMap.Remove(oldSkillID);
-					mSkillMap.Add(newSkillID, newSkill);
-
-					mActiveSkillTemplateMap.Remove(oldSkillID);
-					mActiveSkillTemplateMap.Add(us.SkillID, st);
-
-					for (int i = 0; i < mActiveSkills.Count; i++)
-					{
-						if (mActiveSkills[i].SkillID == oldSkillID)
-						{
-							mActiveSkills.RemoveAt(i);
-							mActiveSkills.Add(us);
-						}
-					}
-
-
-					#region 重置单位技能.
-					List<SkillTemplate> temp = new List<SkillTemplate>();
-					if (mActiveSkillTemplateMap.TryGetValue(newSkillID, out st))
-					{
-						//分辨出普通攻击.
-						if (newSkill.SkillType == XmdsSkillType.normalAtk)
-						{
-							mBaseSkill = st;
-						}
-						else
-						{
-							temp.Add(st);
-						}
-					}
-
-					if (temp.Count > 0 || mBaseSkill != null)
-					{
-						//重置技能.
-						mOwner.mUnit.InitSkills(mBaseSkill, temp.ToArray());
-					}
-
-					// 人物, 宠物的技能是否自动释放走配置表
-					if (mOwner is XmdsVirtual_Player || mOwner is XmdsVirtual_Pet)
-					{
-						SkillState skillState = mOwner.mUnit.getSkillState(newSkill.SkillID);
-						if (skillState != null)
-						{
-							skillState.setAutoLaunch(newSkill.AutoLaunch);
-						}
-					}
-
-					mOwner.SetSkillCD(st.ID, newSkill.SkillTimestampMS);
-					mOwner.SetSkillCDDecreasePercent(st.ID, newSkill.SkillCDDecreasePercent);
-
-					for (int i = 0; i < mActiveSkills.Count; i++)
-					{
-						if (mActiveSkills[i].SkillID == newSkillID)
-						{
-							mActiveSkills[i].InitOver(mOwner, newSkill);
-							break;
-						}
-					}
-
-					#endregion
-				}
-				catch (Exception error)
-				{
-					FormatLog(CommonLang.Log.LoggerLevel.ERROR, "单位【{0}】初始化技能错误:{1}", mOwner.mInfo.Name, error.ToString());
-					return false;
-				}
+			//public bool changeActiveSkill(int oldSkillID, int newSkillID)
+			//{
+			//	try
+			//	{
+			//		if (oldSkillID == 0 || oldSkillID == newSkillID)
+			//		{
+			//			return false;
+			//		}
+			//		GameSkill oldSkill = mSkillMap.Get(oldSkillID);
+			//		GameSkill newSkill = mSkillMap.Get(newSkillID);
+			//		if (oldSkill == null || newSkill != null)
+			//		{
+			//			return false;
+			//		}
+
+			//		oldSkill.SkillID = newSkillID;
+			//		newSkill = oldSkill;
+
+			//		SkillTemplate st = null;
+			//		UnitSkill us = InitXmdsSkillScript(newSkill, ref st);
+			//		if (us == null || st == null)
+			//		{
+			//			FormatLog(string.Format("XmdsVirtual.Skill can not find SkillScript {0},", newSkill.SkillID));
+			//			return false;
+			//		}
+
+			//		mSkillMap.Remove(oldSkillID);
+			//		mSkillMap.Add(newSkillID, newSkill);
+
+			//		mActiveSkillTemplateMap.Remove(oldSkillID);
+			//		mActiveSkillTemplateMap.Add(us.SkillID, st);
+
+			//		for (int i = 0; i < mActiveSkills.Count; i++)
+			//		{
+			//			if (mActiveSkills[i].SkillID == oldSkillID)
+			//			{
+			//				mActiveSkills.RemoveAt(i);
+			//				mActiveSkills.Add(us);
+			//				break;
+			//			}
+			//		}
+
+
+			//		#region 重置单位技能.
+			//		List<SkillTemplate> temp = new List<SkillTemplate>();
+			//		if (mActiveSkillTemplateMap.TryGetValue(newSkillID, out st))
+			//		{
+			//			//分辨出普通攻击.
+			//			if (newSkill.SkillType == XmdsSkillType.normalAtk)
+			//			{
+			//				mBaseSkill = st;
+			//			}
+			//			else
+			//			{
+			//				temp.Add(st);
+			//			}
+			//		}
+
+			//		if (temp.Count > 0 || mBaseSkill != null)
+			//		{
+			//			//重置技能.
+			//			mOwner.mUnit.InitSkills(mBaseSkill, temp.ToArray());
+			//		}
+
+			//		// 人物, 宠物的技能是否自动释放走配置表
+			//		if (mOwner is XmdsVirtual_Player || mOwner is XmdsVirtual_Pet)
+			//		{
+			//			SkillState skillState = mOwner.mUnit.getSkillState(newSkill.SkillID);
+			//			if (skillState != null)
+			//			{
+			//				skillState.setAutoLaunch(newSkill.AutoLaunch);
+			//			}
+			//		}
+
+			//		mOwner.SetSkillCD(st.ID, newSkill.SkillTimestampMS);
+			//		mOwner.SetSkillCDDecreasePercent(st.ID, newSkill.SkillCDDecreasePercent);
+
+			//		for (int i = 0; i < mActiveSkills.Count; i++)
+			//		{
+			//			if (mActiveSkills[i].SkillID == newSkillID)
+			//			{
+			//				mActiveSkills[i].InitOver(mOwner, newSkill);
+			//				break;
+			//			}
+			//		}
+
+			//		#endregion
+			//	}
+			//	catch (Exception error)
+			//	{
+			//		FormatLog(CommonLang.Log.LoggerLevel.ERROR, "单位【{0}】初始化技能错误:{1}", mOwner.mInfo.Name, error.ToString());
+			//		return false;
+			//	}
 
-				return true;
-			}
+			//	return true;
+			//}
 
 
 			private UnitSkill InitXmdsSkillScript(GameSkill gs, ref SkillTemplate st)
@@ -1356,6 +1358,15 @@ namespace XmdsCommonServer.Plugin
 						mOwner.RemoveEventBySkillID(gs.SkillID);
 						mSkillMap.Remove(sk.ID);
 					}
+
+					for (int i = 0; i < mActiveSkills.Count; i++)
+					{
+						if (mActiveSkills[i].SkillID == sk.ID)
+						{
+							mActiveSkills.RemoveAt(i);
+							break;
+						}
+					}
 				}
 
 				if (mActiveSkillTemplateMap != null)
@@ -1431,7 +1442,7 @@ namespace XmdsCommonServer.Plugin
 					mActiveSkillTemplateMap.Put(st.ID, st);
 					//us = XmdsBattleSkill.GetUnitSkill(gs.SkillID);
 
-					mOwner.mUnit.AddSkill(st, is_default);
+					mOwner.mUnit.AddSkill(st, gs.AutoLaunch, is_default);
 					SkillState skillState = mOwner.SetSkillCD(gs.SkillID, gs.SkillTimestampMS);
 					mOwner.SetSkillCDDecreasePercent(gs.SkillID, gs.SkillCDDecreasePercent);
 

+ 9 - 2
XmdsCommonServer/XLS/XLSSkillCfgLoader.cs

@@ -1,4 +1,5 @@
 
+using CommonAI.Zone.Helper;
 using CommonLang;
 using CommonLang.IO;
 using NPOI.HSSF.UserModel;
@@ -60,7 +61,7 @@ namespace XmdsCommonServer.XLS
                     {
                         try
                         {
-							LoadSheet(sheet);							
+							LoadSheet(sheet, sheet.SheetName == CARD_SKILL);							
                         }
                         catch (Exception error)
                         {
@@ -75,7 +76,7 @@ namespace XmdsCommonServer.XLS
             log.Info("XLSSkillCfgLoader 初始化技能配置完成.");
         }
 
-        private void LoadSheet(ISheet sheet)
+        private void LoadSheet(ISheet sheet, bool isCardSKill)
         {
             int index = 0;
             try
@@ -87,6 +88,12 @@ namespace XmdsCommonServer.XLS
                 foreach (XmdsSkillData m in LoadSheet<XmdsSkillData>(sheet))
                 {
                     m.Init();
+
+					if(isCardSKill)
+					{
+						m.SkillType = (byte)XmdsSkillType.cardSkill;
+					}
+					
                     SkillDatas.Add(m.SkillID, m);
                     index++;
 

+ 18 - 15
XmdsVSPlugins/XmdsCommonSkill/Plugin/Skills/XmdsSkillBase.cs

@@ -230,7 +230,7 @@ namespace XmdsCommonSkill.Plugin.Skills
         /// <summary>
         /// 技能是否能自动释放.
         /// </summary>
-        protected static HashMap<int, XmdsSkillValue> mSkillCanAuto = new HashMap<int, XmdsSkillValue>();
+        protected static HashMap<int, bool> mSkillCanAuto = new HashMap<int, bool>();
 
 		#region 回调事件.
 
@@ -390,7 +390,7 @@ namespace XmdsCommonSkill.Plugin.Skills
             template.CoolDownMS = this.GetTargetFormulaValue(info.SkillLevel, this.GetSkillCD(info.SkillID));
 
             //控制是否能自动施放.
-            if (unit != null && unit.mUnit.IsPlayer && this.GetTargetFormulaValue(0, this.GetCanAuto(info.SkillID)) == 0)
+            if (unit != null && unit.mUnit.IsPlayer && !this.IsCanAuto(info.SkillID))
             {
                 info.AutoLaunch = false;
             }
@@ -1061,14 +1061,12 @@ namespace XmdsCommonSkill.Plugin.Skills
 
         #region 基础事件监听.
 
-        protected override void OnBaseDataInit()
+        protected override void OnBaseDataInit(XmdsSkillData data)
         {
-            base.OnBaseDataInit();
+            base.OnBaseDataInit(data);
 
             if (SkillID != -1)
             {
-                XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(SkillID);
-
                 if (data != null)
                 {                   
 					if(data.CDTime != null)
@@ -1079,10 +1077,15 @@ namespace XmdsCommonSkill.Plugin.Skills
 					}
 
 					if (data.canAuto != null)
-					{
-						XmdsSkillValue skillCanAuto;
-						InitData(data, out skillCanAuto, XmdsSkillData.XmdsSkillDataKey.canAuto);
-						mSkillCanAuto.Put(SkillID, skillCanAuto);
+					{						
+						bool canAutoLunch = data.SkillType != (int)XmdsSkillType.cardSkill;
+						if(canAutoLunch)
+						{
+							XmdsSkillValue skillCanAuto;
+							InitData(data, out skillCanAuto, XmdsSkillData.XmdsSkillDataKey.canAuto);
+							canAutoLunch = skillCanAuto == null ? false : (skillCanAuto.GetValue() == 1);
+						}
+						mSkillCanAuto.Put(SkillID, canAutoLunch);
 					}
 
 					if(data.TalentData != null && data.TalentData.Length > 0)
@@ -1111,11 +1114,11 @@ namespace XmdsCommonSkill.Plugin.Skills
             return (outSkillCD == null) ? XmdsGlobalData.DefaultValue : outSkillCD;
         }
 
-        private XmdsSkillValue GetCanAuto(int skillID)
-        {
-            XmdsSkillValue outData;
-            mSkillCanAuto.TryGetValue(skillID, out outData);
-            return (outData == null) ? XmdsGlobalData.DefaultValue : outData;
+		private bool IsCanAuto(int skillID)
+		{
+			bool canAutoLaunch = false;
+			mSkillCanAuto.TryGetValue(skillID, out canAutoLaunch);
+			return canAutoLaunch;
         }
 
 		/// <summary>