ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
@@ -28,6 +28,7 @@
import NetPackCommon
import PyDataManager
import PlayerControl
import GameXiangong
import PyGameData
import ChConfig
import ChPlayer
@@ -90,7 +91,8 @@
AwwardType_Guess, # 竞猜
AwwardType_PlayerHurt, # 个人伤害排行
AwwardType_FamilyScore, # 仙盟积分排行
) = range(3)
AwwardType_Like, # 点赞
) = range(4)
class FamilyGCZFighter(object):
@@ -247,9 +249,8 @@
        return True
    
    def SetPlayerInCity(self, playerID, serverGroupID):
        if playerID in self.inCityPlayerIDList:
            return
        self.inCityPlayerIDList.append(playerID)
        if playerID not in self.inCityPlayerIDList:
            self.inCityPlayerIDList.append(playerID)
        Sync_FamilyGCZBatCityInfo(self.zoneID, self.batType, self.groupNum, self.cityID, toPlayerServerDict={playerID:serverGroupID})
        return
    
@@ -492,9 +493,8 @@
        return newCity
    
    def SetPlayerInScene(self, playerID, serverGroupID):
        if playerID in self.inBatScenePlayerIDList:
            return
        self.inBatScenePlayerIDList.append(playerID)
        if playerID not in self.inBatScenePlayerIDList:
            self.inBatScenePlayerIDList.append(playerID)
        Sync_FamilyGCZBatSceneInfo(self.zoneID, self.batType, self.groupNum, toPlayerServerDict={playerID:serverGroupID})
        return
    
@@ -1287,9 +1287,15 @@
    value5 = joinFamily.serverID
    groupValue1 = joinFamily.zoneID
    groupValue2 = GetRoundHurtGroupID(joinFamily.batType, joinFamily.groupNum)
    roundTotalHurt = sum(joinFamily.cityWall.fighterHurtDict.values())
    cmpValue = roundTotalHurt / ChConfig.Def_PerPointValue
    cmpValue2 = roundTotalHurt % ChConfig.Def_PerPointValue
    memHurtTotal = sum(joinFamily.cityWall.fighterHurtDict.values())
    cityRemainHPPer = 0
    if joinFamily.cityWall.hpMax:
        cityRemainHPPer = joinFamily.cityWall.hp / float(joinFamily.cityWall.hpMax)
    familyRoundHurt = eval(IpyGameDataPY.GetFuncCompileCfg("FamilyGCZCity", 3))
    GameWorld.DebugLog("计算仙盟轮次伤害榜值: familyID=%s,familyRoundHurt=%s,memHurtTotal=%s,cityRemainHPPer=%s, %s/%s"
                       % (dataID, familyRoundHurt, memHurtTotal, cityRemainHPPer, joinFamily.cityWall.hp, joinFamily.cityWall.hpMax))
    cmpValue = familyRoundHurt / ChConfig.Def_PerPointValue
    cmpValue2 = familyRoundHurt % ChConfig.Def_PerPointValue
    cmpValue3 = joinFamily.sortWeight
    CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_FamilyGCZRoundHurt, groupValue1, dataID, name1, name2, type2, value1, value2,
                                     cmpValue, cmpValue2, cmpValue3, groupValue2=groupValue2, id2=id2, autoSort=True, value3=value3, value5=value5)
@@ -1468,7 +1474,8 @@
    guessRankMax = IpyGameDataPY.GetFuncCfg("FamilyGCZGuess", 2)
    billboardMgr = PyDataManager.GetCrossBillboardManager()
    scoreBillObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_FamilyGCZScore, zoneID)
    for index in range(guessRankMax):
    guessCnt = min(scoreBillObj.GetCount(), guessRankMax)
    for index in range(guessCnt):
        billData = scoreBillObj.At(index)
        familyID = billData.ID
        if familyID not in zone.familyGuessDict:
@@ -1855,7 +1862,11 @@
                           % (remainHurtTotal, killCnt, curCity.atkReportDict, tagCity.defReportDict))
        
    GameWorld.DebugLog("cityHP=%s/%s,atkedGuardIDList=%s" % (tagCity.hp, tagCity.hpMax, atkedGuardIDList))
    if tagFamilyID:
        tagJoinFamily = zone.GetZoneJoinFamily(tagFamilyID)
        if tagJoinFamily:
            UndFamilyRoundHurtBillboard(tagJoinFamily) # 榜单伤害受城池血量影响,所以被攻击方也要更新榜单
    for memID, memHurt in memHurtDict.items():
        GameWorld.DebugLog("攻击方成员输出: memID=%s,%s" % (memID, memHurt))
        joinMember = zone.GetZoneJoinMember(memID)
@@ -1875,6 +1886,8 @@
            
    if not curCity.IsBroken():
        UndFamilyRoundHurtBillboard(curJoinFamily)
    else:
        GameWorld.DebugLog("    攻击方仙盟城池已被摧毁,不再累加本轮仙盟伤害榜值! familyID=%s" % curFamilyID)
        
    if not CheckXiuluoCity(zoneID, curRound, batType, groupNum, gmPlayerID):
        Sync_FamilyGCZBatSceneInfo(zoneID, batType, groupNum)
@@ -2052,6 +2065,9 @@
        hurtDict[tagCityID] = oneHurtTotal # 飘血按伤害
        # 通知被攻击盟成员大本营城池信息
        if tagCity.familyID:
            tagJoinFamily = zone.GetZoneJoinFamily(tagCity.familyID)
            if tagJoinFamily:
                UndFamilyRoundHurtBillboard(tagJoinFamily) # 榜单伤害受城池血量影响,所以被攻击方也要更新榜单
            Sync_FamilyGCZCampInfo(zoneID, tagCity.familyID, defMemIDList=atkedGuardIDList)
        Sync_FamilyGCZBatCityInfo(zoneID, batType, groupNum, tagCityID, AtkRet_OK, playerID, oneHurtTotal, killCnt)
        
@@ -2246,6 +2262,7 @@
        scenePlayer = ChPyNetSendPack.tagGCFamilyGCZBatScenePlayer()
        scenePlayer.PlayerID = playerID
        scenePlayer.Name = joinMember.playerName
        scenePlayer.Job = joinMember.job
        scenePlayer.Face = joinMember.face
        scenePlayer.FacePic = joinMember.facePic
        clientPack.PlayerInfoList.append(scenePlayer)
@@ -2467,7 +2484,11 @@
    # 竞猜
    if awardType == AwwardType_Guess:
        awardTemplateID = ipyDataInfo.get("GuessTemplateID", 0)
        __clientServer_GetAward_Guess(zoneID, playerID, serverGroupID, actID, state, awardType, awardTemplateID)
        playerAwardID, awardItemList = GetGuessAwardInfo(zoneID, state, awardTemplateID, playerID)
        if not awardItemList:
            GameWorld.ErrLog("仙盟攻城战玩家没有竞猜奖励! zoneID=%s" % (zoneID), playerID)
            return
        __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, playerAwardID, awardItemList)
        return
    
    gczMgr = GetFamilyGCZMgr()
@@ -2497,6 +2518,12 @@
        billboardType = ShareDefine.Def_CBT_FamilyGCZScore
        awardTemplateID = ipyDataInfo.get("FamilyTemplateID", 0)
        
    # 点赞奖励
    elif awardType == AwwardType_Like:
        awardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZGuess", 4)
        __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, 0, awardItemList)
        return
    else:
        return
    
@@ -2518,30 +2545,25 @@
    if not playerAwardItemList:
        return
    
    GameWorld.Log("仙盟攻城战玩家请求领取奖励! zoneID=%s,awardType=%s,playerAwardItemList=%s"
                  % (zoneID, awardType, playerAwardItemList), playerID)
    __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, billRank, playerAwardItemList)
    
    joinMember.awardState = joinMember.awardState | pow(2, awardType) # 标记已推送
    msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":billRank,
               "awardItemList":playerAwardItemList, "fmLV":fmLV}
    Send_CrossServerMsg_FamilyGCZ("FamilyGCZAward", msgInfo, [serverGroupID])
    serverIDList = actInfo.get(ShareDefine.ActKey_ServerIDRangeList, [])
    GameXiangong.AddXiangongPlayerByItem(playerAwardItemList, playerID, serverIDList, billRank)
    return
def __clientServer_GetAward_Guess(zoneID, playerID, serverGroupID, actID, state, awardType, guessTemplateID):
    ## 竞猜领奖
    playerAwardID, awardItemList = GetGuessAwardInfo(zoneID, state, guessTemplateID, playerID)
    if not awardItemList:
        GameWorld.ErrLog("仙盟攻城战玩家没有竞猜奖励! zoneID=%s" % (zoneID), playerID)
        return
    GameWorld.Log("仙盟攻城战玩家请求领取竞猜奖励! zoneID=%s,playerAwardID=%s,awardItemList=%s"
                  % (zoneID, playerAwardID, awardItemList), playerID)
def __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, awardValue, awardItemList):
    ## 同步子服领奖结果
    gczMgr = GetFamilyGCZMgr()
    zone = gczMgr.GetActZone(zoneID)
    joinMember = zone.GetZoneJoinMember(playerID)
    fmLV = 0
    if joinMember:
        fmLV = joinMember.fmLV
        joinMember.awardState = joinMember.awardState | pow(2, awardType) # 标记已推送
    msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":playerAwardID, "awardItemList":awardItemList}
    GameWorld.Log("仙盟攻城战玩家请求领取奖励! zoneID=%s,awardType=%s,awardValue=%s,awardItemList=%s"
                  % (zoneID, awardType, awardValue, awardItemList), playerID)
    msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":awardValue,
               "awardItemList":awardItemList, "fmLV":fmLV}
    Send_CrossServerMsg_FamilyGCZ("FamilyGCZAward", msgInfo, [serverGroupID])
    return
@@ -2598,6 +2620,9 @@
                paramList = [billRank]
                PlayerCompensation.SendMailByKey("FamilyGCZAwardHurt", [playerID], playerAwardItemList, paramList, crossMail=True)
                
                serverIDList = ipyData.GetServerIDRangeList()
                GameXiangong.AddXiangongPlayerByItem(playerAwardItemList, playerID, serverIDList, billRank)
        # 仙盟积分名次奖励
        if not joinMember.awardState&pow(2, AwwardType_FamilyScore):
            joinMember.awardState = joinMember.awardState | pow(2, AwwardType_FamilyScore)
@@ -2610,6 +2635,9 @@
            if playerAwardItemList:
                paramList = [billRank]
                PlayerCompensation.SendMailByKey("FamilyGCZAwardScore", [playerID], playerAwardItemList, paramList, crossMail=True)
                serverIDList = ipyData.GetServerIDRangeList()
                GameXiangong.AddXiangongPlayerByItem(playerAwardItemList, playerID, serverIDList, billRank)
                
        # 竞猜奖励
        if not joinMember.awardState&pow(2, AwwardType_Guess):
@@ -2899,6 +2927,7 @@
        defMem.PlayerID = playerID
        defMem.Name = joinMember.playerName
        defMem.FamilyLV = joinMember.fmLV
        defMem.Job = joinMember.job
        defMem.Face = joinMember.face
        defMem.FacePic = joinMember.facePic
        defMem.FightPower = joinMember.fightPower % ChConfig.Def_PerPointValue