From 00f4a55d20b44485efb11172bf61263e8cfb57fa Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 12 三月 2025 15:09:14 +0800
Subject: [PATCH] 10416 【英文】【bt】【GM】【砍树】登录基金和幻境基金 完成后可以重置购买(重置关联的充值ID)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py | 225 +++++++++++++++++++++++++++++++++++--------------------
1 files changed, 143 insertions(+), 82 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py
index c1f3449..e22fe79 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):
@@ -530,6 +530,9 @@
battleRatio = workerBattleRatioList[len(workerBattleRatioList) - 1] if batWorkerCount > len(workerBattleRatioList) else workerBattleRatioList[batWorkerCount - 1]
needSeconds = int(dist * itemWeight * baseTime * workRatio * battleRatio) # 还需工作时长,秒
+ if needSeconds <= 0:
+ return 0, 0
+
moveSpeed = dist / float(needSeconds) # 移动速度 x格/秒
needHms = "%02d:%02d:%02d" % (needSeconds / 3600, needSeconds % 3600 / 60, needSeconds % 60)
@@ -698,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:
@@ -733,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):
@@ -866,7 +909,7 @@
robPlayerID = mineItemData.RobPlayerID
# 赶走抢夺者
if robPlayerID and robPlayerID == tagPlayerID:
- __DoCancelPull(tagPlayerID, areaPlayerID, itemIndex)
+ __DoCancelPull(tagPlayerID, areaPlayerID, itemIndex, "out")
# 帮助的发奖
if funcLineID == 0:
@@ -901,16 +944,22 @@
# 拉物品
if msgType == "Pull":
- __DoPullItem(playerID, curPlayer, dataMsg)
+ ret = __DoPullItem(playerID, curPlayer, dataMsg)
# 刷新福地物品
elif msgType == "MineItemRefresh":
playerID, isSuper = dataMsg
- __DoMineItemRefresh(playerID, curPlayer, isSuper=isSuper)
+ __DoMineItemRefresh(playerID, curPlayer, isSuper=isSuper, queryType=99, queryValue=isSuper)
# 地图结算奖励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
@@ -923,7 +972,7 @@
return
if workerCount <= 0:
if not isPreview:
- __DoCancelPull(playerID, areaPlayerID, itemIndex)
+ __DoCancelPull(playerID, areaPlayerID, itemIndex, "cancel")
return
GameWorld.DebugLog("请求福地拉物品! areaPlayerID=%s,itemIndex=%s,workerCount=%s,workerState=%s,workerTotal=%s,isPreview=%s"
% (areaPlayerID, itemIndex, workerCount, workerState, workerTotal, isPreview), playerID)
@@ -1014,9 +1063,9 @@
__RefreshMineItemSpeed(mineItemData, True)
SyncMineAreaItemInfo(areaPlayerID, [itemIndex], notifyPlayerIDListEx)
- return
+ return [areaPlayerID]
-def __DoCancelPull(playerID, areaPlayerID, itemIndex):
+def __DoCancelPull(playerID, areaPlayerID, itemIndex, reason=""):
## 取消拉取
mineItemMgr = PyDataManager.GetDBPyMineAreaItemManager()
mineItemData = mineItemMgr.GetMineItem(areaPlayerID, itemIndex)
@@ -1051,9 +1100,12 @@
__RefreshMineItemSpeed(mineItemData, True)
SyncMineAreaItemInfo(areaPlayerID, [itemIndex], notifyPlayerIDListEx)
+ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+ if curPlayer:
+ MapServer_QueryPlayerResult(curPlayer, "MineAreaCancelPull", [areaPlayerID, reason])
return
-def __DoMineItemRefresh(areaPlayerID, areaPlayer=None, isSys=False, isSuper=False, isNotify=True, refreshIndexList=None, setPosition=None, setItemLV=None, setMineID=None):
+def __DoMineItemRefresh(areaPlayerID, areaPlayer=None, isSys=False, isSuper=False, isNotify=True, refreshIndexList=None, setPosition=None, setItemLV=None, setMineID=None, queryType=0, queryValue=0):
'''刷新福地物品
@param areaPlayerID: 福地玩家ID,可能是假人
@param areaPlayer: 福地玩家实例
@@ -1152,7 +1204,7 @@
GameWorld.DebugLog(" index=%s,randMineID=%s,position=%s,mineType=%s,itemLV=%s" % (index, randMineID, position, mineType, itemLV), areaPlayerID)
if isNotify and refreshDict:
- SyncMineAreaItemInfo(areaPlayerID, refreshDict.keys())
+ SyncMineAreaItemInfo(areaPlayerID, refreshDict.keys(), queryType=queryType, queryValue=queryValue)
return refreshDict
#// B0 33 福地查看 #tagCGMineAreaView
@@ -1189,6 +1241,7 @@
# 查看周围随机福地列表
elif queryType == 3:
+ queryValue = 0 # GameServer默认只给查询,刷新列表改为从MapServer发起 B0 31 福地物品刷新 #tagCMMineItemRefresh 请求
SyncNeighborAreaInfo(curPlayer, tick, queryType, queryValue)
# 退出他人福地
@@ -1201,7 +1254,7 @@
return
-def SyncMineAreaItemInfo(areaPlayerID, mineIndexList, notifyPlayerIDListEx=None):
+def SyncMineAreaItemInfo(areaPlayerID, mineIndexList, notifyPlayerIDListEx=None, queryType=0, queryValue=0):
'''某个福地物品变更时同步,会同步给相关玩家
@param areaPlayerID: 福地玩家ID,可能是假人
@param mineIndexList: 需要同步的矿物索引
@@ -1218,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)
@@ -1242,7 +1295,7 @@
if not notifyPlayerIDList:
return
- clientPack = __GetMineAreaInfoPack([[areaPlayerID, mineIndexList]])
+ clientPack = __GetMineAreaInfoPack([[areaPlayerID, mineIndexList]], queryType=queryType, queryValue=queryValue)
# 去重同步
playerManager = GameWorld.GetPlayerManager()
for playerID in set(notifyPlayerIDList):
@@ -1257,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
@@ -1299,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)
@@ -1332,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为空时同步该福地全部物品,否则只同步指定索引物品
'''
@@ -1347,8 +1401,11 @@
if areaPlayerID > Def_FakeAreaCount:
cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(areaPlayerID))
areaInfo.PlayerName = cacheDict.get("Name", "")
- areaInfo.Face = cacheDict.get("Job", 0)
-
+ 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))
@@ -1370,7 +1427,9 @@
if mineItemData.RobPlayerID:
robCacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(mineItemData.RobPlayerID))
mineItem.RobPlayerName = robCacheDict.get("Name", "")
- mineItem.RobFace = robCacheDict.get("Job", 0)
+ mineItem.RobJob = robCacheDict.get("Job", 0)
+ mineItem.RobFace = robCacheDict.get("Face", 0)
+ mineItem.RobFacePic = robCacheDict.get("FacePic", 0)
areaInfo.MineItemList.append(mineItem)
areaInfo.MineCount = len(areaInfo.MineItemList)
@@ -1394,7 +1453,9 @@
if playerID != recordInfo.TagPlayerID and recordInfo.TagPlayerID > Def_FakeAreaCount:
tagCacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(recordInfo.TagPlayerID))
recordInfo.TagPlayerName = tagCacheDict.get("Name", "")
- recordInfo.TagFace = tagCacheDict.get("Job", 0)
+ recordInfo.TagJob = tagCacheDict.get("Job", 0)
+ recordInfo.TagFace = tagCacheDict.get("Face", 0)
+ recordInfo.TagFacePic = tagCacheDict.get("FacePic", 0)
clientPack.AreaRecordList.append(recordInfo)
clientPack.RecordCount = len(clientPack.AreaRecordList)
NetPackCommon.SendFakePack(curPlayer, clientPack)
@@ -1434,7 +1495,7 @@
itemCount = ipyData.GetItemCount()
itemLV = ipyData.GetItemLV()
awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount
- awardInfoList.append([GUID, awardTime, workerCount, areaPlayerID, mineID, itemLV, itemID, itemCount])
+ awardInfoList.append([awardTime, workerCount, areaPlayerID, mineID, itemLV, itemID, itemCount])
# 通知地图玩家给物品
curPlayer.SetDict(MineAreaAwardGetTick, tick)
@@ -1444,17 +1505,17 @@
def __DoMineAreaAwardGetOK(curPlayer, dataMsg):
playerID = curPlayer.GetPlayerID()
- GUIDList, awardItemList = dataMsg
+ _, awardItemList = dataMsg
curPlayer.SetDict(MineAreaAwardGetTick, 0)
awardMgr = PyDataManager.GetDBPyMineAreaAwardManager()
awardDict = awardMgr.playerAreaAwardDict.get(playerID, {})
if not awardDict:
return
+ GameWorld.DebugLog("福地结算奖励OK: %s" % len(awardDict), playerID)
- for GUID in GUIDList:
- awardDict.pop(GUID, None)
-
+ awardMgr.playerAreaAwardDict[playerID] = {}
+
SyncMineAwardAward(curPlayer, 1, awardItemList)
return
--
Gitblit v1.8.0