From c82ca7ce4eaa66b71a9df0e7f54434530ac59c9d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 02 十一月 2020 16:28:03 +0800
Subject: [PATCH] 8469 【BT】【后端】个人BOSS,获得S评级的BOSS可进行扫荡

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py |  257 +++++++++++++++++---------------------------------
 1 files changed, 89 insertions(+), 168 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
index 7a14d03..449c1c7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
@@ -18,7 +18,6 @@
 import GameWorld
 import ChConfig
 import PlayerControl
-import PlayerBillboard
 import ChPyNetSendPack
 import NetPackCommon
 import PlayerViewCacheTube
@@ -30,35 +29,20 @@
 import GameMap
 import NPCCommon
 import FBLogic
-import PlayerVip
 import IPY_GameWorld
 import PlayerActivity
+import ItemControler
 
-import time
+MaxRobotID = 100 # 最大机器人NPC定义ID
 
 def DoPlayerOnDay(curPlayer):
     checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)
     checkInCount = checkInInfo / 10 # 累计登记
     todayIsCheckIn = checkInInfo % 10 # 今天是否已登记
     if todayIsCheckIn:
-        checkInInfo = (checkInCount + 1) * 10 + 0
+        checkInInfo = checkInCount * 10 + 0
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)
         SyncCheckInState(curPlayer, 0, False)
-    
-    # 重置每日已获得仙缘币
-    ondaySetXianyuanCoin = 0
-    ondayLoginSetXianyuanCoin = curPlayer.GetDictByKey(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin)
-    if ondayLoginSetXianyuanCoin:
-        # 这里做时间比较,预防玩家登录后就没有再切换地图,再次在该地图过天会导致设置值错误问题
-        loginAddCoinTime = curPlayer.GetDictByKey(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime)
-        if GameWorld.CheckTimeIsSameServerDayEx(loginAddCoinTime):
-            ondaySetXianyuanCoin = ondayLoginSetXianyuanCoin
-            GameWorld.DebugLog("玩家过天时,登录增加仙缘币有值,仍然是同一天,仙缘币重置为登录时增加的仙缘币!ondayLoginSetXianyuanCoin=%s" % ondayLoginSetXianyuanCoin)
-        else:
-            GameWorld.DebugLog("玩家过天时,登录增加仙缘币有值,但是不是同一天了,仙缘币重置为0!")
-    PlayerControl.SetTodayXianyuanCoin(curPlayer, ondaySetXianyuanCoin)
-    GameWorld.DebugLog("玩家过天设置今日已获得仙缘币: ondaySetXianyuanCoin=%s,ondayLoginSetXianyuanCoin=%s" 
-                       % (ondaySetXianyuanCoin, ondayLoginSetXianyuanCoin))
     return
 
 def DoPlayerLogin(curPlayer):
@@ -88,13 +72,13 @@
         __OnHelpBattleCheckInResult(curPlayer, msgList, tick)
         
     # 刷新
-    if cmd == "Refresh":
+    elif cmd == "Refresh":
         __OnHelpBattleRefreshResult(curPlayer, msgList, tick)
         
-    # 助战记录
-    if cmd == "HelpRecord":
-        __OnHelpBattleRecord(curPlayer, msgList, tick)
-        
+    # 扫荡召唤
+    elif cmd == "SweepCall":
+        __OnHelpBattleSweepCallResult(curPlayer, msgList, tick)
+    
     return
 
 #// B1 05 助战登记 #tagCMHelpBattleCheckIn
@@ -194,10 +178,11 @@
             for robotID in helpNPCRobotIDList[:lackCount]:
                 calledPlayerDict[robotID] = 0     
                 
-        if calledCount + len(calledPlayerDict) < maxHelpPlayerCount:
-            GameWorld.ErrLog("无法一键召唤!人数不足! calledCount=%s,calledPlayerDict=%s,maxHelpPlayerCount=%s" 
-                             % (calledCount, calledPlayerDict, maxHelpPlayerCount), playerID)
-            return
+# 修改了规则,无社交人数及机器人人数做了限制,所以可能出现人数不足的情况,故屏蔽此判断
+#        if calledCount + len(calledPlayerDict) < maxHelpPlayerCount:
+#            GameWorld.ErrLog("无法一键召唤!人数不足! calledCount=%s,calledPlayerDict=%s,maxHelpPlayerCount=%s" 
+#                             % (calledCount, calledPlayerDict, maxHelpPlayerCount), playerID)
+#            return
     else:
         if calledPlayerID not in helpBattlePlayerDict:
             GameWorld.ErrLog("不存在该助战玩家,无法召唤!calledPlayerID=%s" % (calledPlayerID), playerID)
@@ -205,7 +190,8 @@
         helpPlayerInfoDict = helpBattlePlayerDict[calledPlayerID]
         if helpPlayerInfoDict.get("NeedGoldCall", 0):
             goldCallCost = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 5) # 付费召唤消耗仙玉,优先消耗绑玉
-            costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, goldCallCost)
+            # 恺英版改为直接扣绑玉灵石 2019/10/8
+            costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, goldCallCost)
             if not costMoneyList:
                 return
             
@@ -256,7 +242,7 @@
         NetPackCommon.SendFakePack(curPlayer, callResultPack)
         
     # 召唤满后
-    if calledCount >= maxHelpPlayerCount:
+    if calledCount >= len(helpBattlePlayerDict) or calledCount >= maxHelpPlayerCount:
         FBLogic.OnCallHelpBattleOK(curPlayer, tick)
         
     # 通知GameServer
@@ -321,7 +307,8 @@
         
         if refreshCount >= freeRefreshCount:
             costGold = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 3)
-            costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costGold)
+            # 恺英版改为直接扣绑玉灵石 2019/10/8
+            costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costGold)
             if not costMoneyList:
                 GameWorld.DebugLog("货币不足!无法刷新助战!")
                 return
@@ -394,151 +381,77 @@
     NetPackCommon.SendFakePack(curPlayer, helpPlayerListPack)
     return
 
-def __OnHelpBattleRecord(curPlayer, msgList, tick):
-    ## 助战记录同步
-    cmd, helpRecordList, isLogin = msgList
+def SendGameServer_SweepCallHelpBattlePlayer(curPlayer, mapID, funcLineID):
+    ## 发送GameServer请求扫荡助战玩家
+    ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)
+    if not ipyData:
+        return
     playerID = curPlayer.GetPlayerID()
-    GameWorld.DebugLog("__OnHelpBattleRecord %s,helpRecordList=%s" % (cmd, helpRecordList), playerID)
-    
-    addXianyuanCoinTotal = 0 # 累计需要增加的仙缘币
-    addXianyuanCoinTotalTotay = 0 # 累计需要增加的今日仙缘币
-    drList = []
-    
-    totalHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleTotalCount)
-    recordPack = ChPyNetSendPack.tagMCHelpBattleRecordList()
-    recordPack.RecordList = []
-    for recordInfo in helpRecordList:
-        callPlayerID, callPlayerName, mapID, funcLineID, xianyuanCoinAdd, relation, vipLV, recordTime = recordInfo
-        timeStr = GameWorld.ChangeTimeNumToStr(recordTime)
-        isSameDay = GameWorld.CheckTimeIsSameServerDayEx(recordTime)
-        
-        record = ChPyNetSendPack.tagMCHelpBattleRecord()
-        record.CallPlayerID = callPlayerID
-        record.CallPlayerName = callPlayerName
-        record.NameLen = len(record.CallPlayerName)
-        record.MapID = mapID
-        record.FuncLineID = funcLineID
-        record.XianyuanCoinAdd = xianyuanCoinAdd
-        record.Relation = relation
-        record.VIPLV = vipLV
-        record.HelpTime = timeStr
-        recordPack.RecordList.append(record)
-        drList.append({"CallPlayerID":callPlayerID, "MapID":mapID, "FuncLineID":funcLineID, "XianyuanCoinAdd":xianyuanCoinAdd, 
-                       "Relation":relation, "VIPLV":vipLV, "HelpTime":timeStr, "IsSameDay":isSameDay})
-        addXianyuanCoinTotal += xianyuanCoinAdd
-        if isSameDay:
-            addXianyuanCoinTotalTotay += xianyuanCoinAdd
-        totalHelpCount += 1
-        
-    recordPack.RecordCount = len(recordPack.RecordList)
-    NetPackCommon.SendFakePack(curPlayer, recordPack)
-    
-    addDataDict = {"HelpList":drList}
-    GameWorld.DebugLog("    addXianyuanCoinTotal=%s,addXianyuanCoinTotalTotay=%s,totalHelpCount=%s,isLogin=%s" 
-                       % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay, totalHelpCount, isLogin), playerID)
-    PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, addXianyuanCoinTotal, addDataDict=addDataDict, isSysHint=False)
-    if addXianyuanCoinTotalTotay:
-        PlayerControl.AddTodayXianyuanCoin(curPlayer, addXianyuanCoinTotalTotay)
-        if isLogin:
-            curPlayer.SetDict(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin, addXianyuanCoinTotalTotay)
-            curPlayer.SetDict(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime, int(time.time()))
-            GameWorld.Log("    登录时今日助战信息: addXianyuanCoinTotalTotay=%s" % (addXianyuanCoinTotalTotay), playerID)
-            
-    # 更新总助战次数,更新排行榜
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleTotalCount, totalHelpCount)
-    if totalHelpCount >= IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 4):
-        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FBHelpBattle, totalHelpCount)
+    msgInfo = str(["SweepCall", mapID, funcLineID])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
+    GameWorld.Log("SendGameServer_SweepCallHelpBattlePlayer %s" % (msgInfo), playerID)
     return
 
-def DoFBAddXianyuanCoin(curPlayer, mapID, lineID, isHelp=False):
-    '''真人挑战副本增加仙缘币,包含过关或助战(不含镜像助战)
-    @param isHelp: 是否助战的
-    @return: 获得的仙缘币, 无法获得仙缘币原因(1-达到助战次数上限,2-达到每日获得仙缘币上限)
-    '''
+def __OnHelpBattleSweepCallResult(curPlayer, msgList, tick):
+    ## 助战扫荡结果处理
+    cmd, mapID, funcLineID, helpBattlePlayerDict = msgList
     playerID = curPlayer.GetPlayerID()
+    GameWorld.DebugLog("__OnHelpBattleSweepCallResult %s,mapID=%s,funcLineID=%s,helpBattlePlayerDict=%s" 
+                       % (cmd, mapID, funcLineID, helpBattlePlayerDict), playerID)
+    
     fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID)
     if not fbFuncIpyData:
-        return 0, 0
+        return
     
-    reason = 0
-    addCoinRate = 10000 # 基础倍率
-    if not isHelp:
-        baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币
-    else:
-        baseFBPoint = fbFuncIpyData.GetHelpPoint() # 助战
-        dayHelpCountMax = fbFuncIpyData.GetDayHelpCountMax() # 真实助战每日可获得仙缘币次数
-        if dayHelpCountMax:
-            todayHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FBRealHelpCount % mapID)
-            if todayHelpCount >= dayHelpCountMax:
-                baseFBPoint = 0
-                reason = 1
-                GameWorld.DebugLog("达到每日助战可获得仙缘币次数上限!无法再获得!mapID=%s" % (mapID), playerID)
-            else:
-                todayHelpCount += 1
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FBRealHelpCount % mapID, todayHelpCount)
-                GameWorld.DebugLog("增加每日助战可获得仙缘币次数!mapID=%s,todayHelpCount=%s" % (mapID, todayHelpCount), playerID)
-                
-    xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限
-    relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} 
-    todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer) # 今日已获得仙缘币
-    playerXianyuanCoinUpper = xianyuanCoinUpper
-    if curPlayer.GetVIPLv():
-        playerXianyuanCoinUpper += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd)
-        addCoinRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinAddPer)
-        
-    #达到上限也需要记录,所以这里暂不限制
-    #if todayXianyuanCoin >= playerXianyuanCoinUpper:
-    #    GameWorld.DebugLog("玩家今日仙缘币已达上限!todayXianyuanCoin=%s,playerXianyuanCoinUpper=%s" 
-    #                       % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID)
-    #    return
+    assistPlayerIDList = []
+    for helpPlayerID in helpBattlePlayerDict.keys():
+        if helpPlayerID <= MaxRobotID:
+            continue
+        assistPlayerIDList.append(helpPlayerID)
+    __DoGivePlayerAssistLihe(curPlayer, mapID, funcLineID, assistPlayerIDList)
     
-    relation, relationAdd, relationPlayerID, relationPlayerName = 0, 0, 0, ""
+    #扫荡结果给奖励等
+    FBLogic.OnPlayerFBHelpBattleSweepResult(curPlayer, mapID, funcLineID, helpBattlePlayerDict)
+    return
+
+def DoFBHelpBattleFinish(curPlayer, mapID, lineID):
+    ## 副本助战完成
     
-    fbType = GameWorld.GetMap().GetMapFBType()
-    if fbType == IPY_GameWorld.fbtSingle:
-        gameFB = GameWorld.GetGameFB()
-        helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
-        for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():
-            objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
-            if not objID:
-                continue
-            relation = helpPlayerInfoDict.get("Relation", 0)
-            if not relation:
-                continue
-            relationAddList = relationCoinAddDict.get(str(relation), [])
-            relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
-    elif fbType == IPY_GameWorld.fbtTeam:
-        if playerID in PyGameData.g_teamFBMemRelationAddDict:
-            relation, relationAdd, relationPlayerID, relationPlayerName = PyGameData.g_teamFBMemRelationAddDict.pop(playerID)
-            
-    coinAdd = 0
-    if baseFBPoint:
-        coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0)
-    canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0)
-    coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币
-    if canAddMax == 0 and not reason:
-        reason = 2
-        
-    GameWorld.DebugLog("挑战副本增加仙缘币: baseFBPoint=%s,relationAdd=%s,addCoinRate=%s,coinAdd=%s,canAddMax=%s,coinAddReal=%s,relationPlayerID=%s" 
-                       % (baseFBPoint, relationAdd, addCoinRate, coinAdd, canAddMax, coinAddReal, relationPlayerID), playerID)
-    if coinAddReal:
-        addDataDict = {"MapID":mapID, "FuncLineID":lineID}
-        PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict)
-        PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal)
-        
-    # 通知自己获得仙缘币
-    msgPack = ChPyNetSendPack.tagMCAddXianyuanCoinMsg()
-    msgPack.MapID = mapID
-    msgPack.FuncLineID = lineID
-    msgPack.Relation = relation
-    msgPack.RelationCoinAdd = relationAdd
-    msgPack.XianyuanCoinAdd = coinAddReal
-    msgPack.Reason = reason
-    msgPack.CallPlayerID = relationPlayerID
-    msgPack.CallPlayerName = relationPlayerName
-    msgPack.NameLen = len(msgPack.CallPlayerName)
-    NetPackCommon.SendFakePack(curPlayer, msgPack)
-    return coinAddReal, reason
+    assistPlayerIDList = []
+    gameFB = GameWorld.GetGameFB()
+    playerID = curPlayer.GetPlayerID()
+    helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
+    for helpPlayerID in helpBattlePlayerDict.keys():
+        objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
+        if not objID:
+            continue
+        if helpPlayerID <= MaxRobotID:
+            continue
+        assistPlayerIDList.append(helpPlayerID)
+    __DoGivePlayerAssistLihe(curPlayer, mapID, lineID, assistPlayerIDList)
+    
+    return
+
+def __DoGivePlayerAssistLihe(curPlayer, mapID, lineID, assistPlayerIDList):
+    ## 给玩家协助礼盒奖励
+    
+    if not assistPlayerIDList:
+        return
+    
+    liheItemID = 0
+    mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
+    mapID = FBCommon.GetRecordMapID(mapID)
+    if str(mapID) in mapAssistGiftDict:
+        liheItemID = mapAssistGiftDict[str(mapID)][0]
+    if not liheItemID:
+        return
+    
+    ItemControler.GivePlayerItemOrMail(curPlayer, [[liheItemID, 1, 0]])
+    
+    msgInfo = str(["AssistFinish", liheItemID, mapID, lineID, assistPlayerIDList])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
+    return
+
 
 def __GetTeamFBMemRelationInfo(curPlayer, isHelp, leavePlayerID):
     ## 计算队员间相互加成信息,离线玩家不算
@@ -558,9 +471,12 @@
     familyID = curPlayer.GetFamilyID()
     if isHelp:
         # 助战的随便取一位优先级最高的即可
+        defaultRelationPlayerID = 0
         for memPlayerID, memFamilyID in memFamilyIDDict.items():
             memRelation, relationPlayerID = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)
             if not memRelation:
+                if not defaultRelationPlayerID and relationPlayerID:
+                    defaultRelationPlayerID = relationPlayerID
                 continue
             relation = memRelation
             relationAddList = relationCoinAddDict.get(str(memRelation), [])
@@ -568,6 +484,9 @@
             relationPlayerName = memNameDict[relationPlayerID]
             return relation, relationAdd, relationPlayerID, relationPlayerName
         
+        relationPlayerID = defaultRelationPlayerID
+        relationPlayerName = memNameDict.get(relationPlayerID, "")
+        GameWorld.DebugLog("助战默认无关系队员: relationPlayerID=%s,relationPlayerName=%s" % (relationPlayerID, relationPlayerName), playerID)
     else:
         # 非助战享受所有队员加成
         for memPlayerID, memFamilyID in memFamilyIDDict.items():
@@ -587,6 +506,8 @@
     ## 离线玩家不算社交关系
     if leavePlayerID and memPlayerID == leavePlayerID:
         return 0, 0
+    if playerID == memPlayerID:
+        return 0, 0
     memPlayer = playerManager.FindPlayerByID(memPlayerID)
     if memPlayer == None or memPlayer.IsEmpty():
         return 0, 0
@@ -597,7 +518,7 @@
         if checkRelation == 2:
             if playerID != memPlayerID and familyID and familyID == memFamilyID:
                 return checkRelation, memPlayerID            
-    return 0, 0
+    return 0, memPlayerID
 
 def RefershTeamFBMemRelation(tick, leavePlayerID=0):
     ## 刷新组队副本队员关系

--
Gitblit v1.8.0