Browse Source

【优化】某些事件导致怪物状态强行被切换,导致多次调用死亡通知

meijun 3 years ago
parent
commit
e5b64fb7da

+ 2 - 5
Common/CommonAI/Zone/Instance/InstanceUnit.StateMachine.cs

@@ -2613,11 +2613,8 @@ namespace CommonAI.Zone.Instance
 				//某些状态帧下死亡调用漏掉了
 				if (unit.IsNeedProcessDead())
 				{
-                    if (unit.IsPlayer)
-                    {
-                        log.Warn("手动调用死亡逻辑1:" + unit.PlayerUUID + ", 攻击方:" + (attacker == null ? "null" : attacker.PlayerUUID));
-                    }
-					unit.Parent.cb_unitDeadCallBack(unit, this.attacker);
+                    log.Warn("手动调用死亡逻辑1:" + unit.PlayerUUID + ", 攻击方:" + (attacker == null ? "null" : attacker.PlayerUUID) + ", " + this.zone.GetSceneID());
+                    unit.Parent.cb_unitDeadCallBack(unit, this.attacker);
 				}
 
 				unit.SetActionStatus(UnitActionStatus.Dead);

+ 3 - 22
Common/CommonAI/Zone/Instance/InstanceUnit.cs

@@ -80,7 +80,7 @@ namespace CommonAI.Zone.Instance
         private float __mControledTimeAdd;
 
         /// 单位最后死亡时间
-        private long mDeadTime = 0;
+        public long mDeadTime = 0;
 
         //游戏服标记字段,怪物死亡的时候,回传给游戏服
         public int gameServerFlag = 0;
@@ -487,10 +487,7 @@ namespace CommonAI.Zone.Instance
             if (IsDead() && (!IsStateDead))
             {
                 changeState(new StateDead(this, this, false), true);
-                if (this.IsPlayer)
-                {
-                    log.Warn("额外调用死亡逻辑:" + this.PlayerUUID);
-                }
+                log.Warn("额外调用死亡逻辑:" + this.PlayerUUID + ", " + this.mZone.GetSceneID() + ", " + this.Info.ID);
 
                 Parent.cb_unitDeadCallBack(this, this);
                 queueEvent(new UnitDeadEvent(ID, this.ID, false, mInfo.RebirthTimeMS));
@@ -844,23 +841,6 @@ namespace CommonAI.Zone.Instance
         {
             try
             {
-                if (this.mProcessDeadCallbackTime > CommonLang.CUtils.localTimeMS)
-                {
-                    log.Warn("cb_unitDeadCallBack 跳过:" + this.mProcessDeadCallbackTime + ", " + this.Parent.GetSceneID() + ", ID:" + this.Info.ID + ", " + this.PlayerUUID);
-                    return;
-                }
-
-                if (this.IsMonster && this.Virtual.GetMaType() >= 4 && this.Level > 80)
-                {
-                    log.Info("boss死亡:" + this.Parent.GetSceneID() + ", 单位id=" + this.Info.ID + ", 处理死亡时间:" + this.mProcessDeadCallbackTime
-                         + ", SceneUID: " + this.mZone.UUID + ", " + (attacker == null ? "null" : attacker.PlayerUUID));
-
-                    if (attacker.IsPlayerUnit)
-                    {
-                        JSGHackerModule.OnPlayerKillMonster(attacker, this);
-                    }
-                }
-
                 mDeadTime = Parent.PassTimeMS;
                 onDead(attacker);
                 Parent.cb_unitDeadCallBack(this, attacker);
@@ -1264,6 +1244,7 @@ namespace CommonAI.Zone.Instance
             if (IsDead())
             {
                 //this.DeadHide = false;
+                this.mProcessDeadCallbackTime = 0;
                 return changeState(new StateRebirth(this, max_hp, max_mp));
             }
             return false;

+ 48 - 17
Common/CommonAI/Zone/Instance/InstanceZone.cs

@@ -1417,31 +1417,62 @@ namespace CommonAI.Zone.Instance
         }
         internal void cb_unitDeadCallBack(InstanceUnit obj, InstanceUnit attacker)
         {
-            statisticForceDead(obj);
+            try
+            {
+                if (obj.mProcessDeadCallbackTime > CommonLang.CUtils.localTimeMS)
+                {
+                    log.Warn("cb_unitDeadCallBack 跳过:" + obj.mProcessDeadCallbackTime + ", " + obj.Parent.GetSceneID() + ", ID:" + obj.Info.ID + ", " + obj.PlayerUUID);
+                    return;
+                }
 
-            LastHittedUnit = obj;
-            LastKilledUnit = obj;
+                if (obj.IsMonster && obj.Virtual.GetMaType() >= 4 && obj.Level >= 80)
+                {
+                    log.Info("boss死亡:" + obj.Parent.GetSceneID() + ", 单位id=" + obj.Info.ID + ", 处理死亡时间:" + obj.mProcessDeadCallbackTime
+                         + ", SceneUID: " + obj.mZone.UUID + ", " + (attacker == null ? "null" : attacker.PlayerUUID));
 
-            //if (attacker == null)
-            //    attacker = obj;
-            LastAttackUnit = attacker;
+                    if (attacker.IsPlayerUnit)
+                    {
+                        JSGHackerModule.OnPlayerKillMonster(attacker, obj);
+                    }
+                }
+                if (obj.mProcessDeadCallbackTime > 0)
+                {
+                    log.Warn("单位多次回调死亡逻辑:" + this.GetSceneID() + ", " + this.UUID + ", " + obj.Info.ID + ", attackID:" +
+                        (attacker == null ? -1 : attacker.Info.ID) + ", UUID" + (attacker == null ? "null" : attacker.PlayerUUID) + ", " + CommonLang.TimeUtil.GetTimestampMS());
+                }
+                obj.mProcessDeadCallbackTime = CommonLang.CUtils.localTimeMS + 1000;
+                obj.mDeadTime = CommonLang.CUtils.localTimeMS;
 
-            obj.doDead(attacker);
+                statisticForceDead(obj);
+                LastHittedUnit = obj;
+                LastKilledUnit = obj;
 
-			if(attacker != null)
-			{
-				obj.deadDropItems(attacker.Force);
-				attacker.CurrentMoney += obj.Info.DropMoney;
-			}           
+                //if (attacker == null)
+                //    attacker = obj;
+                LastAttackUnit = attacker;
+                obj.doDead(attacker);
 
-            mFormula.OnUnitDead(obj, attacker);
+                if (attacker != null)
+                {
+                    obj.deadDropItems(attacker.Force);
+                    attacker.CurrentMoney += obj.Info.DropMoney;
+                }
 
-            obj.callback_onDead(this, attacker);
-            if (mOnUnitDead != null)
-                mOnUnitDead.Invoke(this, obj, attacker);
+                mFormula.OnUnitDead(obj, attacker);
 
-			obj.mProcessDeadCallbackTime = CommonLang.CUtils.localTimeMS + 1000;
+                obj.callback_onDead(this, attacker);
+                if (mOnUnitDead != null)
+                {
+                    mOnUnitDead.Invoke(this, obj, attacker);
+                }
+            }
+            catch(Exception e)
+            {
+                log.Error("cb_unitDeadCallBackcatch: " + this.GetSceneID() + ", " + (obj == null ? -1 : obj.Info.ID) + ", " + (attacker == null ? -1 : attacker.Info.ID)
+                    + ",UUID: " + (obj == null ? "null" : obj.PlayerUUID) + ", " + (attacker == null ? "null" : attacker.PlayerUUID) + ", e: " + e);
+            }           
         }
+
         internal void cb_unitActivatedCallBack(InstanceUnit obj)
         {
             nearChange(obj);