From bd30335b5a3ef468352f3b30a9ea68684df515f9 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 06 六月 2024 11:17:55 +0800 Subject: [PATCH] 10130 【后端】福地争夺资源功能(优化启动加载福地物品数据逻辑;修复坐标转小数点问题;) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py | 126 +++++++++++++++++++++++++---------------- 1 files changed, 77 insertions(+), 49 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py index 7af148d..9015a45 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py @@ -282,10 +282,51 @@ mineItemData.clear() pos += mineItemData.readData(datas, pos, dataslen) - OnLoadMineItemData(mineItemData) + playerID = mineItemData.PlayerID + index = mineItemData.Index + if playerID not in self.playerMineItemDict: + self.playerMineItemDict[playerID] = {} + itemDict = self.playerMineItemDict[playerID] + itemDict[index] = mineItemData + # 启动直接覆盖同玩家索引位数据,这里存在一个问题,合服后假人玩家ID是重复的,一般是新服的替换旧服的假人 OnLoadMineItemOK() return pos + +def DoOnDayEx(): + if GameWorld.IsCrossServer(): + return + ''' + 待处理:合服本身会删除部分玩家数据,之后如果多次合服后数据量较大再考虑处理 + 1. 删除1星期前的自己拉物品记录,至少保留最近10条被人抢记录 + 2. 删除1星期前未领取的奖励记录 + 3. 清除超过1星期没有更新福地记录的玩家数据,保底保留x个玩家 + ''' +# socialAreaMax = IpyGameDataPY.GetFuncCfg("MineAreaRob", 1) # 道友福地个数 +# inValidSeconds = 7 * 24 * 3600 +# curTime = int(time.time()) +# outofDateTime = curTime - inValidSeconds +# delPlayerIDList = [] +# recordMgr = PyDataManager.GetDBPyMineAreaRecordManager() +# for playerID, recordList in recordMgr.playerMineRecordListDict.items(): +# isActiveAreaPlayer = False +# beRobbedPlayerIDList = [] +# for recordData in recordList[::-1]: # 反序处理 +# if recordData.RecordTime > outofDateTime: +# isActiveAreaPlayer = True # 近期内还有记录的视为福地活跃玩家,无论主动或被抢记录 +# if recordData.RecordType == MineAreaRecordType_BeRobbed: +# # 至少保留被x个不同玩家抢的记录,用于更新关心道友福地 +# tagPlayerID = recordData.TagPlayerID +# if len(beRobbedPlayerIDList) < socialAreaMax and tagPlayerID not in beRobbedPlayerIDList: +# beRobbedPlayerIDList.append(tagPlayerID) +# continue +# if recordData.RecordTime <= outofDateTime: +# recordList.remove(recordData) # 删除过期数据 +# +# if not isActiveAreaPlayer: +# if playerID not in delPlayerIDList: +# delPlayerIDList.append(playerID) + return def DoMineAreaFuncOpen(curPlayer): ## 福地功能开启 @@ -297,6 +338,8 @@ return def OnPlayerLogin(curPlayer): + if GameWorld.IsCrossServer(): + return playerID = curPlayer.GetPlayerID() # 自己福地数据 @@ -315,43 +358,10 @@ return -def OnLoadMineItemData(mineItemData): - ## 加载矿物 - playerID = mineItemData.PlayerID - index = mineItemData.Index - mineID = mineItemData.MineID - if not mineID: - return - mineType = mineItemData.MineType - workerCount = mineItemData.WorkerCount - robPlayerID = mineItemData.RobPlayerID - robWorkerCount = mineItemData.RobWorkerCount - - mineItemMgr = PyDataManager.GetDBPyMineAreaItemManager() - - if playerID not in mineItemMgr.playerMineItemDict: - mineItemMgr.playerMineItemDict[playerID] = {} - itemDict = mineItemMgr.playerMineItemDict[playerID] - itemDict[index] = mineItemData - mineItemMgr.AddMineAreaPlayerID(playerID) - - if mineType == MineType_Super and not workerCount and not robWorkerCount and mineItemData not in mineItemMgr.freeSuperItemList: - mineItemMgr.freeSuperItemList.append(mineItemData) - - if workerCount: - mineItemMgr.AddPlayerPullingItem(playerID, mineItemData) - - if robPlayerID and robWorkerCount: - mineItemMgr.AddPlayerPullingItem(robPlayerID, mineItemData) - - __RefreshMineItemSpeed(mineItemData) - return - def OnLoadMineItemOK(): - __SortMineItem() - __MakeFackArea() + if GameWorld.IsCrossServer(): + return - # 启动默认补充空位置物品... refreshIndexList = range(IpyGameDataPY.GetFuncCfg("MineAreaBase", 1)) mineItemMgr = PyDataManager.GetDBPyMineAreaItemManager() for areaPlayerID, itemDict in mineItemMgr.playerMineItemDict.items(): @@ -364,11 +374,32 @@ if not mineItemData or not mineItemData.MineID: emptyIndexList.append(index) continue - if not emptyIndexList: - continue - GameWorld.DebugLog("启动默认补充空位置物品: areaPlayerID=%s,emptyIndexList=%s" % (areaPlayerID, emptyIndexList)) - __DoMineItemRefresh(areaPlayerID, refreshIndexList=emptyIndexList) - + + # 矿物初始数据处理 + mineType = mineItemData.MineType + workerCount = mineItemData.WorkerCount + robPlayerID = mineItemData.RobPlayerID + robWorkerCount = mineItemData.RobWorkerCount + + mineItemMgr.AddMineAreaPlayerID(areaPlayerID) + + if mineType == MineType_Super and not workerCount and not robWorkerCount and mineItemData not in mineItemMgr.freeSuperItemList: + mineItemMgr.freeSuperItemList.append(mineItemData) + + if workerCount: + mineItemMgr.AddPlayerPullingItem(areaPlayerID, mineItemData) + + if robPlayerID and robWorkerCount: + mineItemMgr.AddPlayerPullingItem(robPlayerID, mineItemData) + + __RefreshMineItemSpeed(mineItemData) + + if emptyIndexList: + GameWorld.DebugLog("启动默认补充空位置物品: areaPlayerID=%s,emptyIndexList=%s" % (areaPlayerID, emptyIndexList)) + __DoMineItemRefresh(areaPlayerID, refreshIndexList=emptyIndexList) + + __SortMineItem() + __MakeFackArea() return def __MakeFackArea(): @@ -397,7 +428,7 @@ playerID = mineItemData.PlayerID index = mineItemData.Index mineID = mineItemData.MineID - curPos = GameWorld.ToIntDef(mineItemData.Position, Def_PositionMid) + curPos = GameWorld.ToFloat(mineItemData.Position, Def_PositionMid) if not playerID or not mineID: return curPos @@ -430,7 +461,7 @@ if not playerID or not mineID: return - curPos = GameWorld.ToIntDef(mineItemData.Position, Def_PositionMid) + curPos = GameWorld.ToFloat(mineItemData.Position, Def_PositionMid) allMineItemByEndTimeList = PyDataManager.GetDBPyMineAreaItemManager().allMineItemByEndTimeList curWorkerCount = mineItemData.WorkerCount robWorkerCount = mineItemData.RobWorkerCount @@ -530,10 +561,6 @@ def OnMineItemTimeProcess(curTime, tick): ## 定时处理,每秒触发一次 - - # 待优化处理... - # 定时删除多余数据,如过天处理,多余记录 - # 合服多余数据清理,合服假人ID重复问题 mineItemMgr = PyDataManager.GetDBPyMineAreaItemManager() __Process_EndItemRefresh(mineItemMgr.endSelfItemList, IpyGameDataPY.GetFuncCfg("MineAreaSysRefresh", 2), curTime) @@ -844,7 +871,7 @@ if isPreview: ## 预览速度时间 - curPos = GameWorld.ToIntDef(mineItemData.Position, Def_PositionMid) + curPos = GameWorld.ToFloat(mineItemData.Position, Def_PositionMid) if playerID == areaPlayerID: curWorkerCount = assignWorkerCount curWorkerState = workerState @@ -1161,7 +1188,8 @@ neighborIDList = mineItemMgr.neighborIDListDict.get(playerID, []) if not neighborIDList: - random.shuffle(mineItemMgr.realAreaPlayerIDList) + # 优先随机真人 + random.shuffle(mineItemMgr.realAreaPlayerIDList) random.shuffle(mineItemMgr.fackAreaPlayerIDList) areaPlayerIDList = mineItemMgr.realAreaPlayerIDList + mineItemMgr.fackAreaPlayerIDList if playerID in areaPlayerIDList: -- Gitblit v1.8.0