From 54d84deb1ca272784a1acc2fe33277ec2b4f5f37 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 09 一月 2020 17:42:46 +0800
Subject: [PATCH] 8346 【恺英】【后端】协助系统(副本协助奖励仅在发起玩家在线时才结算;增加协助玩家协助状态设置; 跨服服务器暂屏蔽发起协助)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py                       |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py                          |  134 ++++++++++++++++++++++++++++++++------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py                         |    9 +--
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py                                               |   20 ++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py |    9 --
 5 files changed, 116 insertions(+), 58 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index 1c4a5e3..69d38f5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -335,13 +335,6 @@
     NetPackCommon.SendFakePack(assistPlayer, assistPack)
     return
 
-def SetPlayerStartAssistTeamFB(curPlayer, queryData):
-    ## 开始协助组队副本 - 玩家进入副本后才真正进入协助状态
-    
-    #mapID, lineID, tagPlayerID = queryData
-    
-    return
-
 def MapServer_PlayerAssistLogic(curPlayer, msgList, tick):
     ## 地图同步的协助信息逻辑处理
     
@@ -403,7 +396,18 @@
     
     # 开始协助组队副本
     elif queryType == "OnStartAssistTeamFB":
-        SetPlayerStartAssistTeamFB(curPlayer, queryData)
+        mapID, lineID, tagPlayerID = queryData
+        GameWorld.DebugLog("    开始协助副本: mapID=%s,lineID=%s,tagPlayerID=%s" % (mapID, lineID, tagPlayerID), playerID)
+        # 副本协助暂时只处理设置协助目标ID
+        PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID)
+        return
+    
+    # 取消协助组队副本
+    elif queryType == "OnCancelAssistTeamFB":
+        mapID, lineID, reason = queryData
+        GameWorld.DebugLog("    开始协助副本: mapID=%s,lineID=%s,reason=%s" % (mapID, lineID, reason), playerID)
+        # 副本协助暂时只处理设置协助目标ID
+        PlayerControl.SetAssistTagPlayerID(curPlayer, 0)
         return
     
     #QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
index 83c72bb..5f2a6cc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -21,6 +21,7 @@
 import CrossRealmPlayer
 import PlayerSuccess
 import ReadChConfig
+import PlayerAssist
 import ShareDefine
 import PyGameData
 import FBCommon
@@ -531,6 +532,7 @@
     #成长NPC所需数据初始化
     InitFBNPCStrengthenData(curPlayer, gameMap)
     
+    PlayerAssist.OnPlayerEnterAssistFB(curPlayer, gameMapID, reqFuncLineID)
     DoEnterFB(curPlayer, tick)
     
     RecordFirstEnterMap(curPlayer, gameMapID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py
index bf77a59..053fdda 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py
@@ -81,11 +81,6 @@
     gameFB = GameWorld.GetGameFB()
     
     lineTimeCfg = FBCommon.GetFBLineStepTime(mapID)
-    
-    # 进入消耗处理
-    if not FBCommon.GetHadDelTicket(curPlayer):
-        FBCommon.SetHadDelTicket(curPlayer)
-        PlayerAssist.SetFBNoAssistPlayerID(curPlayer)
         
     fbStep = gameFB.GetFBStep()
     if fbStep == FB_Step_Open:
@@ -212,7 +207,7 @@
     FBCommon.SetFBStep(FB_Step_Over, tick)
     
     mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
-    noAssistPlayerID, assistMoneyType, assistPlayerMoneyDict = PlayerAssist.OnFBAssistOver(mapID)
+    noAssistPlayerID, assistMoneyType, assistPlayerMoneyDict = PlayerAssist.OnFBAssistOver(isPass, mapID)
     exitTime = FBCommon.GetFBLineStepTime(mapID)[Def_ExitTime] * 1000
     rewardInfo = FBCommon.GetFBLineReward(mapID, 0)
     noAssistItemList, assistItemList = ([], []) if not rewardInfo else rewardInfo
@@ -226,7 +221,7 @@
         
         playerID = curPlayer.GetPlayerID()
         overDict = {FBCommon.Over_dataMapID:mapID, FBCommon.Over_isPass: int(isPass)}
-        if isPass:
+        if isPass and noAssistPlayerID:
             itemList = []
             if playerID == noAssistPlayerID:
                 itemList = noAssistItemList
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
index 9a207ab..61815ea 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
@@ -42,6 +42,20 @@
     Sync_TodayAssistMoneyInfo(curPlayer)
     return
 
+def OnPlayerLeaveMap(curPlayer):
+    ## 玩家离开地图处理
+    
+    NPCHurtManager.OnPlayerLeaveMap(curPlayer)
+    
+    mapID = curPlayer.GetMapID()
+    if GameWorld.GetMap().GetMapFBTypeByMapID(mapID) == IPY_GameWorld.fbtTeam:
+        mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
+        if str(mapID) in mapAssistGiftDict and PlayerControl.GetAssistTagPlayerID(curPlayer):
+            lineID = PlayerControl.GetFBFuncLineID(curPlayer)
+            OnCancelAssistTeamFB(curPlayer.GetPlayerID(), mapID, lineID, "LeaveMap")
+            
+    return
+
 #// B0 10 请求协助Boss #tagCMRequestAssistBoss
 #
 #struct    tagCMRequestAssistBoss
@@ -56,6 +70,9 @@
     playerID = curPlayer.GetPlayerID()
     objID = clientData.ObjID
     npcID = clientData.NPCID
+    
+    if GameWorld.IsCrossServer():
+        return
     
     if not curPlayer.GetFamilyID():
         GameWorld.DebugLog("没有仙盟不能请求协助!", playerID)
@@ -106,6 +123,9 @@
     mapID = clientData.MapID
     lineID = clientData.LineID
     
+    if GameWorld.IsCrossServer():
+        return
+    
     if not curPlayer.GetFamilyID():
         GameWorld.DebugLog("没有仙盟不能请求协助!", playerID)
         return
@@ -141,6 +161,12 @@
     ## 开始协助组队副本,协助玩家进入副本调用
     queryData = [mapID, lineID, tagPlayerID]
     QueryGameServer_PlayerAssist(playerID, "OnStartAssistTeamFB", queryData)
+    return
+
+def OnCancelAssistTeamFB(playerID, mapID, lineID, reason):
+    ## 取消副本协助
+    queryData = [mapID, lineID, reason]
+    QueryGameServer_PlayerAssist(playerID, "OnCancelAssistTeamFB", queryData)
     return
 
 def QueryGameServer_PlayerAssist(playerID, queryType, queryData):
@@ -209,35 +235,72 @@
         
     return
 
-def SetFBNoAssistPlayerID(curPlayer):
-    ## 设置副本非协助玩家ID,玩家进入副本时调用
-    gameFB = GameWorld.GetGameFB()
-    if gameFB.GetGameFBDictByKey("FBNoAssistPlayerID"):
+def OnPlayerEnterAssistFB(curPlayer, mapID, lineID=0):
+    ## 玩家进入协助副本
+    
+    if GameWorld.GetMap().GetMapFBTypeByMapID(mapID) != IPY_GameWorld.fbtTeam:
         return
-    if curPlayer.GetTeamID():
-        if curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader:
-            return
-    noAssistPlayerID = curPlayer.GetPlayerID()
-    gameFB.SetGameFBDict("FBNoAssistPlayerID", noAssistPlayerID)
-    GameWorld.DebugLog("设置副本非协助玩家: noAssistPlayerID=%s" % noAssistPlayerID)
-    return
-
-def OnFBAssistOver(mapID, lineID=0):
-    ## 副本协助结束
-    assistPlayerMoneyDict = {}
-    assistMoneyType = ShareDefine.TYPE_Price_FamilyActivity
+    
+    mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
+    if str(mapID) not in mapAssistGiftDict:
+        return
+    
+    playerID = curPlayer.GetPlayerID()
     gameFB = GameWorld.GetGameFB()
     noAssistPlayerID = gameFB.GetGameFBDictByKey("FBNoAssistPlayerID")
-    GameWorld.DebugLog("副本协助结算: mapID=%s,lineID=%s,noAssistPlayerID=%s" % (mapID, lineID, noAssistPlayerID))
+    if noAssistPlayerID:
+        if playerID != noAssistPlayerID:
+            OnStartAssistTeamFB(playerID, mapID, lineID, noAssistPlayerID)
+        return
     
-    if not noAssistPlayerID:
-        return noAssistPlayerID, assistMoneyType, assistPlayerMoneyDict
-    
-    liheItemID, assistMoney = 0, 0
-    mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
-    if str(mapID) in mapAssistGiftDict:
-        liheItemID, assistMoney = mapAssistGiftDict[str(mapID)]
+    if curPlayer.GetTeamID():
+        if curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader:
+            # 非队长先进入的,暂不处理,等待队长进入后统一处理
+            return
         
+    noAssistPlayerID = playerID # 队长或无队伍进入则为非协助玩家
+    gameFB.SetGameFBDict("FBNoAssistPlayerID", noAssistPlayerID)
+    GameWorld.DebugLog("设置副本非协助玩家: noAssistPlayerID=%s" % noAssistPlayerID)
+    
+    copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
+    for index in xrange(copyPlayerManager.GetPlayerCount()):
+        player = copyPlayerManager.GetPlayerByIndex(index)
+        if not player:
+            continue
+        fbPlayerID = player.GetPlayerID()
+        if fbPlayerID == noAssistPlayerID:
+            continue
+        if PlayerControl.GetAssistTagPlayerID(player) != noAssistPlayerID:
+            OnStartAssistTeamFB(fbPlayerID, mapID, lineID, noAssistPlayerID)
+            
+    return
+
+def OnFBAssistOver(isPass, mapID, lineID=0):
+    ''' 副本协助结束
+    @return: noAssistPlayerID, assistMoneyType, assistPlayerMoneyDict
+        当 noAssistPlayerID 为0时代表没有成功结算协助,副本额外的协助奖励也不能结算,防止被刷协助奖励
+    '''
+    assistPlayerMoneyDict = {}
+    assistMoneyType = ShareDefine.TYPE_Price_FamilyActivity
+    defaultReturn = (0, assistMoneyType, assistPlayerMoneyDict)
+    gameFB = GameWorld.GetGameFB()
+    noAssistPlayerID = gameFB.GetGameFBDictByKey("FBNoAssistPlayerID")
+    GameWorld.DebugLog("副本协助结算: isPass=%s,mapID=%s,lineID=%s,noAssistPlayerID=%s" % (isPass, mapID, lineID, noAssistPlayerID))
+    
+    if not isPass or not noAssistPlayerID:
+        return defaultReturn
+    
+    copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
+    noAssistPlayer = copyPlayerManager.FindPlayerByID(noAssistPlayerID)
+    if not noAssistPlayer:
+        GameWorld.DebugLog("    非协助玩家不在,不结算协助奖励!")
+        return defaultReturn
+    
+    mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
+    if str(mapID) not in mapAssistGiftDict:
+        return  defaultReturn
+    liheItemID, assistMoney = mapAssistGiftDict[str(mapID)]
+    
     friendList, memFamilyIDDict = [], {}
     teamID = GameWorld.GetGameWorld().GetPropertyID()
     if teamID in PyGameData.g_teamFBMemRelationDict:
@@ -246,8 +309,6 @@
     
     assistAwardItemID = liheItemID
     assistPlayerDict = {}
-    copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
-    noAssistPlayer = copyPlayerManager.FindPlayerByID(noAssistPlayerID)
     for index in xrange(copyPlayerManager.GetPlayerCount()):
         curPlayer = copyPlayerManager.GetPlayerByIndex(index)
         if not curPlayer:
@@ -267,18 +328,17 @@
         GameWorld.DebugLog("协助方给活跃令奖励: assistPlayerID=%s,assistMoney=%s,isFriend=%s,addAssistMoney=%s" 
                            % (assistPlayerID, assistMoney, isFriend, addAssistMoney), mapID, lineID)
         
-        if noAssistPlayer:
-            todayGiftCount = assistPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GetThanksGiftCount % liheItemID)
-            assistPlayerDict[assistPlayerID] = {"PlayerName":assistPlayer.GetPlayerName(), "Job":assistPlayer.GetJob(), 
-                                                "LV":assistPlayer.GetLV(), "RealmLV":assistPlayer.GetOfficialRank(),
-                                                "TodayGiftCount":todayGiftCount}
-            
-            # 暂定支持同队伍不同仙盟间协助
-            if assistFamilyID and assistFamilyID == noAssistPlayerFamilyID:
-                notifyParam = [assistPlayer.GetPlayerName(), noAssistPlayer.GetPlayerName(), mapID]
-                PlayerControl.FamilyNotify(assistFamilyID, "AssistFBFinish", notifyParam)
+        todayGiftCount = assistPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GetThanksGiftCount % liheItemID)
+        assistPlayerDict[assistPlayerID] = {"PlayerName":assistPlayer.GetPlayerName(), "Job":assistPlayer.GetJob(), 
+                                            "LV":assistPlayer.GetLV(), "RealmLV":assistPlayer.GetOfficialRank(),
+                                            "TodayGiftCount":todayGiftCount}
+        
+        # 暂定支持同队伍不同仙盟间协助
+        if assistFamilyID and assistFamilyID == noAssistPlayerFamilyID:
+            notifyParam = [assistPlayer.GetPlayerName(), noAssistPlayer.GetPlayerName(), mapID]
+            PlayerControl.FamilyNotify(assistFamilyID, "AssistFBFinish", notifyParam)
                 
-    if noAssistPlayer and assistPlayerDict:
+    if assistPlayerDict:
         GameWorld.DebugLog("发布方给感谢礼盒奖励: noAssistPlayerID=%s,assistAwardItemID=%s" % (noAssistPlayerID, assistAwardItemID), mapID, lineID)
         ItemControler.GivePlayerItemOrMail(noAssistPlayer, [[assistAwardItemID, 1, 0]])
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index c627167..0e46c87 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -24,7 +24,6 @@
 import PlayerTrade
 import PlayerTeam
 import SkillCommon
-import ChItem
 import GameMap
 import FBLogic
 import GameWorldProcess
@@ -52,7 +51,6 @@
 import PlayerPrestigeSys
 import OpenServerCampaign
 import PlayerGodWeapon
-import PlayerWing
 import PlayerExpandPackCfgMgr
 import PlayerWorldAverageLv
 import PlayerActivity
@@ -81,8 +79,6 @@
 import PlayerFamilyTech
 import PlayerCostRebate
 import GY_Query_CrossRealmReg
-import PlayerFairyCeremony
-import PlayerNewFairyCeremony
 import PlayerCrossRealmPK
 import FunctionNPCCommon
 import CrossRealmPlayer
@@ -90,6 +86,7 @@
 import NPCHurtManager
 import ChNetSendPack
 import PlayerCoat
+import PlayerAssist
 import PlayerState
 import QuestCommon
 import PlayerDogz
@@ -1524,8 +1521,8 @@
         GameWorld.DebugLog("进入副本时,最后一次离开的可返回的副本ID更新!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY))
         
     # 离开地图
-    NPCHurtManager.OnPlayerLeaveMap(curPlayer)
-        
+    PlayerAssist.OnPlayerLeaveMap(curPlayer)
+    
     # 从副本中切图
     if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
         #默认回满血

--
Gitblit v1.8.0