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