Explorar o código

【新功能】MMO-19457:随从独立计算伤害

meijun %!s(int64=3) %!d(string=hai) anos
pai
achega
185060f2fa

+ 6 - 1
Common/CommonAI/Zone/Instance/InstanceUnit.cs

@@ -1083,7 +1083,7 @@ namespace CommonAI.Zone.Instance
 					{
 						int petShareDmg = Math.Max(1, (int)(hp * XmdsConstConfig.PET_SHARE_MASTERDMG_RATIO));
 						hp = Math.Max(1, hp - petShareDmg);
-						petUnit.AddHP(-petShareDmg, this);
+						petUnit.PetShareDamage(petShareDmg, this);
 					}
 				}
 			}
@@ -1887,6 +1887,11 @@ namespace CommonAI.Zone.Instance
             mBindEvents.Clear();
         }
 
+		/** 计算并获得伤害 */
+		public virtual void PetShareDamage(int baseDmgValue, InstanceUnit sender)
+		{
+		}
+
 		#endregion
 		//-----------------------------------------------------------------------------------------------------//
 

+ 14 - 1
XmdsCommonServer/Plugin/Units/XmdsInstancePet.cs

@@ -11,6 +11,7 @@ using System.Linq;
 using System.Text;
 using XmdsCommon.Message;
 using XmdsCommon.Plugin;
+using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
 using static CommonAI.Zone.SkillTemplate;
 
 namespace XmdsCommonServer.Plugin.Units
@@ -495,7 +496,19 @@ namespace XmdsCommonServer.Plugin.Units
             return false;
         }
 
-        public override void doSomething()
+		/** 计算并获得伤害 */
+		public override void PetShareDamage(int baseDmgValue, InstanceUnit sender)
+		{
+			XmdsVirtual petVirtual = this.Virtual as XmdsVirtual;
+
+			//分发事件
+			petVirtual.DispatchShareMasterDmgEvent(baseDmgValue, sender);
+
+			int finalDmg = XmdsDamageCalculator.GetPetDamage(baseDmgValue, petVirtual);			
+			this.AddHP(-finalDmg, sender);
+		}
+
+		public override void doSomething()
         {
             if (CurrentState is StateSkill)
             {

+ 15 - 1
XmdsCommonServer/Plugin/XmdsSkillTemplate/DamageCalculator/XmdsDamageCalculator.cs

@@ -43,6 +43,9 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator
 		//神器属性
 		private const float Coefficient_Artifact = 1.1f;
 
+		//随从受伤K系数
+		private static readonly float PET_HIT_DAMAGE_K = 0.5f;
+
         //万分比.
         public static float PERER = 10000.0f;
 
@@ -394,10 +397,21 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator
 				damage = CUtils.CastInt(damage * (1 + (attacker.mUnit.Level - hitter.mUnit.Level) * BOSS_LEVEL_SUBDUE));
 			}
 
-
 			return Math.Max(damage, 1);
 		}
 
+		public static int GetPetDamage(int damageBaseValue, XmdsVirtual pet)
+		{
+			//防御属性
+			float ingoreDmg = 1.0f - pet.MirrorProp.Defence / (pet.MirrorProp.Defence + GetDefenceAddition(pet.GetStateLv()));
+
+			//伤害变更(免伤,受伤加深)
+			float allDmgChg = GetFinalDamageValue(pet.MirrorProp.AllDmgAdd - pet.MirrorProp.AllDmgReduce);
+
+			int finalDmg = Math.Max(1, (int)(damageBaseValue * PET_HIT_DAMAGE_K * ingoreDmg * allDmgChg));
+			return finalDmg;
+		}
+
 		private static float GetFinalDamageValue(int value)
 		{
 			if (value < 0)