From 58f628394a10840d21b06bb6a165756a064d9714 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 06 二月 2025 17:03:10 +0800 Subject: [PATCH] 10385 【越南】【英语】【BT】【砍树】福地新增鼠管及优化-服务端 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py | 177 +++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 113 insertions(+), 64 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py index ff7dc79..c576759 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py @@ -15,6 +15,7 @@ #"""Version = 2024-03-07 19:30""" #------------------------------------------------------------------------------- +import ChConfig import GameWorld import NetPackCommon import PyDataManager @@ -165,7 +166,6 @@ self.viewAreaPlayerIDDict = {} # 正在查看某个福地中的玩家ID {areaPlayerID:[viewPlayerID, ...], ...} self.neighborIDListDict = {} # 玩家周围福地玩家ID列表 {playerID:[playerID, ...], ...} - self.socialIDListDict = {} # 玩家有关系道友福地玩家ID列表 {playerID:[playerID, ...], ...} playerID列表倒序 return def AddViewAreaPlayerID(self, viewPlayerID, areaPlayerID): @@ -701,6 +701,8 @@ AddMineItemRecord(awardPlayerID, MineAreaRecordType_Pull, areaPlayerID, mineID, curTime) if areaPlayerID != awardPlayerID: AddMineItemRecord(areaPlayerID, MineAreaRecordType_BeRobbed, awardPlayerID, mineID, curTime) + DecRobValue(awardPlayerID, areaPlayerID, 1) + AddRobValue(areaPlayerID, awardPlayerID, 1) # 被抢的 if IpyGameDataPY.GetFuncCfg("MineAreaSysRefresh", 3) > 0: @@ -736,60 +738,98 @@ recordMgr = PyDataManager.GetDBPyMineAreaRecordManager() recordList = recordMgr.AddPlayerRecord(recordData) - # 被人抢,更新关系福地ID记录 - if recordData.RecordType == MineAreaRecordType_BeRobbed: - __DoUpdSocialPlayerIDList(playerID) - if len(recordList) > Def_RecordMax: recordList.pop(0) # 删除最早一条 return -def __DoUpdSocialPlayerIDList(playerID): - ## 更新有关系的道友ID列表 - recordMgr = PyDataManager.GetDBPyMineAreaRecordManager() - recordList = recordMgr.playerMineRecordListDict.get(playerID, []) - - socialAreaMax = IpyGameDataPY.GetFuncCfg("MineAreaRob", 1) # 道友福地个数 - socialIDList = [] # 反序 - for recData in recordList[::-1]: - if recData.RecordType != MineAreaRecordType_BeRobbed: - ## 优先保留被抢记录关系玩家 +def DecRobValue(playerID, tagPlayerID, decValue): + ## 减少敌对值 + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + robRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_MineAreaRecord, playerID, False) + if not robRecData: + GameWorld.DebugLog("没有敌对福地记录!", playerID) + return 0 + # 抢劫的人减少与对方敌对值 + setRobValue = 0 + robValueList = robRecData.GetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, []) + GameWorld.DebugLog("减少与对方敌对值: tagPlayerID=%s,decValue=%s" % (tagPlayerID, decValue), playerID) + GameWorld.DebugLog(" bef robValueList=%s" % robValueList, playerID) + for index, robValueInfo in enumerate(robValueList): + robValue, pID = robValueInfo + if pID != tagPlayerID: continue - if recData.TagPlayerID not in socialIDList: - socialIDList.append(recData.TagPlayerID) - if len(socialIDList) >= socialAreaMax: - break - - mineItemMgr = PyDataManager.GetDBPyMineAreaItemManager() - socialIDListBef = mineItemMgr.socialIDListDict.get(playerID, []) - # 优先使用历史记录 - if len(socialIDList) < socialAreaMax: - for socialIDBef in socialIDListBef: - if socialIDBef not in socialIDList: - socialIDList.append(socialIDBef) - if len(socialIDList) >= socialAreaMax: - break - - # 优先随机真人 - if len(socialIDList) < socialAreaMax and mineItemMgr.realAreaPlayerIDList: - random.shuffle(mineItemMgr.realAreaPlayerIDList) - for areaPlayerID in mineItemMgr.realAreaPlayerIDList: - if areaPlayerID not in socialIDList and areaPlayerID != playerID: - socialIDList.append(areaPlayerID) - if len(socialIDList) >= socialAreaMax: - break - - # 不够补充假人 - if len(socialIDList) < socialAreaMax and mineItemMgr.fackAreaPlayerIDList: - random.shuffle(mineItemMgr.fackAreaPlayerIDList) - for areaPlayerID in mineItemMgr.fackAreaPlayerIDList: - if areaPlayerID not in socialIDList: - socialIDList.append(areaPlayerID) - if len(socialIDList) >= socialAreaMax: - break - - mineItemMgr.socialIDListDict[playerID] = socialIDList - return socialIDList + robValue -= decValue + GameWorld.DebugLog(" tagPlayerID=%s,更新敌对值=%s" % (tagPlayerID, robValue), playerID) + if robValue <= 0: + robValueList.pop(index) + else: + robValueList[index] = [robValue, pID] + setRobValue = robValue + robRecData.SetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, robValueList, True) + break + + robValueList = robRecData.GetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, []) + GameWorld.DebugLog(" aft robValueList=%s" % robValueList, playerID) + return setRobValue + +def AddRobValue(playerID, tagPlayerID, addValue): + ## 被抢的人增加与对方敌对值,并置顶 + + if playerID <= Def_FakeAreaCount: + return 0 + + GameWorld.DebugLog("增加与对方敌对值: tagPlayerID=%s,addValue=%s" % (tagPlayerID, addValue), playerID) + setRobValue = 0 + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + robRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_MineAreaRecord, playerID, True) + robValueList = robRecData.GetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, []) + GameWorld.DebugLog(" bef robValueList=%s" % robValueList, playerID) + for index, robValueInfo in enumerate(robValueList): + robValue, pID = robValueInfo + if pID != tagPlayerID: + continue + robValueList.pop(index) + setRobValue = robValue + break + setRobValue += addValue + GameWorld.DebugLog(" tagPlayerID=%s,更新敌对值=%s" % (tagPlayerID, setRobValue), playerID) + + robValueList.insert(0, [setRobValue, tagPlayerID]) + robRecData.SetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, robValueList) + + robValueList = robRecData.GetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, []) + GameWorld.DebugLog(" aft robValueList=%s" % robValueList, playerID) + return setRobValue + +def GetRobPlayerIDList(playerID): + ## 获取敌对玩家ID列表 + if playerID <= Def_FakeAreaCount: + return [] + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + robRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_MineAreaRecord, playerID, False) + if not robRecData: + return [] + robIDList = [] + rPlayerRobValueList = robRecData.GetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, []) + for robValueInfo in rPlayerRobValueList: + _, pID = robValueInfo + robIDList.append(pID) + return robIDList + +def GetRobValueDict(playerID): + ## 获取敌对玩家敌对值字典 + if playerID <= Def_FakeAreaCount: + return {} + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + robRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_MineAreaRecord, playerID, False) + if not robRecData: + return {} + robValueDict = {} + rPlayerRobValueList = robRecData.GetUserDataByKey(ChConfig.Def_RecDataKey_RobValueList, []) + for robValueInfo in rPlayerRobValueList: + robValue, pID = robValueInfo + robValueDict[pID] = robValue + return robValueDict def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList): @@ -914,6 +954,12 @@ # 地图结算奖励OK elif msgType == "MineAreaAwardGetOK": __DoMineAreaAwardGetOK(curPlayer, dataMsg) + + # 刷新周围玩家 + elif msgType == "MineRobRefresh": + tick = GameWorld.GetGameWorld().GetTick() + queryType, queryValue = 3, 1 + SyncNeighborAreaInfo(curPlayer, tick, queryType, queryValue) if ret == None: return @@ -1195,6 +1241,7 @@ # 查看周围随机福地列表 elif queryType == 3: + queryValue = 0 # GameServer默认只给查询,刷新列表改为从MapServer发起 B0 31 福地物品刷新 #tagCMMineItemRefresh 请求 SyncNeighborAreaInfo(curPlayer, tick, queryType, queryValue) # 退出他人福地 @@ -1224,9 +1271,9 @@ notifyPlayerIDList.append(areaPlayerID) # 列表中 - for playerID, socialIDList in mineItemMgr.socialIDListDict.items(): - if areaPlayerID in socialIDList: - notifyPlayerIDList.append(playerID) + robPlayerIDList = GetRobPlayerIDList(areaPlayerID) + if robPlayerIDList: + notifyPlayerIDList += robPlayerIDList for playerID, neighborIDList in mineItemMgr.neighborIDListDict.items(): if areaPlayerID in neighborIDList: notifyPlayerIDList.append(playerID) @@ -1263,16 +1310,12 @@ return def SyncSocialAreaInfo(curPlayer, queryType=0, queryValue=0): - ## 同步有关系的道友福地列表 + ## 同步有关系的道友福地列表 - 敌对列表 playerID = curPlayer.GetPlayerID() - mineItemMgr = PyDataManager.GetDBPyMineAreaItemManager() - if playerID in mineItemMgr.socialIDListDict: - socialIDList = mineItemMgr.socialIDListDict[playerID] - else: - socialIDList = __DoUpdSocialPlayerIDList(playerID) - + socialIDList = GetRobPlayerIDList(playerID) + robValueDict = GetRobValueDict(playerID) areaMineList = [[areaPlayerID, []] for areaPlayerID in socialIDList] - clientPack = __GetMineAreaInfoPack(areaMineList, queryType, queryValue) + clientPack = __GetMineAreaInfoPack(areaMineList, queryType, queryValue, robValueDict) NetPackCommon.SendFakePack(curPlayer, clientPack) return @@ -1305,9 +1348,14 @@ if neighborIDBef in areaPlayerIDList: areaPlayerIDList.remove(neighborIDBef) neighborCount = IpyGameDataPY.GetFuncCfg("MineAreaRob", 2) + realmLV = curPlayer.GetOfficialRank() + officialNeighborCountList = IpyGameDataPY.GetFuncEvalCfg("MineAreaRob2", 1) + for needRLV, nCount in officialNeighborCountList: + if realmLV >= needRLV: + neighborCount = nCount neighborIDList = areaPlayerIDList[:neighborCount] mineItemMgr.neighborIDListDict[playerID] = neighborIDList - GameWorld.DebugLog("刷新周围随机福地: %s" % neighborIDList, playerID) + GameWorld.DebugLog("刷新周围随机福地: realmLV=%s,neighborCount=%s,%s" % (realmLV, neighborCount, neighborIDList), playerID) areaMineList = [[areaPlayerID, []] for areaPlayerID in neighborIDList] clientPack = __GetMineAreaInfoPack(areaMineList, queryType, queryValue) @@ -1338,7 +1386,7 @@ NetPackCommon.SendFakePack(curPlayer, clientPack) return -def __GetMineAreaInfoPack(areaMineList, queryType=0, queryValue=0): +def __GetMineAreaInfoPack(areaMineList, queryType=0, queryValue=0, robValueDict=None): ''' 获取同步福地详细信息包 @param areaMineList: [[areaPlayerID, mineIndexList], ...] 按指定福地ID顺序列表获取,mineIndexList为空时同步该福地全部物品,否则只同步指定索引物品 ''' @@ -1356,7 +1404,8 @@ areaInfo.Job = cacheDict.get("Job", 0) areaInfo.Face = cacheDict.get("Face", 0) areaInfo.FacePic = cacheDict.get("FacePic", 0) - + areaInfo.RobValue = robValueDict.get(areaPlayerID, 0) if robValueDict else 0 # 敌对值,前端仅queryType为2时才更新敌对值 + areaInfo.MineItemList = [] if not mineIndexList: mineIndexList = range(IpyGameDataPY.GetFuncCfg("MineAreaBase", 1)) -- Gitblit v1.8.0