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