Ver código fonte

【BUG】MMO-21840: 宠物机制调整,导致固定扣血被动失效

meijun 3 anos atrás
pai
commit
b9855c5e7b

+ 1 - 1
Common/CommonAI/Zone/Formula/IFormulas.cs

@@ -309,7 +309,7 @@ namespace CommonAI.Zone.Formula
 		/** 分发技能被打断事件(暂时只有移动) */
 		void DispatchSkillBlockEvent(InstanceUnit.StateSkill skill, InstanceUnit.State newState);
 		/** 分发加血事件 */
-		void DispatchAddOtherHPEvent(int hp, InstanceUnit sender, out int finalHP);
+		int DispatchAddOtherHPEvent(int hp, InstanceUnit sender, AttackSource source);
 		/** 分发扣定力时间 */
 		void DispatchAddMPEvent(int mp, InstanceUnit sender, out int finalMP, AttackSource source);
 		/** 分发法术释放完毕 */

+ 24 - 13
Common/CommonAI/Zone/Instance/InstanceUnit.cs

@@ -1081,26 +1081,29 @@ namespace CommonAI.Zone.Instance
 
                 if (hp < 0)
                 {
-                    //2.1 传递加血事件
-                    int finalHP = hp;
-                    attacker.Virtual.DispatchAddOtherHPEvent(-hp, this, out finalHP);
-                    hp = -finalHP;
+                    //传递加血事件
+                    hp = attacker.Virtual.DispatchAddOtherHPEvent(hp, this, source);
 
-                    //2.2 道灵对宠物加血,需要有个系数
+                    //2 道灵对宠物加血,需要有个系数
                     if (attacker.IsPlayer && this.IsPet && attacker.Virtual.GetUnitPro() == XmdsUnitPro.Priest)
                     {
                         hp = (int)(hp * XmdsConstConfig.PET_HEALD_RATIO);
                     }
                 }
-                else if (this.IsPlayer && attacker.IsMonster)
+                else
                 {
-                    //2.3 如果玩家受伤,伤害来源存在且为怪物,宠物可以分担伤害
-                    InstanceUnit petUnit = this.Virtual.GetPetUnit();
-                    if (petUnit != null)
+                    //传递单位-被其他人扣血
+                    hp = this.Virtual.DispatchAddOtherHPEvent(hp, attacker, source);
+                    if (this.IsPlayer && attacker.IsMonster)
                     {
-                        int petShareDmg = Math.Max(1, (int)(hp * XmdsConstConfig.PET_SHARE_MASTERDMG_RATIO));
-                        hp = Math.Max(1, hp - petShareDmg);
-                        petUnit.PetShareDamage(petShareDmg, this);
+                        //2.3 如果玩家受伤,伤害来源存在且为怪物,宠物可以分担伤害
+                        InstanceUnit petUnit = this.Virtual.GetPetUnit();
+                        if (petUnit != null)
+                        {
+                            int petShareDmg = Math.Max(1, (int)(hp * XmdsConstConfig.PET_SHARE_MASTERDMG_RATIO));
+                            hp = Math.Max(1, hp - petShareDmg);
+                            petUnit.PetShareDamage(petShareDmg, this);
+                        }
                     }
                 }
 
@@ -1116,13 +1119,21 @@ namespace CommonAI.Zone.Instance
                     hitMessage = new UnitHitEvent();
                 }
                 hitMessage.object_id = this.ID;
+
                 hitMessage.senderId = attacker == null ? 0 : attacker.ID;
+
                 hitMessage.senderMasterId = attacker == null ? 0 : attacker.Virtual.GetMasterID();
+
                 hitMessage.hitMasterId = this.Virtual.GetMasterID();
+
                 hitMessage.hp = hp;
+
                 hitMessage.isSpecialHit = dmgSrc != DamageSource.Def;
+
                 hitMessage.dmgSrc = dmgSrc;
+
                 hitMessage.isDead = IsDead();
+
                 queueEvent(hitMessage);
             }
 
@@ -1495,7 +1506,7 @@ namespace CommonAI.Zone.Instance
             public bool LaunchSetDirection;         // 释放时是否重新设置方向 
             public float direction;
             public bool IsAutoLaunch;               // 是否自动战斗时释放
-            public bool IsInGuard;					// 是否是自动战斗
+            public bool IsInGuard;                  // 是否是自动战斗
 
             public LaunchSkillParam(uint targetUnitID = 0, Vector2 target_pos = null, bool autoFocusNearTarget = false,
                 bool LaunchSetDirection = false, float direction = 0, bool IsAutoLaunch = false, bool IsInGuard = false)

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

@@ -491,13 +491,11 @@ namespace XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills
 	public delegate bool ISkillBlockEvent(XmdsVirtual launcher, InstanceUnit.StateSkill skill, InstanceUnit.State newState);
 
 
-	/// <summary>
-	/// 技能被打断事件通知
-	/// 
-	/// </summary>
-	/// <param name="skill"></param>
-	/// <param name="launcher"></param>
-	public delegate bool IAddOtherHPEvent(int hp, InstanceUnit sender, InstanceUnit hitter, out int finalHP);
+    /** 
+     * hp < 0加血事件,    sender: 发送者,hitter:被加血的人
+     * hp > =0扣血,       sender:攻击者,hitter: 要扣血的
+     * */
+    public delegate bool IAddOtherHPEvent(int hp, InstanceUnit sender, InstanceUnit hitter, AttackSource source, out int finalHP);
 
 	//宠物承担主人伤害事件
 	public delegate int IShareMasterDmgEvent(int hp, InstanceUnit sender, InstanceUnit unit, GameSkill info, ref bool isEndDispatch);

+ 26 - 11
XmdsCommonServer/Plugin/XmdsVirtual/XmdsVirtual.Event.cs

@@ -287,7 +287,7 @@ namespace XmdsCommonServer.Plugin
 			}
 		}
 
-		protected class OnShareMasterDmgEvent : IHandle
+        protected class OnShareMasterDmgEvent : IHandle
 		{
 			public readonly IShareMasterDmgEvent m_hand;
 			public OnShareMasterDmgEvent(IShareMasterDmgEvent handler, GameSkill skill) : base(skill, true)
@@ -930,7 +930,6 @@ namespace XmdsCommonServer.Plugin
 			return ret;
 		}
 
-
 		public int RegistAddOtherHPEvent(IAddOtherHPEvent call, GameSkill gs)
 		{
 			OnAddOtherHPEvnet handle = new OnAddOtherHPEvnet(call, gs);
@@ -1510,21 +1509,37 @@ namespace XmdsCommonServer.Plugin
 		}
 
 		/** 分发加血事件 */
-		public void DispatchAddOtherHPEvent(int hp, InstanceUnit hitter, out int finalHP)
+		public int DispatchAddOtherHPEvent(int hp, InstanceUnit hitter, AttackSource source)
 		{
-			finalHP = hp;
+            int finalHP = hp;
 			for (int i = mAddOtherHPList.Count - 1; i >= 0; --i)
 			{
 				OnAddOtherHPEvnet hitend = mAddOtherHPList[i];
-				if (hitend.m_hand.Invoke(hp, this.mUnit, hitter, out finalHP))
-				{
-					break;
-				}
+
+                if(hp > 0)
+                {
+                    //扣血
+                    if (hitend.m_hand.Invoke(hp, hitter, this.mUnit, source, out finalHP))
+                    {
+                        break;
+                    }
+                }
+                else
+                {
+                    //加血
+                    if (hitend.m_hand.Invoke(hp, this.mUnit, hitter, source, out finalHP))
+                    {
+                        break;
+                    }
+                }
+				
 			}
-		}
 
-		/** 分发宠物承担主人伤害事件 */
-		public int DispatchShareMasterDmgEvent(int shareDmg, InstanceUnit sender)
+            return finalHP;
+        }
+
+        /** 分发宠物承担主人伤害事件 */
+        public int DispatchShareMasterDmgEvent(int shareDmg, InstanceUnit sender)
 		{
 			bool isEndDispatch = false;
 			for (int i = mShareMasterDmgList.Count - 1; i >= 0; --i)

+ 1 - 1
XmdsCommonServer/Plugin/XmdsVirtual/XmdsVirtual.cs

@@ -1466,7 +1466,7 @@ namespace XmdsCommonServer.Plugin
                     attacker.OnHitOthter(this);
 
                     //致命一击时候死亡状态不设置.
-                    if (this.mUnit.CurrentHP - damage > 0)
+                   // if (this.mUnit.CurrentHP - damage > 0)
                     {
                         var s = (this.IsPlayerUnit() && attacker.IsPlayerUnit()) ? BattleStatus.PVP : BattleStatus.PVE;
 

+ 2 - 2
XmdsVSPlugins/XmdsCommonSkill/Plugin/PassiveSkills/Remedy/Remedy_510600.cs

@@ -74,10 +74,10 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
             return damage + extDamage;
         }
 
-		public bool OnAddOtherHPEvnet(int hp, InstanceUnit sender, InstanceUnit hitter, out int finalHP)
+		public bool OnAddOtherHPEvnet(int hp, InstanceUnit sender, InstanceUnit hitter, AttackSource source, out int finalHP)
 		{
 			finalHP = hp;
-			if(hp > 0 && sender.Virtual.IsAllies(hitter.Virtual, true, true))
+			if(hp < 0 && sender.Virtual.IsAllies(hitter.Virtual, true, true))
             {
 				int triggerHP = CUtils.CastInt(hitter.MaxHP * this.mTriggerPrecent);
 				if (hitter.CurrentHP <= triggerHP)

+ 49 - 16
XmdsVSPlugins/XmdsCommonSkill/Plugin/PassiveSkills/other/Other_100005.cs

@@ -57,29 +57,61 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Magic
             pco.Value = mNeedHitTimes * HIT_DAMAGE;
             mOpID1 = owner.AddPropChangeOperation(pco);
 
-            mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true);
-            mUUID_2 = owner.RegistTryAddBuffEvent(OnTryAddBuffEvent, skillInfo);
+			//mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true);
+			mUUID_1 = owner.RegistAddOtherHPEvent(OnAddOtherHPEvnet, skillInfo);
+			mUUID_2 = owner.RegistTryAddBuffEvent(OnTryAddBuffEvent, skillInfo);
         }
 
-        private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, 
-            ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
-        {
+		public bool OnAddOtherHPEvnet(int hp, InstanceUnit sender, InstanceUnit hitter, AttackSource source, out int finalHP)
+		{
+			//加血跳过
+			if(hp <= 0)
+            {
+				finalHP = hp;
+				return true;
+            }
+
 			this.lastHitTime = CommonLang.CUtils.localTimeMS;
-			isEndDispatch = true;
-			if (source.FromSkillType == XmdsSkillType.normalAtk && attacker.mUnit.IsPlayer)
+			finalHP = hp;
+            if (source != null && source.FromSkillType == XmdsSkillType.normalAtk)
             {
-				if(HIT_DAMAGE > 1 && HIT_DAMAGE_REDUCE > 0 && hitted.mUnit.GetBuffByID(BuffID) != null)
-				{
-					float damageReduce = HIT_DAMAGE * HIT_DAMAGE_REDUCE * XmdsUnitProp.PER;
-					return HIT_DAMAGE - damageReduce;
+                if (HIT_DAMAGE > 1 && HIT_DAMAGE_REDUCE > 0 && hitter.GetBuffByID(BuffID) != null)
+                {
+                    float damageReduce = HIT_DAMAGE * HIT_DAMAGE_REDUCE * XmdsUnitProp.PER;
+					finalHP = CUtils.CastInt(HIT_DAMAGE - damageReduce);
+                }
+                else
+                {
+					finalHP = HIT_DAMAGE;
 				}
 
-                return HIT_DAMAGE;
+                return false;
             }
 
-			attacker.SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitted.mUnit.ID);
-            return 0;
-        }
+            (sender.Virtual as XmdsVirtual).SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitter.ID);
+			finalHP = 0;
+			return false;
+		}
+
+        //private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
+        //    ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
+        //{
+        //    this.lastHitTime = CommonLang.CUtils.localTimeMS;
+        //    isEndDispatch = true;
+        //    if (source.FromSkillType == XmdsSkillType.normalAtk && attacker.mUnit.IsPlayer)
+        //    {
+        //        if (HIT_DAMAGE > 1 && HIT_DAMAGE_REDUCE > 0 && hitted.mUnit.GetBuffByID(BuffID) != null)
+        //        {
+        //            float damageReduce = HIT_DAMAGE * HIT_DAMAGE_REDUCE * XmdsUnitProp.PER;
+        //            return HIT_DAMAGE - damageReduce;
+        //        }
+
+        //        return HIT_DAMAGE;
+        //    }
+
+        //    attacker.SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitted.mUnit.ID);
+        //    return 0;
+        //}
 
         private bool OnTryAddBuffEvent(ref BuffTemplate buff, XmdsVirtual attacker, XmdsVirtual hitter, GameSkill skill)
         {
@@ -230,7 +262,8 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Magic
 
         protected override void OnDispose(XmdsVirtual owner)
         {
-            owner.UnRegistOnHitDamage(mUUID_1);
+			owner.UnRegistAddOtherHPEvent(mUUID_1);
+            //owner.UnRegistOnHitDamage(mUUID_1);
             owner.UnRegistTryAddBuffEvent(mUUID_2);
             owner.RemovePropChangeOperation(mOpID1);
         }

+ 39 - 11
XmdsVSPlugins/XmdsCommonSkill/Plugin/PassiveSkills/other/Other_100006.cs

@@ -44,28 +44,55 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Magic
             pco.Value = mNeedHitTimes;
             mOpID1 = owner.AddPropChangeOperation(pco);
 
-            mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true);
-			mUUID_1 = owner.RegistTryAddBuffEvent(OnTryAddBuffEvent, skillInfo, true);
+            //mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true);
+            mUUID_1 = owner.RegistAddOtherHPEvent(OnAddOtherHPEvnet, skillInfo);
+            mUUID_1 = owner.RegistTryAddBuffEvent(OnTryAddBuffEvent, skillInfo, true);
 		}
 
-        private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, 
-            ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
+        public bool OnAddOtherHPEvnet(int hp, InstanceUnit sender, InstanceUnit hitter, AttackSource source, out int finalHP)
         {
-			isEndDispatch = true;
-		   if (source.FromSkillType == XmdsSkillType.normalAtk)
+            //加血跳过
+            if (hp <= 0)
+            {
+                finalHP = hp;
+                return true;
+            }
+
+            finalHP = hp;
+            if (source != null && source.FromSkillType == XmdsSkillType.normalAtk)
             {
                 curHitTimes++;
                 //if(curHitTimes >= mNeedHitTimes)
                 //{
                 //   hitted.mUnit.AddHP(-hitted.mUnit.MaxHP);
                 //}
-                return 1;
+                finalHP = 1;
+                return false;
             }
 
-            attacker.SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitted.mUnit.ID);
-            return 0;
+            (sender.Virtual as XmdsVirtual).SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitter.ID);
+            finalHP = 0;
+            return false;
         }
 
+   //     private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, 
+   //         ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
+   //     {
+			//isEndDispatch = true;
+		 //  if (source.FromSkillType == XmdsSkillType.normalAtk)
+   //         {
+   //             curHitTimes++;
+   //             //if(curHitTimes >= mNeedHitTimes)
+   //             //{
+   //             //   hitted.mUnit.AddHP(-hitted.mUnit.MaxHP);
+   //             //}
+   //             return 1;
+   //         }
+
+   //         attacker.SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitted.mUnit.ID);
+   //         return 0;
+   //     }
+
 		private bool OnTryAddBuffEvent(ref BuffTemplate buff, XmdsVirtual attacker, XmdsVirtual hitter, GameSkill skill)
 		{
 			// 不允许加buff
@@ -80,8 +107,9 @@ namespace XmdsCommonSkill.Plugin.PassiveSkills.Magic
 
         protected override void OnDispose(XmdsVirtual owner)
         {
-            owner.UnRegistOnHitDamage(mUUID_1);
-			owner.UnRegistTryAddBuffEvent(mUUID_2);
+            //owner.UnRegistOnHitDamage(mUUID_1);
+            owner.UnRegistAddOtherHPEvent(mUUID_1);
+            owner.UnRegistTryAddBuffEvent(mUUID_2);
             owner.RemovePropChangeOperation(mOpID1);
         }
     }

+ 8 - 8
test/app.config

@@ -2,19 +2,19 @@
 <configuration>
   <appSettings>
     <add key="zoneConfig.assetPath" value="D:\XMDS_TEMP\GameEditors\GameEditor\data" />
-    <add key="logConfig.configFile" value="log4net" />
+    <add key="logConfig.configFile" value="log4net.config" />
     <add key="logConfig.serverId" value="csharp-server-11" />
-    <add key="logConfig.outputPath" value="../log/" />
-    <!-- DEBUG、INFO、WARNNING、ERROR-->
-    <add key="logConfig.level" value="DEBUG" />
+    <add key="logConfig.outputPath" value="../" />
+    <!-- FINE、DEBUG、TRACE、LOG、INFO、WARNNING、ERROR、FATAL-->
+    <add key="logConfig.level" value="INFO" />
     <!--add key="iceConfig.host" value="192.168.92.2" /-->
-    <add key="iceConfig.port" value="3910" />
+    <add key="iceConfig.port" value="9910" />
     <add key="iceConfig.isTraceNetwork" value="true" />
     <add key="iceConfig.isTraceProtocol" value="true" />
     <add key="iceConfig.isWarnConnections" value="true" />
-    <add key="fastStreamConfig.port" value="3370" />
-    <add key="game.server.id" value="" />
-    <add key="game.bstest" value="true" />
+    <add key="fastStreamConfig.port" value="9370" />
+    <add key="game.server.id" value="10004" />
+	<add key="game.bstest" value="true" />
     <!--add key="gameServer.start.bat" value="E:\work\服务器运行环境\xmds-server\xmds-game.bat" /-->
     <add key="ClientSettingsProvider.ServiceUri" value="" />
   </appSettings>