From 9a2fd2a8b061b3c876be62d397b939daccaeb69a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 26 三月 2019 11:51:30 +0800
Subject: [PATCH] 3138 【主干】【BUG】拍卖行获得仙玉数值错误(最少收税1) 其他bug: 1. 修复一组拍品个数大于1时无法竞价、一口价的bug 2. 修复竞价后短时间内无法再竞价的bug,会提示有人正在竞价中(正常会提示该情况的一般只有两个人同时点击竞价的时候有可能出现)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py |  138 +++++++++++++++++++++++++++------------------
 1 files changed, 83 insertions(+), 55 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
index c436a58..6fe82c7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
@@ -27,16 +27,11 @@
 import ItemCommon
 import ChPyNetSendPack
 import ShareDefine
-import EventShell
-import NPCCustomRefresh
 import PlayerSuccess
 import PlayerActivity
 import NetPackCommon
 import ItemControler
-import PlayerMagicWeapon
-import PlayerBossReborn
-import PlayerFairyCeremony
-import PlayerWeekParty
+import PlayerActLogin
 import EventReport
 
 FBDict_StartTick = 'FBDict_StartTick%s' #开始时间
@@ -47,8 +42,9 @@
 FBDict_IsReduceing = 'FBDict_IsReduceing%s' #是否掉血中
 FBPlayerDict_Rank = "FBPlayerDict_Rank" # 玩家排名
 FBDict_BossTotalHP = 'FBDict_BossTotalHP%s' #BOSS血量
+FBDict_LastHurtTick = 'FBDict_LastHurtTick'  #上次伤害时间
 
-g_npcHurtDict = {}
+g_heroHurtDict = {} #{playerID:hurt}
 
 
 def OnFBPlayerOnLogin(curPlayer):
@@ -82,10 +78,11 @@
     if curPlayer.GetOfficialRank() < ipyData.GetRealmLV():
         return
     #诛仙总评分
-    
+    if ItemCommon.GetZhuXianEquipTotalGS(curPlayer) < ipyData.GetZhuXianScore():
+        return
     
     enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
-    if enterCnt >= FBCommon.GetEnterFBMaxCnt:
+    if enterCnt >= FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss):
         if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt):
             return
         if not curPlayer.GetFamilyID():
@@ -150,9 +147,9 @@
 #  @param tick
 #  @return None
 def DoEnterFB(curPlayer, tick):
+    global g_heroHurtDict
     playerID = curPlayer.GetPlayerID()
-    mapID = GameWorld.GetMap().GetMapID()
-   
+
     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1    
     
     playerCnt = GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount()
@@ -165,6 +162,7 @@
     if not hadDelTicket:
         FBCommon.SetHadDelTicket(curPlayer)
         PyGameData.g_fbPickUpItemDict.pop(playerID, 0)
+        g_heroHurtDict.pop(playerID, 0)
 #        if playerCnt == 1:
 #            posX, posY = IpyGameDataPY.GetFuncEvalCfg('ZhuXianBossFirstPos')
 #            GameWorld.ResetPlayerPos(curPlayer, posX, posY)
@@ -203,7 +201,6 @@
 # @param tick 时间戳
 # @return 无意义
 def DoExitFB(curPlayer, tick):
-    global g_npcHurtDict
     gameWorld = GameWorld.GetGameWorld()
     # 清除鼓舞buff
     FBCommon.ClearEncourageBuff(curPlayer, tick)
@@ -211,7 +208,6 @@
     if gameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1:
         lineID = gameWorld.GetPropertyID() - 1
         PyGameData.g_ZhuXianBossPlayerHurtDict[lineID] = {}
-        g_npcHurtDict[lineID] = {}
         gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, 0)
         GameWorld.GetGameFB().ClearGameFBDict()
         GameWorldProcess.CloseFB(tick)
@@ -254,12 +250,13 @@
 #  @return None
 def DoFBHelp(curPlayer, tick):
     #伤害排行信息
+    if GameWorld.GetGameFB().GetGameFBDictByKey(FBDict_IsOver):
+        return
     hurtInfo = []
     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
     playerHurtList = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}).items()
-    npcHurtList = g_npcHurtDict.get(lineID, {}).items()
-    
-    syncHurtList = (playerHurtList + npcHurtList)[:5]
+
+    syncHurtList = playerHurtList[:5]
     syncHurtList.sort(key=lambda asd:asd[1][1], reverse=True)
         
     for i, info in enumerate(syncHurtList, 1):
@@ -270,24 +267,28 @@
         hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
         hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
         hurtInfo.append(hurtDict)
-    myRank = __GetSelfHurtRank(curPlayer)
-    if myRank and myRank > 5:
-        hurtDict = {}
-        hurtDict["rank"] = myRank
-        info = playerHurtList[myRank - 1]
-        playerName, hurt = info[1][:2]
-        hurtDict["playerName"] = playerName
-        hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
-        hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
-        hurtInfo.append(hurtDict)
+#    myRank = __GetSelfHurtRank(curPlayer)
+#    if myRank and myRank > 5:
+#        hurtDict = {}
+#        hurtDict["rank"] = myRank
+#        info = playerHurtList[myRank - 1]
+#        playerName, hurt = info[1][:2]
+#        hurtDict["playerName"] = playerName
+#        hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
+#        hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
+#        hurtInfo.append(hurtDict)
     
     curSpeed = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_Speed % lineID) 
     isReduceing = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_IsReduceing % lineID) 
     remainHP = GetBossRemainHP(lineID, tick)
     totalHP = __GetBossTotalHP(lineID)
     hpReduceSpeed = curSpeed * 10000 / totalHP if totalHP else 0
-    remainHPPer = min(100, remainHP * 100 / totalHP) if totalHP else 0
-    fbHelpDict = {FBCommon.Help_lineID:lineID, "hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed, 'remainHPPer':remainHPPer, 'isReduceing':isReduceing}
+    remainHPPer = min(1000000, remainHP * 1000000 / totalHP) if totalHP else 0
+    myHurt = g_heroHurtDict.get(curPlayer.GetID(), 0)
+    fbHelpDict = {FBCommon.Help_lineID:lineID, "hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed, 
+                  'remainHPPer':remainHPPer, 'isReduceing':isReduceing,'myHurt':myHurt % ChConfig.Def_PerPointValue,
+                  'myHurtEx':myHurt / ChConfig.Def_PerPointValue
+                  }
     GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID())
     FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)
     return
@@ -324,17 +325,22 @@
 #  @return None
 def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP):
     UpdateHurtInfo(curPlayer, hurtHP)
+    GameWorld.GetGameFB().SetGameFBDict(FBDict_LastHurtTick, GameWorld.GetGameWorld().GetTick())
     return
 #
 def UpdateHurtInfo(curPlayer, hurtHP, isAdd=False):
+    global g_heroHurtDict
+    playerID = curPlayer.GetPlayerID()
+    g_heroHurtDict[playerID] = g_heroHurtDict.get(playerID, 0) + hurtHP
+    
     enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
-    if enterCnt >= FBCommon.GetEnterFBMaxCnt:
+    if enterCnt >= FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss):
         #没归属的不进伤害榜
         return
     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
     
     playerName = curPlayer.GetName() 
-    playerID = curPlayer.GetPlayerID()
+    
     familyID = curPlayer.GetFamilyID()
     playerHurtDict = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {})
     if playerID not in playerHurtDict:
@@ -360,15 +366,19 @@
         GameWorld.Log("强制踢出玩家关闭副本: overTick=%s,tick=%s" % (overTick, tick))
         FBCommon.DoLogic_FBKickAllPlayer()
         return
-    mapID = GameWorld.GetMap().GetMapID()
-   
+
     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
     if lineID <0:
         return
     gameWorld = GameWorld.GetGameWorld()
     startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID)
-    if not startTick:
+    if not startTick or overTick:
         return
+    lastHurtTick = gameFB.GetGameFBDictByKey(FBDict_LastHurtTick)
+    if lastHurtTick and tick - lastHurtTick >= 2000:
+        StopReduceHP(lineID, tick)
+        GameWorld.GetGameFB().SetGameFBDict(FBDict_LastHurtTick, 0)
+            
     FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
     __CheckBossHP(tick)
     
@@ -404,10 +414,10 @@
     playerManager = GameWorld.GetMapCopyPlayerManager()#GameWorld.GetPlayerManager()
     firstPlayer = playerManager.FindPlayerByID(firstPlayerID)
     if firstPlayer:
-        #gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_Rank, rank)
+        gameFB.SetPlayerGameFBDict(firstPlayerID, FBPlayerDict_Rank, 1)
         if not dropPosX or not dropPosY:
             dropPosX, dropPosY = firstPlayer.GetPosX(), firstPlayer.GetPosY()
-        prizeItemList = GiveZhuXianBossAward(firstPlayer, lineID, dropItemMapInfo=[dropPosX, dropPosY, True])
+        prizeItemList = GiveZhuXianBossAward(firstPlayer, lineID, dropItemMapInfo=[dropPosX, dropPosY, True, True])
         if not prizeItemList:
             # 没有掉落时直接通知结算,防止卡副本
             firstPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
@@ -420,11 +430,10 @@
         if leaveServerTick and tick - leaveServerTick < ChConfig.Def_PlayerOfflineProtectTime:
             #离线超过3分钟的不给奖励
             msgStr = str([ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord, [firstPlayerID, lineID], [], 0, 0])
-            playerManager.GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))
+            GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))
             
     helpItemList = FBCommon.GetFBLineReward(mapID, lineID)
     if helpItemList: #同盟协助奖励
-        needSpace = len(helpItemList)
         jsonItemList = FBCommon.GetJsonItemList(helpItemList)
         for index in range(0 , playerManager.GetPlayerCount()):
             curPlayer = playerManager.GetPlayerByIndex(index)
@@ -433,24 +442,18 @@
                 continue
             if curPlayerID == firstPlayerID:
                 continue
-            if curPlayer.GetFamilyID() != firstPlayerFamilyID:
-                continue
-            remainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt)
-            if not remainCnt:
-                continue
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, remainCnt-1)
-            NotifyZXHelpCnt(curPlayer)
             curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
-            overDict = {FBCommon.Over_rank:0, FBCommon.Over_itemInfo:jsonItemList}
-            FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict)
-            
-            packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
-            if needSpace > packSpace:
-                PlayerControl.SendMailByKey('ZXBossHelperReward', [curPlayerID], helpItemList)
+            remainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt)
+            if curPlayer.GetFamilyID() == firstPlayerFamilyID and remainCnt:
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, remainCnt-1)
+                NotifyZXHelpCnt(curPlayer)
+                ItemControler.GivePlayerItemOrMail(curPlayer, helpItemList, 'ZXBossHelperReward')
+                overDict = {FBCommon.Over_rank:0, FBCommon.Over_itemInfo:jsonItemList}
+                FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict)
             else:
-                for itemID, itemCount, isBind in helpItemList:
-                    ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem])
-    
+                overDict = {FBCommon.Over_rank:0}
+                FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, 0, overDict)
+            
     return
 
 def GiveZhuXianBossAward(curPlayer, lineID, isMail=False, dropItemMapInfo=[]):
@@ -480,7 +483,8 @@
     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, addCnt, [bossID])
     FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, addCnt)
     # 每日活动
-    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
+    #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
+    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_ZhuXianBOSS, addCnt)
     return prizeItemList
 
 def OnPickUpItem(curPlayer, curItem, tick):
@@ -547,7 +551,7 @@
             dropPosX, dropPosY = curBoss.GetPosX(), curBoss.GetPosY()
         
         #结束 设置BOSS死亡
-
+        FBCommon.ClearFBNPC()
         FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
         GameWorld.DebugLog('结束 设置BOSS死亡 lineID=%s' % lineID)
         playerHurtList = __GetSortHurtList(lineID)
@@ -614,6 +618,7 @@
     if not startTick:
         gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, __GetBossTotalHP(lineID))
     gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, tick)
+    FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
     return
 
 def __GetBossTotalHP(lineID):return GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_BossTotalHP%lineID)
@@ -661,4 +666,27 @@
 def DoPlayerDead(curPlayer):
     return
 
+## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
+#  @param attacker 攻击方
+#  @param defender 防守方
+#  @return bool
+def CheckCanAttackTagObjInFB(attacker, defender):
+    atkObjType = attacker.GetGameObjType()
+    defObjType = defender.GetGameObjType()
+    gameWorld = GameWorld.GetGameWorld()
+    lineID = gameWorld.GetPropertyID() - 1
+    if defObjType == IPY_GameWorld.gotNPC and defender.GetNPCID() == CurFBLineBOSSID(lineID):
+        if not PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}):
+            if atkObjType == IPY_GameWorld.gotPlayer:
+                PlayerControl.NotifyCode(attacker, 'TryEnterJadeDynastyBossError_7')
+            return False
+    return True
 
+##处理副本中杀死玩家逻辑
+# @param curPlayer 玩家实例
+# @param defender 防守者
+# @param tick 时间戳
+# @return 布尔值
+# @remarks 处理副本中杀死玩家逻辑
+def DoFBOnKill_Player(atkobj, defender, tick):
+    return True
\ No newline at end of file

--
Gitblit v1.8.0