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: