From 388823edfe6308cba6f76ca6dc4f20022c5cb2be Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 30 六月 2025 19:03:50 +0800 Subject: [PATCH] 10431 【英文】看广告获得限时代金券 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py | 510 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 373 insertions(+), 137 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py index 152d079..baaae80 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py @@ -26,13 +26,13 @@ import NetPackCommon import PlayerControl import PlayerFamily +import AuctionHouse import ShareDefine import PyGameData import ChConfig import random import copy - ''' 1. 仙盟改名 @@ -56,7 +56,7 @@ FamilyWarState_SecondRoundOver = 23 # 次轮结束 FamilyWarState_NextWeekGroupRank = 99 # 下周分组定级 -''' 对战记录 +''' 对战记录 Def_UniversalGameRecType_FamilyWarBattle value1 组级别 value2 第几轮 value3 家族ID1 @@ -83,13 +83,14 @@ def GetBatRecDissolutionID(recData): return [] if not recData.GetStrValue3() else eval(recData.GetStrValue3()) # 解散的家族ID列表 [familyID, ...] def SetBatRecDissolutionID(recData, dissFamilyIDList): return recData.SetStrValue3(str(dissFamilyIDList)) -''' 王者仙盟 +''' 王者仙盟 Def_UniversalGameRecType_FamilyWarChampion value1 家族ID value2 盟主ID value3 连胜次数 value4 已分配到的连胜次数 value5 终结连胜的奖励次数, 只能获得这一次的连胜奖励,有值才显示,分配后设置为0, 优先分配 strValue1 仙盟名 +strValue2 仙盟徽章 ''' def GetFWChampionFamilyID(championRecData): return championRecData.GetValue1() def SetFWChampionFamilyID(championRecData, familyID): return championRecData.SetValue1(familyID) @@ -103,6 +104,19 @@ def SetFWChampionEndWinCount(championRecData, endWinCount): return championRecData.SetValue5(endWinCount) def GetFWChampionFamilyName(championRecData): return championRecData.GetStrValue1() def SetFWChampionFamilyName(championRecData, familyName): return championRecData.SetStrValue1(familyName) +def SetFWChampionFamilyEmblemID(championRecData, emblemID): return championRecData.SetStrValue2(str(emblemID)) + +''' 参赛人员 Def_UniversalGameRecType_FamilyWarMember +value1 玩家ID +value2 仙盟ID +value3 是否有参与 +''' +def GetFWMemPlayerID(recData): return recData.GetValue1() +def SetFWMemPlayerID(recData, playerID): return recData.SetValue1(playerID) +def GetFWMemFamilyID(recData): return recData.GetValue2() +def SetFWMemFamilyID(recData, familyID): return recData.SetValue2(familyID) +def GetFWMemIsJoin(recData): return recData.GetValue3() +def SetFWMemIsJoin(recData, isJoin): return recData.SetValue3(isJoin) #------------------------------------------------------------------------------- def OnGameServerInitOK(): @@ -116,14 +130,14 @@ warMemRecList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarMember) for i in xrange(warMemRecList.Count()): recData = warMemRecList.At(i) - warPlayerID = recData.GetValue1() - warFamilyID = recData.GetValue2() + warPlayerID = GetFWMemPlayerID(recData) + warFamilyID = GetFWMemFamilyID(recData) if warFamilyID not in PyGameData.g_familyWarFamilyIDList: PyGameData.g_familyWarFamilyIDList.append(warFamilyID) - PyGameData.g_familyWarMemDict[warPlayerID] = warFamilyID + PyGameData.g_familyWarMemDict[warPlayerID] = recData GameWorld.Log("加载仙盟联赛参赛仙盟ID: %s" % PyGameData.g_familyWarFamilyIDList) - GameWorld.Log("加载仙盟联赛参赛仙盟玩家: %s" % PyGameData.g_familyWarMemDict) + #GameWorld.Log("加载仙盟联赛参赛仙盟玩家: %s" % PyGameData.g_familyWarMemDict) return def DoFamilyWarReset(isDelRec=True): @@ -141,6 +155,7 @@ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 0) + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV, 0) if isDelRec: GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle) GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarChampion) @@ -156,7 +171,7 @@ if playerID not in PyGameData.g_familyWarMemDict: PlayerControl.NotifyCode(curPlayer, "PlayerNotInFamilyWarMemList") return False - warFamilyID = PyGameData.g_familyWarMemDict[playerID] + warFamilyID = GetFWMemFamilyID(PyGameData.g_familyWarMemDict[playerID]) if familyID != warFamilyID: PlayerControl.NotifyCode(curPlayer, "PlayerWarFamilyIDIsChange") return False @@ -172,13 +187,17 @@ def OnPlayerLogin(curFamily, curPlayer): CheckPlayerJoinFamilyWarInfo(curPlayer) + gameWorld = GameWorld.GetGameWorld() + state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar) + if state: + Sync_FamilyWarInfo(curPlayer) return def CheckPlayerJoinFamilyWarInfo(curPlayer): playerID = curPlayer.GetPlayerID() if playerID not in PyGameData.g_familyWarMemDict: return - joinFamilyID = PyGameData.g_familyWarMemDict[playerID] + joinFamilyID = GetFWMemFamilyID(PyGameData.g_familyWarMemDict[playerID]) if not joinFamilyID or curPlayer.GetFamilyID() == joinFamilyID: return @@ -223,10 +242,10 @@ if familyWarRank: GameWorld.Log("解散仙盟,触发更新仙盟联赛排名: delFamilyID=%s,familyWarRank=%s" % (familyID, familyWarRank)) - PlayerFamily.UpdFamilyWarRank() + UpdFamilyWarRank() # 补发未分配的连胜奖励 - AllotWinRewardBySystem(GetFamilyWarChampionRecData(), True) + #AllotWinRewardBySystem(GetFamilyWarChampionRecData(), True) return def OnChangeFamilyLeader(familyID, leaderID): @@ -294,7 +313,9 @@ # 下周分组定级 elif stateValue == FamilyWarState_NextWeekGroupRank: - DoLogicFamilyWar_NextWeekGroupRank() + pass + #废弃该阶段逻辑,因为不再支持单次活动周期跨天,所以改为过天时触发检查一下即可 + #DoLogicFamilyWar_NextWeekGroupRank() else: GameWorld.ErrLog("不存在该仙盟联赛状态!stateValue=%s" % stateValue) @@ -401,7 +422,9 @@ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 0) # 新一轮开始,重置状态 PlayerFamily.DoFamilySort() # 首轮分组前需要强制刷新一次仙盟排行 - lastFamilyWarMemDict = copy.deepcopy(PyGameData.g_familyWarMemDict) + lastFamilyWarMemDict = {} + for warPlayerID, recData in PyGameData.g_familyWarMemDict.items(): + lastFamilyWarMemDict[warPlayerID] = GetFWMemFamilyID(recData) PyGameData.g_familyWarMemDict = {} PyGameData.g_familyWarFamilyIDList = [] universalRecMgr = GameWorld.GetUniversalRecMgr() @@ -412,28 +435,38 @@ groupID = FamilyWar_MaxGroupID groupFamilyList = [] + warFamilyMemInfo = {} #直接取排行榜前X名作为联赛仙盟名单 familyMgr = GameWorld.GetFamilyManager() sortFamilyIDList = PlayerFamily.GetSortFamilyIDList() familyCount = len(sortFamilyIDList) + joinFamilyLVLimit = IpyGameDataPY.GetFuncCfg("FamilyMatchSet", 1) + GameWorld.DebugLog("最低参赛仙盟等级: %s" % joinFamilyLVLimit) for i, familyID in enumerate(sortFamilyIDList): family = familyMgr.FindFamily(familyID) if not family: GameWorld.ErrLog("仙盟联赛首轮分组时无法找到该仙盟: i=%s,familyID=%s" % (i, familyID)) continue - groupFamilyList.append(family) - - # 添加参赛仙盟及成员名单 - PyGameData.g_familyWarFamilyIDList.append(familyID) - for index in xrange(family.GetCount()): - curMember = family.GetAt(index) - memPlayerID = curMember.GetPlayerID() - memPlayer = curMember.GetPlayer() - isAddOK = AddFamilyWarMem(memPlayerID, familyID, warMemRecList) - lastJoinFamilyID = lastFamilyWarMemDict.get(memPlayerID, 0) - # 重新通知玩家参与的仙盟 - if lastJoinFamilyID and isAddOK and lastJoinFamilyID != familyID and memPlayer: - __NotifyPlayerJoinFamilyInfo(memPlayer, familyID) + if family.GetLV() < joinFamilyLVLimit: + GameWorld.Log("仙盟等级不足,无法参与联赛!familyID=%s,LV=%s,joinFamilyLVLimit=%s" % (familyID, family.GetLV(), joinFamilyLVLimit)) + else: + groupFamilyList.append(family) + + # 添加参赛仙盟及成员名单 + PyGameData.g_familyWarFamilyIDList.append(familyID) + warMemIDList = [] + for index in xrange(family.GetCount()): + curMember = family.GetAt(index) + memPlayerID = curMember.GetPlayerID() + memPlayer = curMember.GetPlayer() + isAddOK = AddFamilyWarMem(memPlayerID, familyID, warMemRecList) + lastJoinFamilyID = lastFamilyWarMemDict.get(memPlayerID, 0) + # 重新通知玩家参与的仙盟 + if lastJoinFamilyID and isAddOK and lastJoinFamilyID != familyID and memPlayer: + __NotifyPlayerJoinFamilyInfo(memPlayer, familyID) + if isAddOK: + warMemIDList.append(memPlayerID) + warFamilyMemInfo[familyID] = warMemIDList # 满一组仙盟数 or 没有仙盟了 if len(groupFamilyList) == FamilyWar_GroupFamilyCount or i == familyCount - 1: @@ -445,11 +478,18 @@ # 下一组 groupID -= 1 groupFamilyList = [] - + + worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV, worldLV) # 设置分组时的世界等级 + GameWorld.Log(" PyGameData.g_familyWarFamilyIDList: %s" % PyGameData.g_familyWarFamilyIDList) - GameWorld.Log(" PyGameData.g_familyWarMemDict: %s" % PyGameData.g_familyWarMemDict) + GameWorld.Log(" warFamilyMemInfo: %s" % warFamilyMemInfo) + GameWorld.Log(" 通用记录对战家族数: %s" % warBatRecList.Count()) + GameWorld.Log(" 通用记录参与玩家数: %s" % warMemRecList.Count()) + GameWorld.Log(" 当前世界等级: %s" % worldLV) GameWorld.Log(" 仙盟联赛首轮比赛分组确认完毕!") PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, FamilyWarRound_First) # 设置已处理过的轮次 + Sync_FamilyWarInfo() return def AddFamilyWarMem(playerID, familyID, warMemRecList=None): @@ -459,18 +499,38 @@ return if playerID in PyGameData.g_familyWarMemDict: GameWorld.DebugLog("本周已经添加过该成员所属参赛仙盟,不重复添加!playerID=%s,familyID=%s,warFamilyID=%s" - % (playerID, familyID, PyGameData.g_familyWarMemDict[playerID])) + % (playerID, familyID, GetFWMemFamilyID(PyGameData.g_familyWarMemDict[playerID]))) return if not warMemRecList: warMemRecList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarMember) if not warMemRecList: return recData = warMemRecList.AddRec() - recData.SetValue1(playerID) - recData.SetValue2(familyID) - PyGameData.g_familyWarMemDict[playerID] = familyID # 设置玩家对应的仙盟ID,本周联赛只能在该仙盟时才能进入战场 + SetFWMemPlayerID(recData, playerID) + SetFWMemFamilyID(recData, familyID) + PyGameData.g_familyWarMemDict[playerID] = recData # 设置玩家对应的仙盟ID,本周联赛只能在该仙盟时才能进入战场 GameWorld.DebugLog(" 添加仙盟联赛战斗人员: playerID=%s,familyID=%s" % (playerID, familyID)) return True + +def OnPlayerChangeMap(curPlayer): + ## 玩家进入仙盟联赛地图 + if curPlayer.GetMapID() != ChConfig.Def_FBMapID_FamilyWar: + return + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if playerID not in PyGameData.g_familyWarMemDict: + return + recData = PyGameData.g_familyWarMemDict[playerID] + if GetFWMemIsJoin(recData): + GameWorld.DebugLog("已经进入过仙盟联赛战场! ", playerID) + return + warFamilyID = GetFWMemFamilyID(recData) + if familyID != warFamilyID: + GameWorld.DebugLog("进入战场时参赛仙盟ID不一致! familyID=%s,warFamilyID=%s" % (familyID, warFamilyID), playerID) + return + SetFWMemIsJoin(recData, 1) + GameWorld.Log("玩家进入仙盟联赛战场: familyID=%s" % (familyID), playerID) + return def __DoFristRoundRandBattle(warBatRecList, groupID, groupFamilyList): ## 执行首轮联赛分组仙盟随机匹配比赛, 两两随机 @@ -720,6 +780,10 @@ return +def DoOnDay(): + DoLogicFamilyWar_NextWeekGroupRank() + return + def DoLogicFamilyWar_NextWeekGroupRank(): ''' 下周分组定级 最低级别组: 不设置联赛级别, 下周最低级别组名单由其他无联赛级别仙盟总战力排行得到 @@ -728,7 +792,35 @@ # 这里补触发一次,防止总结算的时候服务器异常没有成功结算 # 或 次轮没有比赛导致没有结算(次轮的仙盟都解散了才可能出现,一般不可能出现,可不考虑,如果真出现了,会在周六凌晨结算) __DoLogicFamilyWarAllOver() - PlayerFamily.UpdFamilyWarRank() + #UpdFamilyWarRank() + return + +def UpdFamilyWarRank(): + '''更新仙盟联赛排名 + 注意:该逻辑在仙盟联赛周期中不可执行,仅在下周分组定级状态下可更新,由程序控制,在活动结束后结算调用 + 仙盟联赛新一周期开始时、仙盟解散时 会触发该逻辑 + ''' + #gameWorld = GameWorld.GetGameWorld() + #state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar) + #if state != GameWorldFamilyWar.FamilyWarState_NextWeekGroupRank: + # GameWorld.DebugLog("非下周分组定级阶段不可更新仙盟联赛排名!") + # return + + GameWorld.Log("=== 更新仙盟联赛排名 ===") + + familyMgr = GameWorld.GetFamilyManager() + sortFamilyIDList = PlayerFamily.GetSortFamilyIDList() + for rank, familyID in enumerate(sortFamilyIDList, 1): + family = familyMgr.FindFamily(familyID) + if not family: + continue + curRank = PlayerFamily.GetFamilyWarRank(family) + if not curRank: + break + if curRank != rank: + PlayerFamily.SetFamilyWarRank(family, rank) + GameWorld.Log(" 更新仙盟联赛仙盟排名: familyID=%s,curRank=%s,updRank=%s" % (family.GetID(), curRank, rank)) + return def __DoLogicFamilyWarAllOver(): @@ -753,6 +845,10 @@ warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle) if not warBatRecList.Count(): GameWorld.Log("没有仙盟联赛比赛记录,不需要结算!") + curRoundNum = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round) + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) # 重置对战轮次 + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 1) # 设置已经处理过总结算 + GameWorld.Log("重置轮次信息,设置已结算!curRoundNum=%s" % curRoundNum) return for i in xrange(warBatRecList.Count()): recData = warBatRecList.At(i) @@ -814,8 +910,9 @@ GameWorld.Log("除0后仙盟ID: %s" % familyWarIDRankList) # 5. 截取到倒数第二组,最后一组下周由战力决定 - familyWarIDRankList = familyWarIDRankList[:(FamilyWar_MaxFamilyCount - FamilyWar_GroupFamilyCount)] + updFamilyIDRankList = familyWarIDRankList[:(FamilyWar_MaxFamilyCount - FamilyWar_GroupFamilyCount)] GameWorld.Log("最终的排名仙盟ID: %s" % familyWarIDRankList) + GameWorld.Log("更新的排名仙盟ID: %s" % updFamilyIDRankList) GameWorld.Log(" 解散的仙盟ID: %s" % allDissFamilyIDList) # 注意: familyWarIDRankList 这个列表里的仙盟ID可能是已经解散的,但是在当前情况下还需要占用该联赛组的名额,直到下周分组定级才被顶掉 @@ -832,13 +929,13 @@ if not lastRank: break updFamilyIDList.append(familyID) - updRank = 0 if familyID not in familyWarIDRankList else (familyWarIDRankList.index(familyID) + 1) + updRank = 0 if familyID not in updFamilyIDRankList else (updFamilyIDRankList.index(familyID) + 1) if updRank != lastRank: PlayerFamily.SetFamilyWarRank(family, updRank) GameWorld.Log("更新仙盟评级: familyID=%s,lastRank=%s,updRank=%s" % (familyID, lastRank, updRank)) # 再更新本周新晋的联赛排名 - for updRank, familyID in enumerate(familyWarIDRankList, 1): + for updRank, familyID in enumerate(updFamilyIDRankList, 1): if familyID in updFamilyIDList: continue family = familyMgr.FindFamily(familyID) @@ -854,9 +951,12 @@ if familyWarIDRankList: UpdFamilyWarChampion(familyWarIDRankList[0]) + GiveFamilyWinRankAuctionReward(familyWarIDRankList) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) # 重置对战轮次 PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 1) # 设置已经处理过总结算 + + UpdFamilyWarRank() # 改为比赛结束后默认更新联赛排名 return def UpdFamilyWarChampion(championFamilyID): @@ -868,13 +968,15 @@ GameWorld.Log("上周冠军仙盟ID: %s" % lastChampionFamilyID) GameWorld.Log("本周冠军仙盟ID: %s" % championFamilyID) winCount = GetFWChampionWinCount(championRecData) + rewardWinCount = winCount + 1 + GiveFamilyWinCountAuctionReward(championFamilyID, rewardWinCount) if lastChampionFamilyID == championFamilyID: winCount += 1 SetFWChampionWinCount(championRecData, winCount) GameWorld.Log(" 更新连胜: %s" % winCount) - AllotWinRewardBySystem(championRecData, False) + #AllotWinRewardBySystem(championRecData, False) else: - AllotWinRewardBySystem(championRecData, True) + #AllotWinRewardBySystem(championRecData, True) SetFWChampionFamilyID(championRecData, championFamilyID) SetFWChampionWinCount(championRecData, 1) SetFWChampionWinRewardAllot(championRecData, 0) @@ -890,6 +992,7 @@ championFamilyName = family.GetName() SetFWChampionLeaderID(championRecData, family.GetLeaderID()) SetFWChampionFamilyName(championRecData, championFamilyName) + SetFWChampionFamilyEmblemID(championRecData, PlayerFamily.GetFamilyEmblemID(family)) else: GameWorld.Log(" 冠军仙盟不存在或已经解散了!") @@ -908,6 +1011,128 @@ PlayerControl.WorldNotify(0, "FamilyMatchSecondSessionEnd", [championFamilyName]) return +def GiveFamilyWinCountAuctionReward(familyID, rewardWinCount): + ## 给仙盟连胜仙盟拍品奖励 + + winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数 + winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数 + + rewardIndex = -1 + + if rewardWinCount == winRewardStartCount: + rewardIndex = 0 + elif rewardWinCount > winRewardStartCount: + winCountValue = rewardWinCount - winRewardStartCount + if winCountValue % winRewardSpaceCount == 0: + rewardIndex = winCountValue / winRewardSpaceCount + + if rewardIndex == -1: + GameWorld.Log("不需要发放连胜仙盟拍品奖励: familyID=%s,rewardWinCount=%s" % (familyID, rewardWinCount)) + return + + winRewardLoopList = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 4) # 连胜仙盟拍品循环奖励[[[拍品ID,个数], ...], ...] + loopIndex = rewardIndex % len(winRewardLoopList) + familyAuctionItemList = winRewardLoopList[loopIndex] + family = GameWorld.GetFamilyManager().FindFamily(familyID) + if not family: + return + + familyAllPlayerIDList = [] + familyPlayerIDList = [] + for i in xrange(family.GetCount()): + member = family.GetAt(i) + memPlayerID = member.GetPlayerID() + if memPlayerID not in PyGameData.g_familyWarMemDict: + continue + familyAllPlayerIDList.append(memPlayerID) + recData = PyGameData.g_familyWarMemDict[memPlayerID] + if GetFWMemFamilyID(recData) != familyID: + continue + if not GetFWMemIsJoin(recData): + continue + familyPlayerIDList.append(memPlayerID) + if not familyPlayerIDList: + familyPlayerIDList = familyAllPlayerIDList + GameWorld.Log("连胜没有人参赛,收益算仙盟所有人的!familyID=%s,familyAllPlayerIDList=%s" % (familyID, familyAllPlayerIDList)) + + familyAuctionItemDict = {} # {仙盟ID:[[享受收益的成员ID, ...], [[拍品ID,个数], [拍品ID,个数,是否拍品], ...]], ...} + familyAuctionItemDict[familyID] = [familyPlayerIDList, familyAuctionItemList] + GameWorld.Log("发放连胜仙盟拍品奖励: familyID=%s,rewardWinCount=%s,rewardIndex=%s,loopIndex=%s" + % (familyID, rewardWinCount, rewardIndex, loopIndex)) + GameWorld.Log(" familyPlayerIDList=%s" % familyPlayerIDList) + GameWorld.Log(" familyAuctionItemList=%s" % familyAuctionItemList) + AuctionHouse.DoAddFamilyAuctionItem(ChConfig.Def_FBMapID_FamilyWar, familyAuctionItemDict) + return + +def GiveFamilyWinRankAuctionReward(familyWarIDRankList): + ## 给仙盟排名仙盟拍品奖励 + + warWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV) + rewardWorldLV = 0 + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in xrange(ipyDataMgr.GetFamilyWarRankAwardCount()): + ipyData = ipyDataMgr.GetFamilyWarRankAwardByIndex(index) + cfgWorldLV = ipyData.GetWarWorldLV() + if warWorldLV <= cfgWorldLV: + rewardWorldLV = cfgWorldLV + break + elif warWorldLV > cfgWorldLV: + rewardWorldLV = cfgWorldLV + GameWorld.Log("发放排名仙盟拍品奖励: warWorldLV=%s, rewardWorldLV=%s, familyWarIDRankList=%s" % (warWorldLV, rewardWorldLV, familyWarIDRankList)) + + rewardIpyDataList = IpyGameDataPY.GetIpyGameDataList("FamilyWarRankAward", rewardWorldLV) + if not rewardIpyDataList: + GameWorld.ErrLog("找不到仙盟排名对应世界等级奖励!") + return + + cfgRankKey = 1 + cfgRankAuctionItemDict = {} + for ipyData in rewardIpyDataList: + warRank = ipyData.GetWarRank() + auctionItemList = ipyData.GetRankAuctionItem() + for rank in range(cfgRankKey, warRank + 1): + cfgRankAuctionItemDict[rank] = auctionItemList + cfgRankKey = warRank + 1 + + GameWorld.Log("对应世界等级奖励: rewardWorldLV=%s, %s" % (rewardWorldLV, cfgRankAuctionItemDict)) + + familyAuctionItemDict = {} # {仙盟ID:[[享受收益的成员ID, ...], [[拍品ID,个数], [拍品ID,个数,是否拍品], ...]], ...} + for rank, familyID in enumerate(familyWarIDRankList, 1): + if rank not in cfgRankAuctionItemDict: + GameWorld.Log(" rank=%s,familyID=%s,该名次没有找到奖励!" % (rank, familyID)) + continue + + family = GameWorld.GetFamilyManager().FindFamily(familyID) + if not family: + GameWorld.Log(" rank=%s,familyID=%s,仙盟不存在!" % (rank, familyID)) + continue + + familyAllPlayerIDList = [] + familyPlayerIDList = [] + for i in xrange(family.GetCount()): + member = family.GetAt(i) + memPlayerID = member.GetPlayerID() + if memPlayerID not in PyGameData.g_familyWarMemDict: + continue + familyAllPlayerIDList.append(memPlayerID) + recData = PyGameData.g_familyWarMemDict[memPlayerID] + if GetFWMemFamilyID(recData) != familyID: + continue + if not GetFWMemIsJoin(recData): + continue + familyPlayerIDList.append(memPlayerID) + if not familyPlayerIDList: + familyPlayerIDList = familyAllPlayerIDList + GameWorld.Log(" 排名没有人参赛,收益算仙盟所有人的!familyID=%s,familyAllPlayerIDList=%s" % (familyID, familyAllPlayerIDList)) + + familyAuctionItemList = cfgRankAuctionItemDict[rank] + familyAuctionItemDict[familyID] = [familyPlayerIDList, familyAuctionItemList] + GameWorld.Log(" rank=%s,familyID=%s,familyPlayerIDList=%s,familyAuctionItemList=%s" + % (rank, familyID, familyPlayerIDList, familyAuctionItemList)) + + AuctionHouse.DoAddFamilyAuctionItem(ChConfig.Def_FBMapID_FamilyWar, familyAuctionItemDict) + return + def GetFamilyWarChampionRecData(): universalRecMgr = GameWorld.GetUniversalRecMgr() championRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarChampion) @@ -917,55 +1142,57 @@ def AllotWinRewardBySystem(championRecData, isAll): ## 系统自动分配仙盟未分配的连胜奖励 - - familyID = GetFWChampionFamilyID(championRecData) - leaderID = GetFWChampionLeaderID(championRecData) - winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数 - lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数 - endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数 - - winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励 - winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数 - winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数 - if not winRewardItemList or not winRewardStartCount or not winRewardSpaceCount: - return - - updAllotWinCount = 0 # 更新的已分配到的连胜次数 - startRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数 - sysAllotWinCountList = range(startRewardWinCount, winCount + 1, winRewardSpaceCount) - isAllotEndWinCount = (endWinCount and (isAll or sysAllotWinCountList)) - - if not isAll and sysAllotWinCountList: - sysAllotWinCountList = sysAllotWinCountList[:-1] # 保留一个可手动分配, 其余自动分配 - if sysAllotWinCountList: - updAllotWinCount = sysAllotWinCountList[-1] - - sysAllotCount = len(sysAllotWinCountList) # 系统自动发放的奖励次数 - if isAllotEndWinCount: - sysAllotCount += 1 - - if sysAllotCount <= 0: - #GameWorld.Log("无需自动分配奖励!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,isAll=%s,sysAllotWinCountList=%s" - # % (lastAllotWinCount, winCount, endWinCount, isAll, sysAllotWinCountList)) - return - - if sysAllotCount > 1: - winRewardItemList = copy.deepcopy(winRewardItemList) - for itemInfo in winRewardItemList: - itemInfo[1] *= sysAllotCount - GameWorld.Log("系统自动分配连胜奖励给盟主!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,分配次数=%s,物品=%s,isAll=%s,familyID=%s,leaderID=%s" - % (lastAllotWinCount, winCount, endWinCount, sysAllotCount, winRewardItemList, isAll, familyID, leaderID)) - if sysAllotWinCountList: - GameWorld.Log(" sysAllotWinCountList=%s" % sysAllotWinCountList) - if endWinCount: - GameWorld.Log(" 重置已分配终结对手连胜次数奖励!") - SetFWChampionEndWinCount(championRecData, 0) - if updAllotWinCount: - GameWorld.Log(" 更新已分配到的连胜次数: %s" % updAllotWinCount) - SetFWChampionWinRewardAllot(championRecData, updAllotWinCount) - PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail2", [leaderID], winRewardItemList) - GameWorld.Log(" -----------------------") + ## 单号 7195 2019-06-10 去除分配奖励,连胜改为拍品奖励 return + +# familyID = GetFWChampionFamilyID(championRecData) +# leaderID = GetFWChampionLeaderID(championRecData) +# winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数 +# lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数 +# endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数 +# +# winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励 +# winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数 +# winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数 +# if not winRewardItemList or not winRewardStartCount or not winRewardSpaceCount: +# return +# +# updAllotWinCount = 0 # 更新的已分配到的连胜次数 +# startRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数 +# sysAllotWinCountList = range(startRewardWinCount, winCount + 1, winRewardSpaceCount) +# isAllotEndWinCount = (endWinCount and (isAll or sysAllotWinCountList)) +# +# if not isAll and sysAllotWinCountList: +# sysAllotWinCountList = sysAllotWinCountList[:-1] # 保留一个可手动分配, 其余自动分配 +# if sysAllotWinCountList: +# updAllotWinCount = sysAllotWinCountList[-1] +# +# sysAllotCount = len(sysAllotWinCountList) # 系统自动发放的奖励次数 +# if isAllotEndWinCount: +# sysAllotCount += 1 +# +# if sysAllotCount <= 0: +# #GameWorld.Log("无需自动分配奖励!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,isAll=%s,sysAllotWinCountList=%s" +# # % (lastAllotWinCount, winCount, endWinCount, isAll, sysAllotWinCountList)) +# return +# +# if sysAllotCount > 1: +# winRewardItemList = copy.deepcopy(winRewardItemList) +# for itemInfo in winRewardItemList: +# itemInfo[1] *= sysAllotCount +# GameWorld.Log("系统自动分配连胜奖励给盟主!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,分配次数=%s,物品=%s,isAll=%s,familyID=%s,leaderID=%s" +# % (lastAllotWinCount, winCount, endWinCount, sysAllotCount, winRewardItemList, isAll, familyID, leaderID)) +# if sysAllotWinCountList: +# GameWorld.Log(" sysAllotWinCountList=%s" % sysAllotWinCountList) +# if endWinCount: +# GameWorld.Log(" 重置已分配终结对手连胜次数奖励!") +# SetFWChampionEndWinCount(championRecData, 0) +# if updAllotWinCount: +# GameWorld.Log(" 更新已分配到的连胜次数: %s" % updAllotWinCount) +# SetFWChampionWinRewardAllot(championRecData, updAllotWinCount) +# PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail2", [leaderID], winRewardItemList) +# GameWorld.Log(" -----------------------") +# return #// A4 10 仙盟联赛连胜奖励分配 #tagCGFamilyWarWinRewardAllot # @@ -975,58 +1202,60 @@ # DWORD MemPlayerID; //分配给的仙盟成员玩家ID #}; def OnFamilyWarWinRewardAllot(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - memPlayerID = clientData.MemPlayerID - playerID = curPlayer.GetPlayerID() - curFamily = curPlayer.GetFamily() - if curFamily == None: - return - curMember = curFamily.FindMember(playerID) - if curMember == None: - return - if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader: - GameWorld.Log("不是盟主,不能分配连胜奖励!", playerID) - return - - familyID = curFamily.GetID() - curTagMember = curFamily.FindMember(memPlayerID) - if curTagMember == None: - GameWorld.Log("仙盟没有该成员,无法分配连胜奖励!familyID=%s,memPlayerID=%s" % (familyID, memPlayerID), playerID) - return - - championRecData = GetFamilyWarChampionRecData() - championFamilyID = GetFWChampionFamilyID(championRecData) - if familyID != championFamilyID: - GameWorld.Log("非王者仙盟,无法分配连胜奖励!championFamilyID=%s,familyID=%s" % (championFamilyID, familyID), playerID) - return - - endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数 - if endWinCount: - SetFWChampionEndWinCount(championRecData, 0) - GameWorld.Log("分配终结仙盟连胜奖励!familyID=%s,endWinCount=%s" % (familyID, endWinCount), playerID) - - else: - winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数 - lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数 - - winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数 - winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数 - nextRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数 - if winCount < nextRewardWinCount: - GameWorld.Log("连胜次数不足,无法分配连胜奖励!已分配连胜奖励次数=%s,下次连胜奖励次数(%s) > 当前连胜次数(%s)" - % (lastAllotWinCount, nextRewardWinCount, winCount), playerID) - return - SetFWChampionWinRewardAllot(championRecData, nextRewardWinCount) - GameWorld.Log("分配仙盟连胜奖励!familyID=%s,分配连胜数=%s" % (familyID, nextRewardWinCount), playerID) - - winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励 - PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail1", [memPlayerID], winRewardItemList) - PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, championRecData) # 同步给该玩家 - - # <color=#44e863FF>%s0</color>仙盟盟主将连胜奖励<color=#44e863FF><Word info=item id=%s1/></color>分配给<color=#44e863FF>%s2</color>,神兵降世 - notifyItemID = winRewardItemList[0][0] - PlayerControl.WorldNotify(0, "FamilyMatchLianWinReward", [curFamily.GetName(), notifyItemID, curTagMember.GetName()]) + # 单号 7195 2019-06-10 去除分配奖励,连胜改为拍品奖励 return +# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) +# memPlayerID = clientData.MemPlayerID +# playerID = curPlayer.GetPlayerID() +# curFamily = curPlayer.GetFamily() +# if curFamily == None: +# return +# curMember = curFamily.FindMember(playerID) +# if curMember == None: +# return +# if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader: +# GameWorld.Log("不是盟主,不能分配连胜奖励!", playerID) +# return +# +# familyID = curFamily.GetID() +# curTagMember = curFamily.FindMember(memPlayerID) +# if curTagMember == None: +# GameWorld.Log("仙盟没有该成员,无法分配连胜奖励!familyID=%s,memPlayerID=%s" % (familyID, memPlayerID), playerID) +# return +# +# championRecData = GetFamilyWarChampionRecData() +# championFamilyID = GetFWChampionFamilyID(championRecData) +# if familyID != championFamilyID: +# GameWorld.Log("非王者仙盟,无法分配连胜奖励!championFamilyID=%s,familyID=%s" % (championFamilyID, familyID), playerID) +# return +# +# endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数 +# if endWinCount: +# SetFWChampionEndWinCount(championRecData, 0) +# GameWorld.Log("分配终结仙盟连胜奖励!familyID=%s,endWinCount=%s" % (familyID, endWinCount), playerID) +# +# else: +# winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数 +# lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数 +# +# winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数 +# winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数 +# nextRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数 +# if winCount < nextRewardWinCount: +# GameWorld.Log("连胜次数不足,无法分配连胜奖励!已分配连胜奖励次数=%s,下次连胜奖励次数(%s) > 当前连胜次数(%s)" +# % (lastAllotWinCount, nextRewardWinCount, winCount), playerID) +# return +# SetFWChampionWinRewardAllot(championRecData, nextRewardWinCount) +# GameWorld.Log("分配仙盟连胜奖励!familyID=%s,分配连胜数=%s" % (familyID, nextRewardWinCount), playerID) +# +# winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励 +# PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail1", [memPlayerID], winRewardItemList) +# PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, championRecData) # 同步给该玩家 +# +# # <color=#44e863FF>%s0</color>仙盟盟主将连胜奖励<color=#44e863FF><Word info=item id=%s1/></color>分配给<color=#44e863FF>%s2</color>,神兵降世 +# notifyItemID = winRewardItemList[0][0] +# PlayerControl.WorldNotify(0, "FamilyMatchLianWinReward", [curFamily.GetName(), notifyItemID, curTagMember.GetName()]) +# return def MapServer_FamilyWarOver(msgList): ## 地图仙盟战结束 @@ -1068,4 +1297,11 @@ return +def Sync_FamilyWarInfo(curPlayer=None): + warInfo = ChPyNetSendPack.tagGCFamilyWarInfo() + warInfo.WorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV) + NetPackCommon.SendPackByPlayer(warInfo, curPlayer) + return + + -- Gitblit v1.8.0