From 48c780320dc826c50015d31dea1bbe55e7cf5173 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 26 十二月 2018 18:19:55 +0800
Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(增加强制退出跨服状态;增加相关提示;增加部分匹配限制;组队匹配进入副本增加验证是否跨服匹配中)
---
ServerPython/CoreServerGroup/GameServer/PyNetPack.ini | 6 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossPKMatching.py | 50 ++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 48 ++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py | 7 +
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 48 ++++++++++++
ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py | 15 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py | 22 ++++-
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py | 11 ++
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py | 1
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py | 2
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 7 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 2
14 files changed, 217 insertions(+), 8 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
index 2e4db7a..1a5332b 100644
--- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
+++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
@@ -331,12 +331,16 @@
Writer = hxp
Releaser = hxp
RegType = 0
-RegisterPackCount = 1
+RegisterPackCount = 2
PacketCMD_1=0xC0
PacketSubCMD_1=0x02
PacketCallFunc_1=OnViewCrossPlayerInfo
+PacketCMD_2=0xC0
+PacketSubCMD_2=0x03
+PacketCallFunc_2=OnForceQuitCrossState
+
[PlayerXMZZ]
ScriptName = Player\PlayerXMZZ.py
Writer = xdh
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index 7412440..24383be 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -639,6 +639,7 @@
Def_PlayerKey_MergeRegisterType = "MergeRegisterType" #当前上传数据的活动类型
Def_PlayerKey_MergeRegisterRoomID = "MergeRegisterRoomID" #当前上传数据的roomID
Def_PlayerKey_IsLoginToMergeServer = "IsLoginToMergeServer" #是否要登陆跨服服务器
+Def_PlayerKey_IsCrossPKMatching = "IsCrossPKMatching" #是否跨服匹配中
Def_PlayerKey_FreshmanGuiderDay = "FreshmanGuiderDay" #新手指导员天数
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 14cdda3..fe24eb8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -2983,6 +2983,54 @@
#------------------------------------------------------
+# C0 03 强制退出跨服状态 #tagCGForceQuitCrossState
+
+class tagCGForceQuitCrossState(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xC0
+ self.SubCmd = 0x03
+ return
+
+ def ReadData(self, stringData, _pos=0, _len=0):
+ self.Clear()
+ memmove(addressof(self), stringData[_pos:], self.GetLength())
+ return _pos + self.GetLength()
+
+ def Clear(self):
+ self.Cmd = 0xC0
+ self.SubCmd = 0x03
+ return
+
+ def GetLength(self):
+ return sizeof(tagCGForceQuitCrossState)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// C0 03 强制退出跨服状态 //tagCGForceQuitCrossState:
+ Cmd:%s,
+ SubCmd:%s
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd
+ )
+ return DumpString
+
+
+m_NAtagCGForceQuitCrossState=tagCGForceQuitCrossState()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGForceQuitCrossState.Cmd,m_NAtagCGForceQuitCrossState.SubCmd))] = m_NAtagCGForceQuitCrossState
+
+
+#------------------------------------------------------
# C0 01 查看跨服竞技场赛季排行榜 #tagCGViewCrossPKBillboard
class tagCGViewCrossPKBillboard(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index 345992d..58401ad 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -779,6 +779,7 @@
}
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_PKCancel, dataMsg)
PlayerControl.SetVsRoomId(curPlayer, 0)
+ SetIsCrossPKMatching(curPlayer, 0)
GameWorld.Log("发送取消跨服PK匹配到跨服服务器:dataMsg=%s" % str(dataMsg), curPlayer.GetPlayerID())
return
@@ -1476,9 +1477,18 @@
return
if result == 1:
+ SetIsCrossPKMatching(curPlayer, 1)
NetPackCommon.SendFakePack(curPlayer, ChPyNetSendPack.tagGCCrossRealmPKStartMatch())
return
+
+## 跨服匹配状态
+def SetIsCrossPKMatching(curPlayer, isMatching):
+ curPlayer.SetDict(ChConfig.Def_PlayerKey_IsCrossPKMatching, isMatching)
+ sysMsg = str(isMatching)
+ curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossPKMatching", sysMsg, len(sysMsg))
+ return
+def GetIsCrossPKMatching(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_IsCrossPKMatching)
def CrossServerMsg_PKMatchResult(vsRoomDict):
## 跨服PK匹配结果
@@ -1549,6 +1559,7 @@
break
PlayerControl.SetCrossRealmState(player, 1)
+ SetIsCrossPKMatching(player, 0)
# 通知匹配成功,可进入跨服
matchOKPack = ChPyNetSendPack.tagGCCrossRealmPKMatchOK()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
index 7d9c53d..35f6bf2 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
@@ -100,6 +100,21 @@
# 通用包,通知客户端可进入跨服服务器
return
+#// C0 03 强制退出跨服状态 #tagCGForceQuitCrossState
+#
+#struct tagCGForceQuitCrossState
+#{
+# tagHead Head;
+#};
+def OnForceQuitCrossState(index, clientData, tick):
+ ''' 约定该封包仅玩家当前处于跨服状态,但是一直连不上跨服服务器时才会发次包强制重置跨服状态
+ 一般是跨服服务器异常或其他错误导致无法登录跨服服务器
+ '''
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ GameWorld.ErrLog("某些异常情况下,前端强制发包退出跨服状态! ", curPlayer.GetPlayerID())
+ PlayerControl.SetCrossRealmState(curPlayer, 0)
+ return
+
#// C0 02 查看跨服玩家信息 #tagCGViewCrossPlayerInfo
#
#struct tagCGViewCrossPlayerInfo
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py
index 5d7ffba..520c040 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py
@@ -2795,6 +2795,8 @@
["TeamEnterDefaultMe", "TeamEnterDefaultAll"], "SingleEnterDefaul"],
ShareDefine.EntFBAskRet_Sit:[["TeamMatchingSITMe", "TeamMatchingSITAll"],
["TeamEnterSITMe", "TeamEnterSITAll"], "Carry_lhs_697674"],
+ ShareDefine.EntFBAskRet_CrossPKMatching:[["CrossMatching9", "CrossMatching10"],
+ ["CrossMatching11", "CrossMatching12"], "CrossMatching8"],
ShareDefine.EntFBAskRet_Other:[["TeamMatchingDefaultMe", "TeamMatchingDefaultAll"],
["TeamEnterDefaultMe", "TeamEnterDefaultAll"], "SingleEnterDefaul"],
}
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index cfd7eb2..0e9d3b5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1726,9 +1726,10 @@
EntFBAskRet_InFB, # 11 副本中
EntFBAskRet_TJG, # 12 脱机挂中
EntFBAskRet_Sit, # 13 打坐中
+ EntFBAskRet_CrossPKMatching,# 14 跨服匹配中
EntFBAskRet_Other, # xx 其他限制
EntFBAskRet_Max,
-) = range(16)
+) = range(17)
#增加仙盟活跃的活动类型
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index c25bc11..f6021ab 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3208,6 +3208,8 @@
Def_PlayerKey_CalcAddAttrType = "CalcAType_%s_%s_%s" # 刷属性类型, 参数[funcIndex, attrIndex, 缓存编号]
Def_PlayerKey_CalcAddAttrValue = "CalcAValue_%s_%s_%s" # 刷属性值, 参数[funcIndex, attrIndex, 缓存编号]
+Def_PlayerKey_IsCrossPKMatching = "IsCrossPKMatching" #是否跨服匹配中
+
Def_PDict_QueryTechLVUPState = "QueryTechLVUPState" # 查询科技等级提升状态
Def_PDict_PKStateTick = "PKStateTick" # PK状态tick,只要有一方发起攻击,双方均进入PK状态
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 14cdda3..fe24eb8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -2983,6 +2983,54 @@
#------------------------------------------------------
+# C0 03 强制退出跨服状态 #tagCGForceQuitCrossState
+
+class tagCGForceQuitCrossState(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xC0
+ self.SubCmd = 0x03
+ return
+
+ def ReadData(self, stringData, _pos=0, _len=0):
+ self.Clear()
+ memmove(addressof(self), stringData[_pos:], self.GetLength())
+ return _pos + self.GetLength()
+
+ def Clear(self):
+ self.Cmd = 0xC0
+ self.SubCmd = 0x03
+ return
+
+ def GetLength(self):
+ return sizeof(tagCGForceQuitCrossState)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// C0 03 强制退出跨服状态 //tagCGForceQuitCrossState:
+ Cmd:%s,
+ SubCmd:%s
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd
+ )
+ return DumpString
+
+
+m_NAtagCGForceQuitCrossState=tagCGForceQuitCrossState()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGForceQuitCrossState.Cmd,m_NAtagCGForceQuitCrossState.SubCmd))] = m_NAtagCGForceQuitCrossState
+
+
+#------------------------------------------------------
# C0 01 查看跨服竞技场赛季排行榜 #tagCGViewCrossPKBillboard
class tagCGViewCrossPKBillboard(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
index dc048da..d484d6e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -68,13 +68,18 @@
def DoEnterCrossRealm(curPlayer):
## 玩家进入跨服处理,本服的逻辑处理
curPlayer.SetVisible(False)
+ curPet = curPlayer.GetPetMgr().GetFightPet()
+ if curPet:
+ curPet.SetVisible(False)
return
def DoExitCrossRealm(curPlayer):
## 玩家退出跨服处理,本服的逻辑处理
GameWorld.Log("DoExitCrossRealm...", curPlayer.GetPlayerID())
curPlayer.SetVisible(True)
+ curPet = curPlayer.GetPetMgr().GetFightPet()
+ if curPet:
+ curPet.SetVisible(True)
if PlayerControl.GetCrossRealmState(curPlayer):
PlayerControl.SetCrossRealmState(curPlayer, 0)
-
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index ded7ad0..70637d6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -82,6 +82,7 @@
import PlayerFamilyTech
import PlayerCostRebate
import PlayerFairyCeremony
+import PlayerCrossRealmPK
import FunctionNPCCommon
import CrossRealmPlayer
import ChNetSendPack
@@ -1714,6 +1715,12 @@
NotifyCode(curPlayer, "SingleEnterPK", [mapID])
return ShareDefine.EntFBAskRet_PKState
+ ## 跨服PK匹配中
+ if PlayerCrossRealmPK.GetIsCrossPKMatching(curPlayer):
+ if isNotify:
+ NotifyCode(curPlayer, "CrossMatching8", [mapID])
+ return ShareDefine.EntFBAskRet_CrossPKMatching
+
#===============================================================================================
# # 这里不做状态限制,由前端处理,因为策划要根据界面来处理,同一传送功能有可能在不同界面
# # PK状态检查
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
index cddeaa4..f1b09e7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
@@ -28,6 +28,12 @@
import GameWorld
import ChConfig
+## 是否匹配中
+def SetIsCrossPKMatching(curPlayer, isMatching):
+ curPlayer.SetDict(ChConfig.Def_PlayerKey_IsCrossPKMatching, isMatching)
+ return
+def GetIsCrossPKMatching(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_IsCrossPKMatching)
+
def DoPlayerOnDay(curPlayer):
if GameWorld.IsCrossServer():
return
@@ -183,17 +189,25 @@
requestType = clientData.Type
if GameWorld.IsCrossServer():
- GameWorld.DebugLog("跨服服务器无法发起匹配!")
+ GameWorld.DebugLog("跨服服务器无法发起匹配!", playerID)
+ return
+
+ if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
+ GameWorld.DebugLog("副本中,无法进行跨服匹配!", playerID)
+ return
+
+ if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie or curPlayer.GetHP() == 0:
+ #GameWorld.DebugLog("已死亡,无法进行跨服匹配!", playerID)
return
if GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) != 1:
GameWorld.DebugLog("OnCrossRealmPKMatch 跨服赛季未开启,不可进行匹配!", playerID)
- PlayerControl.NotifyCode(curPlayer, "SeasonIsNotOpen")
+ #PlayerControl.NotifyCode(curPlayer, "SeasonIsNotOpen")
return
if not IsCrossRealmPKMatchState():
GameWorld.DebugLog("OnCrossRealmPKMatch 跨服匹配未开启,不可进行匹配!", playerID)
- PlayerControl.NotifyCode(curPlayer, "MatchIsNotOpen")
+ #PlayerControl.NotifyCode(curPlayer, "MatchIsNotOpen")
return
GameWorld.Log("收到跨服PK匹配: type=%s,accID=%s" % (requestType, accID), playerID)
@@ -230,7 +244,7 @@
# 取消匹配
else:
- sendMsg = "Client Cancel!"
+ sendMsg = "ClientCancel"
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "CrossRealmPKCancel", sendMsg, len(sendMsg))
GameWorld.Log(" 发送取消匹配到GameServer sendMsg=%s" % str(sendMsg), playerID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossPKMatching.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossPKMatching.py
new file mode 100644
index 0000000..35bd430
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossPKMatching.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.RemoteQuery.GY_Query_CrossPKMatching
+#
+# @todo:是否跨服匹配状态更新
+# @author hxp
+# @date 2018-12-26
+# @version 1.0
+#
+# 详细描述: 是否跨服匹配状态更新
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2018-12-26 18:30"""
+#-------------------------------------------------------------------------------
+
+import PlayerCrossRealmPK
+import GameWorld
+
+#------------------------------------------------------------------------------
+## 跨服赛报名调用接口
+# @param query_Type 请求类型
+# @param query_ID 请求的玩家ID
+# @param packCMDList 发包命令
+# @param tick 当前时间
+# @return "True" or "False" or ""
+# @remarks 函数详细说明.
+def DoLogic(query_Type, query_ID, packCMDList, tick):
+ return
+
+
+#------------------------------------------------------------------------------
+## 执行结果
+# @param curPlayer 发出请求的玩家
+# @param callFunName 功能名称
+# @param funResult 查询的结果
+# @param tick 当前时间
+# @return None
+# @remarks 函数详细说明.
+def DoResult(curPlayer, callFunName, funResult, tick):
+ isMatching = eval(funResult)
+ GameWorld.Log("GY_Query_CrossPKMatching isMatching=%s" % isMatching, curPlayer.GetPlayerID())
+ if not curPlayer:
+ return
+ PlayerCrossRealmPK.SetIsCrossPKMatching(curPlayer, isMatching)
+ return
+
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index cfd7eb2..0e9d3b5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1726,9 +1726,10 @@
EntFBAskRet_InFB, # 11 副本中
EntFBAskRet_TJG, # 12 脱机挂中
EntFBAskRet_Sit, # 13 打坐中
+ EntFBAskRet_CrossPKMatching,# 14 跨服匹配中
EntFBAskRet_Other, # xx 其他限制
EntFBAskRet_Max,
-) = range(16)
+) = range(17)
#增加仙盟活跃的活动类型
--
Gitblit v1.8.0