From 82bbf8b17498b1d415128b3e8a613c4efadf5b96 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 27 十一月 2024 11:45:28 +0800
Subject: [PATCH] 10318 【英文】【越南】【BT】【砍树】统一增加奖励获得封包(增加每日礼包事件DailyGiftbag;屏蔽多余的CTG事件下发;)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py | 220 ++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 193 insertions(+), 27 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py
index 48d25e7..97f2b0b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py
@@ -17,12 +17,15 @@
import GameWorld
import ShareDefine
-import PlayerUniversalGameRec
+import ChPyNetSendPack
+import NetPackCommon
+import PlayerViewCache
+import IpyGameDataPY
-import time
+ConfigExKey_SkyTowerPassPlayerIDList = "SkyTowerPassPlayerIDList"
def OnPlayerLogin(curPlayer):
- PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
+ Sync_SkyTowerPassPlayer(curPlayer)
return
def __GetPassPlayerRecDataByFloorID(floorID):
@@ -38,47 +41,210 @@
return recData
-def MapServer_SkyTowerInfo(msgList):
+def MapServer_SkyTowerInfo(curPlayer, msgList):
## 天星塔过关
msgType, msgData = msgList
# 过关
if msgType == "ServerChallengePass":
- __OnServerChallengePass(msgData)
- return
+ rankIndex = __OnServerChallengePass(curPlayer, msgData)
+ return msgList + [rankIndex]
# 领奖
if msgType == "ServerChallengeReward":
- floorID = msgData[0]
+ floorID, needPlayerCount, _ = msgData
recData = __GetPassPlayerRecDataByFloorID(floorID)
- isPass = 1 if recData else 0
- return msgList + [isPass]
+ passPlayerIDList = __GetPassPlayerIDList(recData)
+ canGet = 1 if len(passPlayerIDList) >= needPlayerCount else 0
+ return msgList + [canGet]
+
+ # 合服首登
+ if msgType == "MixFirstLogin":
+ __OnMixFirstLogin(curPlayer, msgData)
+ return
return
-def __OnServerChallengePass(msgData):
+def __OnMixFirstLogin(curPlayer, msgData):
+
+ playerID = curPlayer.GetPlayerID()
+ passFloorInfo = msgData[0]
+
+ GameWorld.Log("合服首登填充天星塔全服过关信息: %s" % passFloorInfo, playerID)
+ syncRecDataList = []
+ recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
+ for index in xrange(recTypeListData.Count()):
+ recData = recTypeListData.At(index)
+ floorID = recData.GetValue1()
+ if floorID not in passFloorInfo:
+ continue
+ maxNeedPassCount = passFloorInfo.pop(floorID)
+ passPlayerIDList = __GetPassPlayerIDList(recData)
+ if playerID in passPlayerIDList:
+ continue
+ if len(passPlayerIDList) >= maxNeedPassCount:
+ continue
+ __AddPassPlayerIDList(recData, passPlayerIDList, playerID)
+ syncRecDataList.append(recData)
+ GameWorld.Log(" 添加天星塔过关记录: floorID=%s,passPlayerIDList=%s" % (floorID, passPlayerIDList), playerID)
+
+ for floorID, maxNeedPassCount in passFloorInfo.items():
+ recData = recTypeListData.AddRec()
+ recData.SetValue1(floorID)
+ passPlayerIDList = []
+ __AddPassPlayerIDList(recData, passPlayerIDList, playerID)
+ syncRecDataList.append(recData)
+ GameWorld.Log(" 新增天星塔过关记录: floorID=%s,passPlayerIDList=%s" % (floorID, passPlayerIDList), playerID)
+
+ if syncRecDataList:
+ Sync_SkyTowerPassPlayer(None, syncRecDataList)
+
+ return
+
+def __GetPassPlayerIDList(recData):
+ strValue3 = recData.GetStrValue3()
+ try:
+ passPlayerIDList = eval(strValue3) if strValue3 else []
+ except:
+ passPlayerIDList = []
+ return passPlayerIDList
+
+def __AddPassPlayerIDList(recData, passPlayerIDList, playerID):
+ isAdd = False
+ if playerID not in passPlayerIDList:
+ passPlayerIDList.append(playerID)
+ isAdd = True
+ updStr = str(passPlayerIDList).replace(" ", "")
+ if len(updStr) > 255:
+ passPlayerIDList.remove(playerID)
+ updStr = str(passPlayerIDList).replace(" ", "")
+ isAdd = False
+ recData.SetStrValue3(updStr)
+ if isAdd:
+ SkyTowerPassPlayerIDList = IpyGameDataPY.GetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList)
+ if SkyTowerPassPlayerIDList and playerID not in SkyTowerPassPlayerIDList:
+ SkyTowerPassPlayerIDList.append(playerID)
+ IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, SkyTowerPassPlayerIDList)
+ GameWorld.DebugLog("__AddPassPlayerIDList SkyTowerPassPlayerIDList=%s" % SkyTowerPassPlayerIDList)
+ return passPlayerIDList
+
+def IsSkyTowerPassPlayer(playerID):
+ SkyTowerPassPlayerIDList = IpyGameDataPY.GetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList)
+ if not SkyTowerPassPlayerIDList:
+ SkyTowerPassPlayerIDList = []
+ recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
+ for index in xrange(recTypeListData.Count()):
+ recData = recTypeListData.At(index)
+ passPlayerIDList = __GetPassPlayerIDList(recData)
+ for pID in passPlayerIDList:
+ if pID not in SkyTowerPassPlayerIDList:
+ SkyTowerPassPlayerIDList.append(pID)
+ IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, SkyTowerPassPlayerIDList)
+ #GameWorld.DebugLog("IsSkyTowerPassPlayer SkyTowerPassPlayerIDList=%s" % SkyTowerPassPlayerIDList)
+ return playerID in SkyTowerPassPlayerIDList
+
+def __OnServerChallengePass(curPlayer, msgData):
## 全服挑战层过关
- floorID, playerID, playerName, job, playerLV, realmLV = msgData
+ playerID = curPlayer.GetPlayerID()
+ floorID, maxNeedPassCount, _ = msgData
+ GameWorld.DebugLog("新增天星塔全服挑战层过关记录! floorID=%s,maxNeedPassCount=%s" % (floorID, maxNeedPassCount), playerID)
recData = __GetPassPlayerRecDataByFloorID(floorID)
- if recData:
- GameWorld.DebugLog("该天星塔已经有人先过关了,不处理!floorID=%s" % floorID, playerID)
- return
- GameWorld.DebugLog("新增天星塔全服挑战层过关记录!floorID=%s" % floorID, playerID)
+ if not recData:
+ recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
+ recData = recTypeListData.AddRec()
+ recData.SetValue1(floorID)
+
+ passPlayerIDList = __GetPassPlayerIDList(recData)
+ if len(passPlayerIDList) >= maxNeedPassCount:
+ return -1
- recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
- recData = recTypeListData.AddRec()
- recData.SetTime(int(time.time()))
- recData.SetValue1(floorID)
- recData.SetValue2(playerID)
- recData.SetValue3(playerLV)
- recData.SetValue4(job)
- recData.SetValue5(realmLV)
- recData.SetStrValue1(playerName)
-
+ passPlayerIDList = __AddPassPlayerIDList(recData, passPlayerIDList, playerID)
# 广播单条数据
- PlayerUniversalGameRec.SendUniversalGameRecSingle(None, recData)
+ Sync_SkyTowerPassPlayer(None, [recData])
+ return passPlayerIDList.index(playerID)
+
+def GMAddRobotPassFloor(floorID, robotCount):
+ recData = __GetPassPlayerRecDataByFloorID(floorID)
+ if not recData:
+ recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
+ recData = recTypeListData.AddRec()
+ recData.SetValue1(floorID)
+
+ robotID = 0
+ passPlayerIDList = __GetPassPlayerIDList(recData)
+ for _ in range(robotCount):
+ robotID += 1
+ passPlayerIDList = __AddPassPlayerIDList(recData, passPlayerIDList, robotID)
+
+ GameWorld.DebugLog("GM添加天星塔机器人过关全服层: floorID=%s,robotCount=%s,passPlayerIDList=%s"
+ % (floorID, robotCount, passPlayerIDList))
+ # 广播单条数据
+ Sync_SkyTowerPassPlayer(None, [recData])
return
+def GMClearPassFloor():
+ recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
+ recTypeListData.Clear()
+ IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, [])
+ GameWorld.DebugLog("GM清空天星塔全服过关信息")
+ return
-
+def Sync_SkyTowerPassPlayer(curPlayer=None, recDataList=None):
+ if recDataList == None:
+ recDataList = []
+ recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
+ for index in xrange(recTypeListData.Count()):
+ recDataList.append(recTypeListData.At(index))
+
+ passFloorList = []
+ passPlayerIDList = []
+ for recData in recDataList:
+ floorID = recData.GetValue1()
+ playerIDList = __GetPassPlayerIDList(recData)
+ for playerID in playerIDList:
+ if playerID not in passPlayerIDList:
+ passPlayerIDList.append(playerID)
+
+ passFloorInfo = ChPyNetSendPack.tagGCSkyTowerPassFloor()
+ passFloorInfo.FloorID= floorID
+ passFloorInfo.PassPlayerIDList = playerIDList
+ passFloorInfo.PassPlayerCount = len(passFloorInfo.PassPlayerIDList)
+ passFloorList.append(passFloorInfo)
+
+ if not passFloorList and not passPlayerIDList:
+ return
+
+ passPlayerList = []
+ for playerID in passPlayerIDList:
+ curCache = PlayerViewCache.FindViewCache(playerID)
+ cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) if curCache else {}
+
+ playerInfo = ChPyNetSendPack.tagGCSkyTowerPassPlayer()
+ playerInfo.PlayerID = playerID
+ playerInfo.PlayerName = ("robot%s" % playerID) if playerID < 1000 else cacheDict.get("Name", str(playerID))
+ playerInfo.Job = cacheDict.get("Job", 1)
+ playerInfo.LV = cacheDict.get("LV", 1)
+ playerInfo.RealmLV = cacheDict.get("RealmLV", 0)
+ playerInfo.Face = cacheDict.get("Face", 0)
+ playerInfo.FacePic = cacheDict.get("FacePic", 0)
+
+ passPlayerList.append(playerInfo)
+
+ clientPack = ChPyNetSendPack.tagGCSkyTowerPassPlayerInfo()
+ clientPack.Clear()
+ clientPack.PassFloorList = passFloorList
+ clientPack.FloorCount = len(clientPack.PassFloorList)
+ clientPack.PassPlayerList = passPlayerList
+ clientPack.PlayerCount = len(clientPack.PassPlayerList)
+
+ if curPlayer:
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
+ else:
+ playerManager = GameWorld.GetPlayerManager()
+ for i in range(0, playerManager.GetPlayerCount()):
+ curPlayer = playerManager.GetPlayerByIndex(i)
+ if curPlayer == None or not curPlayer.GetInitOK():
+ continue
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
+ return
--
Gitblit v1.8.0