From a8f9421ee701e988e767e2735628e08b67efd393 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 18 一月 2019 17:49:06 +0800
Subject: [PATCH] 5722 【后端】【1.5.100】【1.5】跨服BOSS开发(同步场景灵宠、坐骑变更)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py | 32 ++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py | 24 ++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py | 86 +++++++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py | 51 ++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 3
6 files changed, 190 insertions(+), 9 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index a92a141..a41710e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -1097,6 +1097,9 @@
def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
## 跨服获得物品
+ if packIndex not in [IPY_GameWorld.rptItem]:
+ #GameWorld.DebugLog("跨服获得物品不同步, packIndex=%s" % (packIndex))
+ return
curPlayer = self.__Player
serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
itemData = [tagItem.GetItemTypeID(), tagItem.GetCount(), tagItem.GetIsBind(), tagItem.GetUserData()]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
index f381374..35c9de7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
@@ -23,6 +23,8 @@
import PyGameData
import PlayerDienstgrad
import IpyGameDataPY
+import PlayerHorse
+import PlayerPet
import traceback
# 发送格式: 类型+(数量)+数据
@@ -32,7 +34,24 @@
MergeData_Item, # 对比处理 只算属性的背包 装备 宠物
MergeData_Skill, # 只处理ID
MergeData_Buff, # 即时发送
-) = range(0, 4)
+CrossData_PetState, # 即时发送 宠物出战
+CrossData_HorseChange, # 即时发送 骑乘坐骑变更
+CrossData_RideHorse, # 即时发送 上下马
+) = range(0, 7)
+
+## 写数据类型定义
+(
+WDT_BYTE,
+WDT_WORD,
+WDT_DWORD,
+WDT_String,
+) = range(4)
+
+CrossDataInfo = {
+ CrossData_PetState:[[WDT_DWORD, WDT_BYTE, WDT_BYTE], lambda curObj, valueList:PlayerPet.CrossServer_DoChangePetState(curObj, valueList)],
+ CrossData_HorseChange:[[WDT_DWORD], lambda curObj, valueList:PlayerHorse.CrossServer_ChangeHorse(curObj, valueList)],
+ CrossData_RideHorse:[[WDT_BYTE], lambda curObj, valueList:PlayerHorse.CrossServer_RideHorse(curObj, valueList)],
+ }
# 影响跨服战力属性列表
CrossFightPowerAttrList = [
@@ -107,6 +126,9 @@
elif dataType == MergeData_Player:
__ReadMainServerSyncPlayerData(curPlayer, curPlayer.GetMergePlayerData(), pos)
+ else:
+ __ReadCrossData(curPlayer, dataType, curPlayer.GetMergePlayerData(), pos)
+
except BaseException:
errorMsg = str(traceback.format_exc())
GameWorld.ErrLog('接收跨服变更玩家数据错误 - > %s' % errorMsg, curPlayer.GetPlayerID())
@@ -117,6 +139,68 @@
## ----------------------------------------------------------------------------------------------
+def SendDataToCrossServer(curPlayer, dataType, dataList):
+ ## 通用的根据类型向跨服发送数据
+ if dataType not in CrossDataInfo:
+ return
+
+ if not IsNeedProcessCrossPlayer(curPlayer):
+ return
+
+ dataInfo = CrossDataInfo[dataType][0]
+ if len(dataList) != len(dataInfo):
+ return
+
+ data = ''
+ data = CommFunc.WriteBYTE(data, dataType)
+ for i, wDType in enumerate(dataInfo):
+ value = dataList[i]
+ if wDType == WDT_BYTE:
+ data = CommFunc.WriteBYTE(data, value)
+ elif wDType == WDT_WORD:
+ data = CommFunc.WriteWORD(data, value)
+ elif wDType == WDT_DWORD:
+ data = CommFunc.WriteDWORD(data, value)
+ elif wDType == WDT_String:
+ sLen = len(value)
+ data = CommFunc.WriteBYTE(data, sLen)
+ data = CommFunc.WriteString(data, sLen, value)
+
+ #直接用字节流会报错
+ data = base64.b64encode(data)
+ curPlayer.SendMergePlayerData(data)
+ GameWorld.DebugLog("发送数据到跨服服务器: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID())
+ return
+
+def __ReadCrossData(curPlayer, dataType, pdata, pos):
+ if dataType not in CrossDataInfo:
+ return
+ dataInfo, callFunc = CrossDataInfo[dataType]
+
+ if not callFunc:
+ return
+
+ dataList = []
+ pdata = base64.b64decode(pdata)
+
+ for wDType in dataInfo:
+ if wDType == WDT_BYTE:
+ value, pos = CommFunc.ReadBYTE(pdata, pos)
+ elif wDType == WDT_WORD:
+ value, pos = CommFunc.ReadWORD(pdata, pos)
+ elif wDType == WDT_DWORD:
+ value, pos = CommFunc.ReadDWORD(pdata, pos)
+ elif wDType == WDT_String:
+ sLen, pos = CommFunc.ReadBYTE(pdata, pos)
+ value, pos = CommFunc.ReadString(pdata, pos, sLen)
+ else:
+ continue
+ dataList.append(value)
+
+ GameWorld.DebugLog("收到主服数据: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID())
+ callFunc(curPlayer, dataList)
+ return
+
def IsNeedProcessCrossPlayer(curPlayer):
## 是否需要处理同步跨服中的玩家数据
if GameWorld.IsCrossServer():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
index bb71268..5307f32 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
@@ -517,13 +517,23 @@
def DoLogic_PetInfo_OnLogin(curPlayer, tick):
petMgr = curPlayer.GetPetMgr()
-
- for index in range(0, petMgr.PetList_Cnt()):
- rolePet = petMgr.PetList_At(index)
- #刷新宠物信息并通知客户端
- __RefreshAndSyncPetInfo(rolePet)
- #自动出战宠物
- __AutoSummonPet_OnLogin(curPlayer, rolePet)
+ if GameWorld.IsCrossServer():
+ ''' 0435宠物出现包同步的ID是根据宠物的列表位置来的,比如在第2位发的就是2,而地图的可能是1,会导致ID不一致
+ 所以跨服服务器登录时先清除出战宠物列表,确保登录地图成功后都是从1开始的即可
+ '''
+ petList = []
+ for index in range(0, petMgr.PetList_Cnt()):
+ rolePet = petMgr.PetList_At(index)
+ petList.append(rolePet)
+ for rolePet in petList:
+ petMgr.PetList_SetFree(rolePet.GetRolePet().PetID)
+ else:
+ for index in range(0, petMgr.PetList_Cnt()):
+ rolePet = petMgr.PetList_At(index)
+ #刷新宠物信息并通知客户端
+ __RefreshAndSyncPetInfo(rolePet)
+ #自动出战宠物
+ __AutoSummonPet_OnLogin(curPlayer, rolePet)
if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_Pet):
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_Pet, 1)
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 8d1217a..fc1273e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4791,7 +4791,8 @@
PlayerBillboard.UpdatePlayerFPTotalBillboard(curPlayer)
# 记录开服活动数据
OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_FightPower, totalFightPower)
- CrossPlayerData.OnPlayerFightPowerChange(curPlayer)
+ if beforeFightPower != totalFightPower:
+ CrossPlayerData.OnPlayerFightPowerChange(curPlayer)
return
def __RefreshMoveSpeed(self, allAttrListBuffs):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
index 30205b2..f801725 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -39,6 +39,7 @@
import SkillCommon
import PlayerMagicWeapon
import PassiveBuffEffMng
+import CrossPlayerData
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -98,6 +99,12 @@
pack = IPY_GameWorld.IPY_CRideHorse()
#//1: 骑马 0: 下马
curPlayerRideType = pack.GetRide()
+ if PlayerControl.GetCrossMapID(curPlayer):
+ # 暂只处理上马
+ if curPlayerRideType:
+ dataList = [curPlayerRideType]
+ CrossPlayerData.SendDataToCrossServer(curPlayer, CrossPlayerData.CrossData_RideHorse, dataList)
+ return
#骑马行为状态, 客户端限制
if not OperControlManager.IsObjCanDoAction(curPlayer,
ChConfig.Def_Obj_ActState_ClientAct,
@@ -130,6 +137,15 @@
#if curPlayer.IsMoving():
# curPlayer.Move(curPlayer.GetDestPosX(), curPlayer.GetDestPosY())
+ return
+
+def CrossServer_RideHorse(curPlayer, dataList):
+ curPlayerRideType = dataList[0]
+
+ #骑马
+ if curPlayerRideType == 1:
+ PlayerRideHorseUp(curPlayer, True)
+
return
#---------------------下马逻辑
@@ -280,8 +296,43 @@
horseIndex = packData.Index
DoChangeHorse(curPlayer, horseIndex, tick)
+
+ if not GameWorld.IsCrossServer():
+ dataList = [horseIndex]
+ CrossPlayerData.SendDataToCrossServer(curPlayer, CrossPlayerData.CrossData_HorseChange, dataList)
return
+def CrossServer_ChangeHorse(curPlayer, dataList):
+ ## 跨服处理 坐骑变更
+ horseIndex = dataList[0]
+ ipyData = IpyGameDataPY.GetIpyGameData("Horse", horseIndex)
+ if not ipyData:
+ return
+
+ horseItemID = ipyData.GetItemID()
+
+ if ItemCommon.FindItemInPackByItemID(curPlayer, horseItemID, IPY_GameWorld.rptEquip):
+ return
+
+ isOK = ItemControler.PutItemInTempSwap(curPlayer, horseItemID)
+ if not isOK:
+ return
+
+ curHorse = ItemCommon.FindItemInPackByItemID(curPlayer, horseItemID, ShareDefine.rptTempSwap)
+ if not curHorse:
+ return
+
+ isRideHorse = curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse
+ if isRideHorse:
+ PlayerRideHorseDown(curPlayer, False)
+
+ #---执行玩家换装逻辑---
+ tick = GameWorld.GetGameWorld().GetTick()
+ if ChEquip.DoPlayerEquipItem(curPlayer, curHorse, ShareDefine.retHorse, tick):
+ if isRideHorse:
+ PlayerRideHorseUp(curPlayer, False)
+
+ return
def DoChangeHorse(curPlayer, horseIndex, tick):
ipyData = IpyGameDataPY.GetIpyGameData("Horse", horseIndex)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
index 5a25e67..04a1995 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
@@ -39,6 +39,7 @@
import PlayerMagicWeapon
import PassiveBuffEffMng
import CalcNoLineEffect
+import CrossPlayerData
import CalcLineEffect
import random
@@ -266,8 +267,39 @@
# petItem.SetUserAttr(ShareDefine.Def_IudetPet_State, tagState)
# GameWorld.DebugLog("切换宠物状态异常防范! curState=%s,tagState=%s" % (curState, tagState))
+ if not GameWorld.IsCrossServer():
+ dataList = [petNPCID, curClasslv, tagState]
+ CrossPlayerData.SendDataToCrossServer(curPlayer, CrossPlayerData.CrossData_PetState, dataList)
+
return
+def CrossServer_DoChangePetState(curPlayer, dataList):
+ ## 跨服处理 宠物战斗状态变更
+ petNPCID, curClasslv, tagState = dataList
+ petItem = GetPetDataItemByNPCID(curPlayer, petNPCID)
+ if not petItem:
+ newPetItem = GetNewPetDataItem(curPlayer, petNPCID)
+ if not newPetItem:
+ return
+ if not ItemControler.PlayerItemControler(curPlayer).PutInItem(ShareDefine.rptPet, newPetItem):
+ return
+ petItem = GetPetDataItemByNPCID(curPlayer, petNPCID)
+ if not petItem:
+ return
+
+ curItemClasslv = petItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
+ # 处理技能问题,暂不处理
+ if curClasslv > curItemClasslv:
+ pass
+
+ curState = petItem.GetUserAttr(ShareDefine.Def_IudetPet_State) # 当前状态
+ if curState == ShareDefine.Def_PetState_Fight:
+ PetControl.ReCallFightPet(curPlayer)
+
+ if tagState == ShareDefine.Def_PetState_Fight:
+ __DoPetGoOutToFight(curPlayer, petItem)
+
+ return
## 执行宠物出战逻辑
--
Gitblit v1.8.0