8346 【恺英】【后端】协助系统(副本协助奖励仅在发起玩家在线时才结算;增加协助玩家协助状态设置; 跨服服务器暂屏蔽发起协助)
5个文件已修改
174 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py 134 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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)
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)
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
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]])
        
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:
        #默认回满血