From d8e1ebe546d3af1f633184292aa7008d6d1a41b4 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 17 十月 2022 17:29:22 +0800
Subject: [PATCH] 9733 【越南】【主干】【BT7】坐骑幻化支持超过31个
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 21 ++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py | 37 +++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py | 38 +++++++++---
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 21 ++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py | 3
6 files changed, 103 insertions(+), 19 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 82feceb..1d50803 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -24092,10 +24092,12 @@
Head = tagHead()
LV = 0 #(BYTE LV)//等阶
EatItemCount = 0 #(DWORD EatItemCount)//当前阶已吃丹个数
- SkinPlusState = 0 #(DWORD SkinPlusState)//幻化激活状态,按位存储是否激活,幻化编号ID对应位
+ SkinPlusState = 0 #(DWORD SkinPlusState)//幻化激活状态,按位存储是否激活,幻化编号ID对应位,废弃,使用 SkinPlusStateList
TrainTypes = 0 #(BYTE TrainTypes)//培养类型数
TrainLVList = list() #(vector<DWORD> TrainLVList)//培养等阶列表,索引为培养类型减1
TrainItemCountList = list() #(vector<DWORD> TrainItemCountList)//培养当前阶已吃培养丹个数列表,索引为培养类型减1
+ SkinPlusStateCount = 0 #(BYTE SkinPlusStateCount)//幻化激活状态值数
+ SkinPlusStateList = list() #(vector<DWORD> SkinPlusStateList)//幻化激活状态值列表,按位存储是否激活,幻化编号ID对应位
data = None
def __init__(self):
@@ -24117,6 +24119,10 @@
for i in range(self.TrainTypes):
value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
self.TrainItemCountList.append(value)
+ self.SkinPlusStateCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.SkinPlusStateCount):
+ value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+ self.SkinPlusStateList.append(value)
return _pos
def Clear(self):
@@ -24130,6 +24136,8 @@
self.TrainTypes = 0
self.TrainLVList = list()
self.TrainItemCountList = list()
+ self.SkinPlusStateCount = 0
+ self.SkinPlusStateList = list()
return
def GetLength(self):
@@ -24141,6 +24149,8 @@
length += 1
length += 4 * self.TrainTypes
length += 4 * self.TrainTypes
+ length += 1
+ length += 4 * self.SkinPlusStateCount
return length
@@ -24155,6 +24165,9 @@
data = CommFunc.WriteDWORD(data, self.TrainLVList[i])
for i in range(self.TrainTypes):
data = CommFunc.WriteDWORD(data, self.TrainItemCountList[i])
+ data = CommFunc.WriteBYTE(data, self.SkinPlusStateCount)
+ for i in range(self.SkinPlusStateCount):
+ data = CommFunc.WriteDWORD(data, self.SkinPlusStateList[i])
return data
def OutputString(self):
@@ -24165,7 +24178,9 @@
SkinPlusState:%d,
TrainTypes:%d,
TrainLVList:%s,
- TrainItemCountList:%s
+ TrainItemCountList:%s,
+ SkinPlusStateCount:%d,
+ SkinPlusStateList:%s
'''\
%(
self.Head.OutputString(),
@@ -24174,6 +24189,8 @@
self.SkinPlusState,
self.TrainTypes,
"...",
+ "...",
+ self.SkinPlusStateCount,
"..."
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 1e48d1b..3a35f81 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3995,7 +3995,7 @@
# 坐骑
Def_PDict_HorserLV = "HorserLV" # 坐骑等级
Def_PDict_HorserEatItemCount = "HorserEatItemCount" # 当前阶已吃培养丹个数
-Def_PDict_HorserSkinPlusState = "HorserSkinPlusState" # 坐骑幻化皮肤激活状态,按二进制位存储,每位代表幻化ID是否已激活
+Def_PDict_HorserSkinPlusState = "HorserSkinPlusState%s" # 坐骑幻化皮肤激活状态,按二进制位存储,每位代表幻化ID是否已激活,支持多值
Def_PDict_HorserSkinEndTime = "HorserSkinEndTime_%s" # 坐骑幻化皮肤激活结束时间戳,仅针对非永久的幻化皮肤
Def_PDict_HorserTrainLV = "HorserTrainLV_%s" # 坐骑培养等阶,参数(培养类型)
Def_PDict_HorserTrainItemCount = "HorserTrainItemCount_%s" # 坐骑培养当前阶已吃培养丹个数,参数(培养类型)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 82feceb..1d50803 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -24092,10 +24092,12 @@
Head = tagHead()
LV = 0 #(BYTE LV)//等阶
EatItemCount = 0 #(DWORD EatItemCount)//当前阶已吃丹个数
- SkinPlusState = 0 #(DWORD SkinPlusState)//幻化激活状态,按位存储是否激活,幻化编号ID对应位
+ SkinPlusState = 0 #(DWORD SkinPlusState)//幻化激活状态,按位存储是否激活,幻化编号ID对应位,废弃,使用 SkinPlusStateList
TrainTypes = 0 #(BYTE TrainTypes)//培养类型数
TrainLVList = list() #(vector<DWORD> TrainLVList)//培养等阶列表,索引为培养类型减1
TrainItemCountList = list() #(vector<DWORD> TrainItemCountList)//培养当前阶已吃培养丹个数列表,索引为培养类型减1
+ SkinPlusStateCount = 0 #(BYTE SkinPlusStateCount)//幻化激活状态值数
+ SkinPlusStateList = list() #(vector<DWORD> SkinPlusStateList)//幻化激活状态值列表,按位存储是否激活,幻化编号ID对应位
data = None
def __init__(self):
@@ -24117,6 +24119,10 @@
for i in range(self.TrainTypes):
value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
self.TrainItemCountList.append(value)
+ self.SkinPlusStateCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.SkinPlusStateCount):
+ value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+ self.SkinPlusStateList.append(value)
return _pos
def Clear(self):
@@ -24130,6 +24136,8 @@
self.TrainTypes = 0
self.TrainLVList = list()
self.TrainItemCountList = list()
+ self.SkinPlusStateCount = 0
+ self.SkinPlusStateList = list()
return
def GetLength(self):
@@ -24141,6 +24149,8 @@
length += 1
length += 4 * self.TrainTypes
length += 4 * self.TrainTypes
+ length += 1
+ length += 4 * self.SkinPlusStateCount
return length
@@ -24155,6 +24165,9 @@
data = CommFunc.WriteDWORD(data, self.TrainLVList[i])
for i in range(self.TrainTypes):
data = CommFunc.WriteDWORD(data, self.TrainItemCountList[i])
+ data = CommFunc.WriteBYTE(data, self.SkinPlusStateCount)
+ for i in range(self.SkinPlusStateCount):
+ data = CommFunc.WriteDWORD(data, self.SkinPlusStateList[i])
return data
def OutputString(self):
@@ -24165,7 +24178,9 @@
SkinPlusState:%d,
TrainTypes:%d,
TrainLVList:%s,
- TrainItemCountList:%s
+ TrainItemCountList:%s,
+ SkinPlusStateCount:%d,
+ SkinPlusStateList:%s
'''\
%(
self.Head.OutputString(),
@@ -24174,6 +24189,8 @@
self.SkinPlusState,
self.TrainTypes,
"...",
+ "...",
+ self.SkinPlusStateCount,
"..."
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
index 8d297b0..c914e61 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
@@ -20,6 +20,7 @@
import PlayerControl
import PlayerHorse
import IpyGameDataPY
+import time
#---------------------------------------------------------------------
#逻辑实现
@@ -35,13 +36,34 @@
GameWorld.DebugAnswer(curPlayer, "重置所有: Horse 0")
GameWorld.DebugAnswer(curPlayer, "设置进阶: Horse 等阶 丹数")
GameWorld.DebugAnswer(curPlayer, "设置培养: Horse 培养类型 等阶 丹数")
+ GameWorld.DebugAnswer(curPlayer, "全部幻化: Horse skin 1")
+ GameWorld.DebugAnswer(curPlayer, "重置幻化: Horse skin 0")
+ GameWorld.DebugAnswer(curPlayer, "设置幻化: Horse skin 幻化ID 状态")
return
- if len(msgList) == 1:
+ if msgList[0] == "skin":
+ if len(msgList) == 2:
+ skinState = msgList[1]
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
+ skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
+ skinID = skinPlusIpyData.GetID()
+ __GMSetHorseSkinState(curPlayer, skinID, skinState, skinPlusIpyData.GetSkinValidTime())
+ elif len(msgList) == 3:
+ skinID = msgList[1]
+ skinState = msgList[2]
+ skinPlusIpyData = IpyGameDataPY.GetIpyGameData("HorseSkinPlus", skinID)
+ if not skinPlusIpyData:
+ GameWorld.DebugAnswer(curPlayer, "坐骑幻化ID不存在! skinID=%s" % skinID)
+ return
+ __GMSetHorseSkinState(curPlayer, skinID, skinState, skinPlusIpyData.GetSkinValidTime())
+ else:
+ return
+
+ elif len(msgList) == 1:
if msgList[0] == 0:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, 1)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, 0)
for trainType in xrange(1, PlayerHorse.GetHorseTrainTypes() + 1):
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainLV % trainType, 1)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainItemCount % trainType, 0)
@@ -51,6 +73,7 @@
skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
skinID = skinPlusIpyData.GetID()
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0)
+ GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 0)
elif len(msgList) == 2:
lv, eatItemCount = msgList
@@ -72,4 +95,14 @@
PlayerHorse.PlayerHorseLogin(curPlayer)
return
+def __GMSetHorseSkinState(curPlayer, skinID, skinState, validTime=0):
+ if not skinState:
+ GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0)
+ else:
+ GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 1)
+ if validTime > 0:
+ updSkinEndTime = int(time.time()) + validTime
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, updSkinEndTime)
+ return
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 5410723..926e4fd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -178,7 +178,6 @@
if not ipyData:
return
- activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState)
updSkinEndTime = 0
validTime = ipyData.GetSkinValidTime()
if validTime:
@@ -189,8 +188,8 @@
else:
updSkinEndTime = skinEndTime + validTime
else:
- if activateState & pow(2, activateID):
- GameWorld.DebugLog("该坐骑已幻化!activateState=%s,activateID=%s" % (activateState, activateID))
+ if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, activateID):
+ GameWorld.DebugLog("该坐骑已幻化! activateID=%s" % activateID)
return
needItemID = ipyData.GetUnlockItemID()
@@ -207,8 +206,7 @@
GameWorld.DebugLog("坐骑幻化时效 activateID=%s,updSkinEndTime=%s(%s)" % (activateID, updSkinEndTime, GameWorld.ChangeTimeNumToStr(updSkinEndTime)), playerID)
#时效及非时效该状态均设置激活
- updActivateState = activateState|pow(2, activateID)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, updActivateState)
+ activateState, updActivateState = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, activateID, 1)
playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
itemRideHorse = playerEquip.GetAt(Def_HorseEquipIndex)
@@ -342,15 +340,12 @@
paramList = [skinItemID]
PlayerControl.SendMailByKey("HorseSkinInvalidNotify", [playerID], addItemList, paramList)
- activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState)
- updActivateState = GameWorld.SetBitValue(activateState, skinID, 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, updActivateState)
+ activateState, updActivateState = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 0)
GameWorld.Log("坐骑幻化过期更新状态! skinID=%s,activateState=%s,updActivateState=%s" % (skinID, activateState, updActivateState), playerID)
Sync_HorseClassData(curPlayer)
return False
else:
- activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState)
- if not activateState & pow(2, skinID):
+ if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID):
#GameWorld.DebugLog("坐骑幻化未激活! skinID=%s,activateState=%s" % (skinID, activateState), curPlayer.GetPlayerID())
return False
return True
@@ -364,7 +359,6 @@
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, horseLV)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, 0)
for trainType in xrange(1, GetHorseTrainTypes() + 1):
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainLV % trainType, 1)
@@ -373,6 +367,7 @@
skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
skinID = skinPlusIpyData.GetID()
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0)
+ GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 0)
horseID = ipyData.GetHorseSkinID()
if not ItemCommon.FindItemInPackByItemID(curPlayer, horseID, IPY_GameWorld.rptEquip):
@@ -689,6 +684,14 @@
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
return
+ # 坐骑幻化状态多值支持修改,线上版本做旧值转移
+ oldVerSkinStateKey = "HorserSkinPlusState"
+ oldVerSkinStateValue = curPlayer.NomalDictGetProperty(oldVerSkinStateKey)
+ if oldVerSkinStateValue:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState % 0, oldVerSkinStateValue)
+ PlayerControl.NomalDictSetProperty(curPlayer, oldVerSkinStateKey, 0)
+ GameWorld.Log("线上版本转移坐骑幻化状态记录字典值! oldVerSkinStateValue=%s" % (oldVerSkinStateValue), curPlayer.GetPlayerID())
+
# 培养是后面加的功能,每次登录补检查一下功能开始时设置为培养1级
for trainType in xrange(1, GetHorseTrainTypes() + 1):
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserTrainLV % trainType) == 0:
@@ -711,9 +714,22 @@
horseData.TrainLVList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserTrainLV % trainType))
horseData.TrainItemCountList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserTrainItemCount % trainType))
horseData.TrainTypes = len(horseData.TrainLVList)
+ horseData.SkinPlusStateList = GetHorseSkinPlusStateList(curPlayer)
+ horseData.SkinPlusStateCount = len(horseData.SkinPlusStateList)
NetPackCommon.SendFakePack(curPlayer, horseData)
return
+def GetHorseSkinPlusStateList(curPlayer):
+ maxSkinID = 0
+ skinPlusStateList = []
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ skinCnt = ipyDataMgr.GetHorseSkinPlusCount()
+ for index in xrange(skinCnt):
+ maxSkinID = max(maxSkinID, ipyDataMgr.GetHorseSkinPlusByIndex(index).GetID())
+ for index in xrange(maxSkinID / 31+1):
+ skinPlusStateList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState % index))
+ return skinPlusStateList
+
def GetHorseSumLV(curPlayer):
## 坐骑总等级
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
index 12eaefc..f847acb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -27,6 +27,7 @@
import PlayerAttrFruit
import ItemControler
import IpyGameDataPY
+import PlayerHorse
import ChEquip
import FBCommon
import BossHurtMng
@@ -321,7 +322,7 @@
skinEndTimeInfo[skinID] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinEndTime % skinID)
horseInfo = {"LV":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV),
"EatItemCount":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount),
- "SkinPlusState":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState),
+ "SkinPlusStateList":PlayerHorse.GetHorseSkinPlusStateList(curPlayer),
"SkinEndTimeInfo":skinEndTimeInfo,
}
return horseInfo
--
Gitblit v1.8.0