From 78882065bd4a4ed7fb45327e766606dd81bbaf16 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 15 十月 2024 17:03:12 +0800
Subject: [PATCH] 5328 【越南】【英文】【砍树】神兽装备格子拓展(扩展为150格)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py | 185 +++++++++++++++++++++------------------------
1 files changed, 87 insertions(+), 98 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py
index 433b35b..1924699 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py
@@ -20,12 +20,12 @@
import NetPackCommon
import PlayerControl
import ChPyNetSendPack
-import CrossChampionship
import PlayerViewCache
import PlayerRecData
import CrossRealmMsg
import IpyGameDataPY
import GameWorld
+import ChConfig
import random
import time
@@ -38,33 +38,30 @@
def SetWorshipValue(recData, worshipValue): recData.SetValue2(worshipValue)
def GetWorshipDays(recData): return recData.GetValue3() # 持续天数: 0永久,>0-天数
def SetWorshipDays(recData, days): recData.SetValue3(days)
-def GetWorshipZoneID(recData): return recData.GetValue4() # 膜拜分区,跨服膜拜类型有用
-def SetWorshipZoneID(recData, zoneID): recData.SetValue4(zoneID)
-def GetModelShowInfo(recData): return recData.GetEvalUserData({}) # 模型外观显示信息,备用,缓存没有时取这里
-def SetModelShowInfo(recData, modelShow): return recData.SetEvalUserData(modelShow)
-def GetPlayerModelShow(playerID):
- ## 获取膜拜对象的外观显示信息 - 本服跨服通用
- cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(playerID))
- if not cacheDict:
- return {}
- modelShow = {
- "Name":cacheDict.get("Name", ""),
- "AccID":cacheDict.get("AccID", ""),
- "LV":cacheDict.get("LV", 0),
- "RealmLV":cacheDict.get("RealmLV", 0),
- "Job":cacheDict.get("Job", 0),
- "VIPLV":cacheDict.get("VIPLV", 0),
- "TitleID":cacheDict.get("TitleID", 0),
- "FightPower":cacheDict.get("FightPower", 0),
- "EquipShowSwitch":cacheDict.get("EquipShowSwitch", 0),
- "EquipShowID":cacheDict.get("EquipShowID", []),
- }
- return modelShow
# 玩家每日膜拜记录 RecType = ShareDefine.Def_PlayerRecType_WorshipDaily
-def GetTodayWorshipRecord(recData): return recData.GetEvalUserData({}) # 今日已膜拜记录 {tagPlayerID:[[膜拜类型, 膜拜值], ...], ...}
-
+# 今日已膜拜记录 {tagPlayerID:[[膜拜类型, 膜拜值], ...], ...}
+# 今日是否已膜拜过该玩家某个膜拜
+def HasWorshipRecordToday(recData, tagPlayerID, worshipType, worshipValue):
+ worshipRecordList = recData.GetUserDataByKey(tagPlayerID, [])
+ if not worshipRecordList:
+ return False
+ return [worshipType, worshipValue] in worshipRecordList
+# 设置今日已膜拜过该玩家某个膜拜
+def SetWorshipRecordToday(recData, tagPlayerID, worshipType, worshipValue):
+ worshipRecordList = recData.GetUserDataByKey(tagPlayerID, [])
+ recordInfo = [worshipType, worshipValue]
+ if recordInfo not in worshipRecordList:
+ worshipRecordList.append(recordInfo)
+ recData.SetUserDataByKey(tagPlayerID, worshipRecordList)
+ return
##--------------------------------------------------------------------------------------------------
+def OnServerStart():
+ return
+
+def GetPlayerViewInfo(playerID):
+ ## 获取膜拜对象的外观显示信息 - 本服跨服通用
+ return PlayerViewCache.GetShotCacheDict(playerID, "AccID", "VIPLV", "FightPower", "Model")
def OnPlayerLogin(curPlayer):
@@ -136,9 +133,9 @@
def __UpdWorshipByDay(isCrossServer, worshipList, recData):
## 过天更新未过期膜拜信息
playerID = recData.GetPlayerID()
- modelShow = GetPlayerModelShow(playerID)
- if modelShow:
- SetModelShowInfo(recData, modelShow)
+ playerInfo = GetPlayerViewInfo(playerID)
+ if playerInfo:
+ recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo)
if isCrossServer:
worshipList.append(recData.GetString())
@@ -153,14 +150,8 @@
return True
return False
-def GetWorshipIpyData(worshipType, worshipValue):
- ## 获取膜拜配置数据
- ipyData = IpyGameDataPY.GetIpyGameDataNotLog("Worship", worshipType, worshipValue)
- return ipyData
-
-def AddWorshipPlayer(playerID, worshipType, worshipValue, days=None, zoneID=0, isNotify=True):
+def AddWorshipPlayer(worshipType, worshipValue, playerID, serverIDList, syncList=None, days=None):
## 添加膜拜玩家,本服跨服通用
- # @param isNotify: 本服-是否通知玩家;跨服-是否通知子服
if worshipType in ShareDefine.Def_WorshipTypeCross:
if not GameWorld.IsCrossServer():
@@ -171,7 +162,7 @@
GameWorld.ErrLog("跨服服务器不允许添加非跨服膜拜! worshipType=%s" % (worshipType))
return
- ipyData = IpyGameDataPY.GetIpyGameData("Worship", worshipType, worshipValue)
+ ipyData = IpyGameDataPY.GetIpyGameDataNotLog("Worship", worshipType, worshipValue)
if not ipyData:
return
@@ -181,23 +172,41 @@
playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
recData = playerRecMgr.GetPlayerRecData(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID, [worshipType, worshipValue])
if not recData:
- GameWorld.Log("添加膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,zoneID=%s" % (playerID, worshipType, worshipValue, days, zoneID))
+ GameWorld.Log("添加膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,%s" % (playerID, worshipType, worshipValue, days, serverIDList))
recData = playerRecMgr.AddPlayerRecData(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID)
else:
- GameWorld.Log("更新膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,zoneID=%s" % (playerID, worshipType, worshipValue, days, zoneID))
+ GameWorld.Log("更新膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,%s" % (playerID, worshipType, worshipValue, days, serverIDList))
+ recData.SetTime(int(time.time()))
SetWorshipType(recData, worshipType)
SetWorshipValue(recData, worshipValue)
SetWorshipDays(recData, days)
- SetModelShowInfo(recData, GetPlayerModelShow(playerID))
- SetWorshipZoneID(recData, zoneID)
- if isNotify:
- if GameWorld.IsCrossServer():
- SyncAddCrossWorship([recData])
- else:
- Sync_UnWorshipInfo(None, [recData])
-
+ playerInfo = GetPlayerViewInfo(playerID)
+ serverID = GameWorld.GetAccIDServerID(playerInfo.get("AccID", ""))
+ saveServerIDList = [] + serverIDList # 重新创建一份存储,不改变传入值
+ # 确保玩家自身一定能看到自己,跨服排位赛历史分区问题
+ if saveServerIDList and serverID and not GameWorld.CheckServerIDInList(serverID, saveServerIDList):
+ saveServerIDList.append(serverID)
+ recData.SetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList, saveServerIDList) # 保存当下的区服ID范围
+ recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo) # 保存当下的玩家基本信息
+
+ if isinstance(syncList, list):
+ syncList.append(recData)
+ else:
+ SendNewWorshipPlayer([recData])
+
return recData
+
+def SendNewWorshipPlayer(syncList):
+ ## 同步新膜拜数据
+ if not syncList:
+ return
+ if GameWorld.IsCrossServer():
+ SyncAddCrossWorship(syncList)
+ else:
+ Sync_UnWorshipInfo(None, syncList)
+ return
+
def DelWorshipPlayer(worshipType, worshipValue=None, delPlayerID=None):
## 删除膜拜玩家,本服跨服通用
@@ -259,7 +268,9 @@
GameWorld.DebugLog("膜拜: tagPlayerID=%s,worshipType=%s,worshipValue=%s,moneyType=%s,moneyValue=%s"
% (tagPlayerID, worshipType, worshipValue, moneyType, moneyValue), playerID)
- __AddWorshipRecord(playerID, recData)
+ playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
+ worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID)
+ SetWorshipRecordToday(worshipRecData, tagPlayerID, worshipType, worshipValue)
__SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, 0, moneyType, moneyValue)
# 同步地图发放货币
@@ -270,63 +281,37 @@
## 检查玩家是否可膜拜该对象
playerID = curPlayer.GetPlayerID()
recPlayerID = recData.GetPlayerID()
- if playerID == recPlayerID:
- GameWorld.DebugLog("不能膜拜自己!", playerID)
- return
- modelShow = GetModelShowInfo(recData)
- if not modelShow:
+ playerInfo = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, {})
+ if not playerInfo:
GameWorld.DebugLog("没有外观展示的不同步! recPlayerID=%s" % recPlayerID, playerID)
return
- accID = modelShow.get("AccID", "")
+ accID = playerInfo.get("AccID", "")
if not accID:
return
+ serverID = GameWorld.GetAccIDServerID(accID)
+ playerServerID = GameWorld.GetPlayerServerID(curPlayer)
+
worshipType = GetWorshipType(recData)
worshipValue = GetWorshipValue(recData)
- zoneID = GetWorshipZoneID(recData)
if worshipType == ShareDefine.Def_WorshipType_ServerNaming:
#只同步给同ServerID的
- serverID = GameWorld.GetAccIDServerID(accID)
- playerServerID = GameWorld.GetPlayerServerID(curPlayer)
if serverID != playerServerID:
GameWorld.DebugLog("只同步给同ServerID的! recPlayerID=%s,accID=%s,serverID=%s != playerServerID=%s"
% (recPlayerID, accID, serverID, playerServerID), playerID)
return
- elif worshipType == ShareDefine.Def_WorshipType_CrossChampionship:
- #只同步给同分区的
- playerZoneID = CrossChampionship.GetChampionshipMgr().GetPlayerOfficialZoneID(playerID)
- if playerZoneID != zoneID:
- GameWorld.DebugLog("只同步给同分区的! recPlayerID=%s,zoneID=%s != playerZoneID=%s" % (recPlayerID, zoneID, playerZoneID), playerID)
+ else:
+ serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList)
+ if not GameWorld.CheckServerIDInList(playerServerID, serverIDList):
+ GameWorld.DebugLog("该玩家不能膜拜目标玩家! playerServerID=%s not in %s" % (playerServerID, serverIDList), playerID)
return
playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID)
- worshipRecordDict = GetTodayWorshipRecord(worshipRecData)
- if recPlayerID in worshipRecordDict and [worshipType, worshipValue] in worshipRecordDict[recPlayerID]:
- GameWorld.DebugLog("已膜拜过! recPlayerID=%s,worshipType=%s, worshipValue=%s,worshipRecordDict=%s"
- % (recPlayerID, worshipType, worshipValue, worshipRecordDict), playerID)
+ if HasWorshipRecordToday(worshipRecData, recPlayerID, worshipType, worshipValue):
+ GameWorld.DebugLog("今日已膜拜过! recPlayerID=%s,worshipType=%s, worshipValue=%s" % (recPlayerID, worshipType, worshipValue), playerID)
return
return True
-
-def __AddWorshipRecord(playerID, recData):
- ## 添加玩家膜拜目标记录
- playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
- worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID)
- worshipRecordDict = GetTodayWorshipRecord(worshipRecData)
-
- tagPlayerID = recData.GetPlayerID()
- worshipType = GetWorshipType(recData)
- worshipValue = GetWorshipValue(recData)
- recordInfo = [worshipType, worshipValue]
-
- if tagPlayerID not in worshipRecordDict:
- worshipRecordDict[tagPlayerID] = []
- worshipRecordList = worshipRecordDict[tagPlayerID]
- if recordInfo not in worshipRecordList:
- worshipRecordList.append(recordInfo)
-
- #GameWorld.DebugLog("更新今日膜拜记录: %s" % GetTodayWorshipRecord(worshipRecData), playerID)
- return
def __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, result, moneyType=0, moneyValue=0):
## 同步膜拜结果
@@ -372,13 +357,15 @@
playerID = recData.GetPlayerID()
# 如果存在本服的最新外观数据则已本服的为准
- modelShow = GetPlayerModelShow(playerID)
- if modelShow:
- SetModelShowInfo(recData, modelShow)
+ playerInfo = GetPlayerViewInfo(playerID)
+ if playerInfo:
+ recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo)
sysnList.append(recData)
- GameWorld.Log(" 更新跨服膜拜: worshipType=%s,zoneID=%s,playerID=%s,worshipValue=%s,days=%s"
- % (GetWorshipType(recData), GetWorshipZoneID(recData), playerID, GetWorshipValue(recData), GetWorshipDays(recData)))
+
+ serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList)
+ GameWorld.Log(" 更新跨服膜拜: worshipType=%s,worshipValue=%s,playerID=%s,days=%s,%s"
+ % (GetWorshipType(recData), GetWorshipValue(recData), playerID, GetWorshipDays(recData), serverIDList))
#更新数据的可不同步,每个人的膜拜记录都不一样,由登录触发及添加新膜拜触发即可
#Sync_UnWorshipInfo(None, sysnList)
@@ -409,8 +396,10 @@
recData = playerRecMgr.AddPlayerRecDataByDict(attrDict)
sysnList.append(recData)
- GameWorld.Log(" 添加跨服膜拜: worshipType=%s,zoneID=%s,playerID=%s,worshipValue=%s,days=%s"
- % (GetWorshipType(recData), GetWorshipZoneID(recData), playerID, GetWorshipValue(recData), GetWorshipDays(recData)))
+
+ serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList)
+ GameWorld.Log(" 添加跨服膜拜: worshipType=%s,worshipValue=%s,playerID=%s,days=%s,%s"
+ % (GetWorshipType(recData), GetWorshipValue(recData), playerID, GetWorshipDays(recData), serverIDList))
Sync_UnWorshipInfo(None, sysnList)
return
@@ -432,13 +421,13 @@
infoList = []
for recData in unWorshipList:
recPlayerID = recData.GetPlayerID()
- modelShow = GetPlayerModelShow(recPlayerID)
- if modelShow:
+ playerInfo = GetPlayerViewInfo(recPlayerID)
+ if playerInfo:
# 更新本服最新的外观显示,跨服玩家由跨服每日同步更新 __UpdWorshipByDay
- SetModelShowInfo(recData, modelShow)
+ recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo)
else:
- modelShow = GetModelShowInfo(recData)
- if not modelShow:
+ playerInfo = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo)
+ if not playerInfo:
# 没有外观展示的不同步
continue
@@ -450,7 +439,7 @@
infoPack.PlayerID = recPlayerID
infoPack.WorshipType = GetWorshipType(recData)
infoPack.WorshipValue = GetWorshipValue(recData)
- infoPack.PlayerInfo = json.dumps(modelShow, ensure_ascii=False).replace(" ", "")
+ infoPack.PlayerInfo = json.dumps(playerInfo, ensure_ascii=False).replace(" ", "")
infoPack.InfoLen = len(infoPack.PlayerInfo)
if curPlayer:
--
Gitblit v1.8.0