From 1b561794e12bed747e200d7a1df2639d2228edad Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 28 九月 2022 16:39:04 +0800
Subject: [PATCH] 9701 【后端】【越南】【BT7】【主干】跨服竞技64位排位赛(GameServer支持功能开启判断;排位相关封包通知仅通知功能开启的玩家)
---
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py | 45 ++++++++++++++++++++++
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 7 ++-
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py | 27 +++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossChampionship.py | 4 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 1
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py | 7 +++
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 1
PySysDB/PySysDBG.h | 1
8 files changed, 90 insertions(+), 3 deletions(-)
diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 2421f8a..b10e0d6 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -332,6 +332,7 @@
DWORD LimitLV; //开启等级
DWORD LimitMagicWeapon; //需要解锁法宝ID
WORD LimiRealmLV; //需要境界等级
+ BYTE LimitVIPLV; //需要VIP等级
};
//NPC表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
index d105313..a0ffab3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
@@ -758,11 +758,22 @@
return
+def DoChampionshipOpen(curPlayer):
+ NotifyPlayerChampionshipInfo(curPlayer, GameWorld.GetGameWorld().GetTick())
+ return
+
def OnPlayerLogin(curPlayer, tick):
if GameWorld.IsCrossServer():
return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ return
+
+ NotifyPlayerChampionshipInfo(curPlayer, tick)
+ return
+
+def NotifyPlayerChampionshipInfo(curPlayer, tick):
playerID = curPlayer.GetPlayerID()
champMgr = GetChampionshipMgr()
pkZoneIDList = champMgr.GetChampPKZoneIDList()
@@ -2853,11 +2864,13 @@
def Sync_ChampionshipPKZoneGroupInfo(zoneID, groupMarkDict=None, curPlayer=None):
## 同步排位分区分组信息
# @param groupMarkDict: {groupMark:[battleNum, ...], ...}
-
+
champMgr = GetChampionshipMgr()
if curPlayer:
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
+ return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
return
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
@@ -2932,6 +2945,8 @@
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
continue
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ continue
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
@@ -2944,6 +2959,8 @@
champMgr = GetChampionshipMgr()
playerZoneID = champMgr.GetPlayerPKZoneID(playerID)
if not playerZoneID:
+ return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
return
pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID)
@@ -2990,6 +3007,8 @@
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ return
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
if not pkZoneMgr:
@@ -3033,6 +3052,8 @@
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
continue
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ continue
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
@@ -3044,6 +3065,8 @@
if curPlayer:
playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
+ return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
return
clientPack = ChPyNetSendPack.tagGCChampionshipOfficialInfo()
@@ -3104,6 +3127,8 @@
playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
continue
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ continue
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 27cfd99..e0c39da 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -285,6 +285,7 @@
("DWORD", "LimitLV", 0),
("DWORD", "LimitMagicWeapon", 0),
("WORD", "LimiRealmLV", 0),
+ ("BYTE", "LimitVIPLV", 0),
),
"ChinNPC":(
@@ -1379,13 +1380,15 @@
self.FuncId = 0
self.LimitLV = 0
self.LimitMagicWeapon = 0
- self.LimiRealmLV = 0
+ self.LimiRealmLV = 0
+ self.LimitVIPLV = 0
return
def GetFuncId(self): return self.FuncId # 功能标识
def GetLimitLV(self): return self.LimitLV # 开启等级
def GetLimitMagicWeapon(self): return self.LimitMagicWeapon # 需要解锁法宝ID
- def GetLimiRealmLV(self): return self.LimiRealmLV # 需要境界等级
+ def GetLimiRealmLV(self): return self.LimiRealmLV # 需要境界等级
+ def GetLimitVIPLV(self): return self.LimitVIPLV # 需要VIP等级
# NPC表
class IPY_ChinNPC():
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
index 47443a1..289f531 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
@@ -30,6 +30,7 @@
import PlayerDBOper
import IPY_GameServer
import PlayerDBGSEvent
+import CrossChampionship
import IpyGameDataPY
import CrossRealmMsg
import ShareDefine
@@ -405,3 +406,47 @@
return ipyData.GetLimitLV()
+# 因为MapServer玩家属性变更通知GameServer与功能开启通知触发时机有先后顺序,可能导致判断功能开启不准确,所以暂时记录该信息,临时用
+g_playerOpenFuncInfo = {} # 玩家触发功能开启功能ID信息,{playerID:[funcID, ...], ...}
+## 功能是否可用,该函数并不能确保百分百正确,只能大致判断,仅判断部分条件,如包含未判断的条件则不能确保百分百正确
+def GetFuncCanUse(curPlayer, funcID):
+ playerID = curPlayer.GetPlayerID()
+ if playerID in g_playerOpenFuncInfo:
+ if funcID in g_playerOpenFuncInfo[playerID]:
+ return True
+
+ ipyData = IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID)
+ if not ipyData:
+ return False
+
+ if ipyData.GetLimitLV() and ipyData.GetLimitLV() > curPlayer.GetLV():
+ return False
+
+ if ipyData.GetLimiRealmLV() and ipyData.GetLimiRealmLV() > curPlayer.GetOfficialRank():
+ return False
+
+ if ipyData.GetLimitVIPLV() and ipyData.GetLimitVIPLV() > curPlayer.GetVIPLv():
+ return False
+
+ return True
+
+def DoFuncOpenLogic(curPlayer, funcIDList):
+ global g_playerOpenFuncInfo
+ if GameWorld.IsCrossServer():
+ return
+ playerID = curPlayer.GetPlayerID()
+ FuncOpenLogicDict = {
+ ShareDefine.GameFuncID_Championship:lambda curObj:CrossChampionship.DoChampionshipOpen(curObj),
+ }
+ for funcID in funcIDList:
+ if funcID in FuncOpenLogicDict:
+ if playerID not in g_playerOpenFuncInfo:
+ g_playerOpenFuncInfo[playerID] = []
+ openFuncIDList = g_playerOpenFuncInfo[playerID]
+ if funcID not in openFuncIDList:
+ openFuncIDList.append(funcID)
+ GameWorld.DebugLog("触发功能开启逻辑! funcID=%s" % funcID, playerID)
+ FuncOpenLogicDict[funcID](curPlayer)
+ return
+
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index 4d97414..1516745 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -581,6 +581,13 @@
PlayerExam.MapServer_ExitAction(srcPlayerID)
return
+ if callName == 'FuncOpen':
+ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
+ if not curPlayer:
+ return
+ PlayerControl.DoFuncOpenLogic(curPlayer, eval(resultName))
+ return
+
if callName == 'TeamNotify':
#队伍通知
teamID = pack.GetQueryID()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index c1324ff..21e3601 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1138,6 +1138,7 @@
GameFuncID_Arena = 195 # 竞技场
GameFuncID_FaQi = 199 # 法器
GameFuncID_LianTi = 207 # 炼体
+GameFuncID_Championship = 210 # 排位
# 以下为暂时无用的
GameFuncID_Truck = 33 # 运镖
GameFuncID_RunDaily = 34 # 日常跑环
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossChampionship.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossChampionship.py
index 0a075ac..8a6f33b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossChampionship.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossChampionship.py
@@ -28,6 +28,10 @@
import time
+def DoChampionshipOpen(curPlayer):
+ DoPlayerLogin(curPlayer)
+ return
+
def DoPlayerLogin(curPlayer):
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Championship_WorshipCount):
Sync_ChampionshipPlayerInfo(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index c1324ff..21e3601 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1138,6 +1138,7 @@
GameFuncID_Arena = 195 # 竞技场
GameFuncID_FaQi = 199 # 法器
GameFuncID_LianTi = 207 # 炼体
+GameFuncID_Championship = 210 # 排位
# 以下为暂时无用的
GameFuncID_Truck = 33 # 运镖
GameFuncID_RunDaily = 34 # 日常跑环
--
Gitblit v1.8.0