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/GameWorld.py | 8 ++
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py | 3 +
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py | 126 +++++++++++++++++++++++++----------------
3 files changed, 88 insertions(+), 49 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 237cb4a..cc413cf 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -118,6 +118,14 @@
except ValueError:
return defValue
+def ToFloat(input, defValue = 0):
+ try:
+ result = float(input)
+ return result
+
+ except ValueError:
+ return defValue
+
## 判断2个对象是否同国籍
# @param srcObj 起点对象
# @param desObj 目标对象
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:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
index c869c49..b973b9a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
@@ -36,6 +36,7 @@
import CrossFamilyFlagwar
import CrossChampionship
import CrossYaomoBoss
+import GameWorldMineArea
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -101,6 +102,8 @@
CrossBattlefield.DoOnDayEx()
#跨服排位
CrossChampionship.DoOnDayEx()
+ #福地
+ GameWorldMineArea.DoOnDayEx()
playerManager = GameWorld.GetPlayerManager()
for i in xrange(playerManager.GetPlayerCount()):
curPlayer = playerManager.GetPlayerByIndex(i)
--
Gitblit v1.8.0