From 0bb7ee068aedba47cb8de483ddf0fe21eb040fb1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 02 四月 2020 18:08:14 +0800
Subject: [PATCH] 8401 【后端】BOSS复活修改(活动boss被击杀时增加全服广播提醒)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py |  209 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 203 insertions(+), 6 deletions(-)

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 fae0769..61815ea 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
@@ -19,10 +19,15 @@
 import IpyGameDataPY
 import PlayerControl
 import NPCHurtManager
+import ChPyNetSendPack
+import NetPackCommon
 import IPY_GameWorld
 import ItemControler
 import ItemCommon
 import ChConfig
+import ShareDefine
+import PyGameData
+import FBCommon
 
 def DoPlayerOnDay(curPlayer):
     ## 过天处理
@@ -32,6 +37,23 @@
         ipyData = ipyDataMgr.GetAssistThanksGiftByIndex(index)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GetThanksGiftCount % ipyData.GetGiftID(), 0)
         
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayAssistMoney, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayAssistMoneySocial, 0)
+    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
@@ -49,13 +71,19 @@
     objID = clientData.ObjID
     npcID = clientData.NPCID
     
+    if GameWorld.IsCrossServer():
+        return
+    
     if not curPlayer.GetFamilyID():
         GameWorld.DebugLog("没有仙盟不能请求协助!", playerID)
         return
     
     curNPC = GameWorld.FindNPCByNPCID(npcID)
-    if not curNPC or curNPC.GetID() != objID:
-        GameWorld.DebugLog("协助NPC不存在无法协助!", playerID)
+    if not curNPC:
+        GameWorld.DebugLog("协助NPC不存在无法协助!npcID=%s" % npcID, playerID)
+        return
+    if curNPC.GetID() != objID:
+        GameWorld.DebugLog("协助NPC实例ID不一致无法协助!npcID=%s,curNPC.GetID()=%s,sendObjID=%s" % (npcID, curNPC.GetID(), objID), playerID)
         return
     
     ipyData = IpyGameDataPY.GetIpyGameDataNotLog('BOSSInfo', npcID)
@@ -72,11 +100,10 @@
         GameWorld.DebugLog("请求协助CD中!npcID=%s" % npcID, playerID)
         return
     
+    npcLV = curNPC.GetLV()
     mapID = curPlayer.GetMapID()
-    lineID = 0
-    if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: # 副本型boss,如封魔坛
-        lineID = PlayerControl.GetFBFuncLineID(curPlayer)
-    queryData = [mapID, lineID, npcID, objID]
+    lineID = NPCHurtManager.GetBossLineID(npcID)
+    queryData = [mapID, lineID, npcID, objID, npcLV]
     QueryGameServer_PlayerAssist(playerID, "RequestAssistBoss", queryData)
     return
 
@@ -96,6 +123,9 @@
     mapID = clientData.MapID
     lineID = clientData.LineID
     
+    if GameWorld.IsCrossServer():
+        return
+    
     if not curPlayer.GetFamilyID():
         GameWorld.DebugLog("没有仙盟不能请求协助!", playerID)
         return
@@ -108,6 +138,21 @@
         GameWorld.DebugLog("请求协助CD中!mapID=%s,lineID=%s" % (mapID, lineID), playerID)
         return
     
+    mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
+    if str(mapID) not in mapAssistGiftDict:
+        return
+    
+    teamID = curPlayer.GetTeamID()
+    if teamID:
+        if curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader:
+            GameWorld.DebugLog("非队长,无法发布副本协助!")
+            return
+        
+    fbIpyData = FBCommon.GetFBIpyData(mapID)
+    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID)
+    if PlayerControl.CheckMoveToFB(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, tick) != ShareDefine.EntFBAskRet_OK:
+        return
+    
     queryData = [mapID, lineID]
     QueryGameServer_PlayerAssist(playerID, "RequestAssistTeamFB", queryData)
     return
@@ -116,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):
@@ -184,4 +235,150 @@
         
     return
 
+def OnPlayerEnterAssistFB(curPlayer, mapID, lineID=0):
+    ## 玩家进入协助副本
+    
+    if GameWorld.GetMap().GetMapFBTypeByMapID(mapID) != IPY_GameWorld.fbtTeam:
+        return
+    
+    mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
+    if str(mapID) not in mapAssistGiftDict:
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    gameFB = GameWorld.GetGameFB()
+    noAssistPlayerID = gameFB.GetGameFBDictByKey("FBNoAssistPlayerID")
+    if noAssistPlayerID:
+        if playerID != noAssistPlayerID:
+            OnStartAssistTeamFB(playerID, mapID, lineID, noAssistPlayerID)
+        return
+    
+    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:
+        friendList, memFamilyIDDict = PyGameData.g_teamFBMemRelationDict[teamID][:2]
+    noAssistPlayerFamilyID = memFamilyIDDict.get(noAssistPlayerID, 0)
+    
+    assistAwardItemID = liheItemID
+    assistPlayerDict = {}
+    for index in xrange(copyPlayerManager.GetPlayerCount()):
+        curPlayer = copyPlayerManager.GetPlayerByIndex(index)
+        if not curPlayer:
+            continue
+        
+        playerID = curPlayer.GetPlayerID()
+        if playerID == noAssistPlayerID:
+            continue
+        
+        assistPlayer = curPlayer
+        assistPlayerID = playerID
+        isFriend = [noAssistPlayerID, playerID] in friendList or [playerID, noAssistPlayerID] in friendList
+        assistFamilyID = assistPlayer.GetFamilyID()
+        
+        addAssistMoney = AddTodayAssistMoney(curPlayer, assistMoneyType, assistMoney, isFriend)
+        assistPlayerMoneyDict[assistPlayerID] = addAssistMoney
+        GameWorld.DebugLog("协助方给活跃令奖励: assistPlayerID=%s,assistMoney=%s,isFriend=%s,addAssistMoney=%s" 
+                           % (assistPlayerID, assistMoney, isFriend, addAssistMoney), mapID, lineID)
+        
+        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 assistPlayerDict:
+        GameWorld.DebugLog("发布方给感谢礼盒奖励: noAssistPlayerID=%s,assistAwardItemID=%s" % (noAssistPlayerID, assistAwardItemID), mapID, lineID)
+        ItemControler.GivePlayerItemOrMail(noAssistPlayer, [[assistAwardItemID, 1, 0]])
+        
+    queryData = [mapID, lineID, noAssistPlayerID, assistAwardItemID, assistPlayerDict]
+    QueryGameServer_PlayerAssist(0, "OnFBAssistOver", queryData)
+    return noAssistPlayerID, assistMoneyType, assistPlayerMoneyDict
+
+def AddTodayAssistMoney(curPlayer, moneyType, addMoney, isSocialEx):
+    ''' 增加今日协助货币奖励    
+    @param moneyType: 货币类型
+    @param addMoney: 常规增加,有每日上限
+    @param isSocialEx: 是否社交加成,不计入常规上限
+    '''
+    
+    todayAssistMoney = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayAssistMoney)
+    socialMoney = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayAssistMoneySocial)
+    todayAssistMoneyMax = IpyGameDataPY.GetFuncCfg("AssistAward", 4)
+    if todayAssistMoney >= todayAssistMoneyMax:
+        return 0
+    
+    addValue = min(addMoney, todayAssistMoneyMax - todayAssistMoney)
+    socialEx = 0
+    if isSocialEx:
+        friendAddAssistMoneyPer = IpyGameDataPY.GetFuncCfg("AssistAward", 3)
+        socialEx = int(addValue * friendAddAssistMoneyPer / 100.0)
+        
+    realAdd = addValue + socialEx
+    PlayerControl.GiveMoney(curPlayer, moneyType, realAdd)
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayAssistMoney, todayAssistMoney + addValue)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayAssistMoneySocial, socialMoney + socialEx)
+    
+    Sync_TodayAssistMoneyInfo(curPlayer)
+    return realAdd
+
+def Sync_TodayAssistMoneyInfo(curPlayer):
+    ## 通知今日已获得协助货币信息
+    infoPack = ChPyNetSendPack.tagMCTodayAssistMoneyInfo()
+    infoPack.TodayAssistMoney = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayAssistMoney)
+    infoPack.SocialMoney = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayAssistMoneySocial)
+    NetPackCommon.SendFakePack(curPlayer, infoPack)
+    return
 

--
Gitblit v1.8.0