ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -20805,6 +20805,114 @@ #------------------------------------------------------ # A3 10 通知坐骑幻化时效信息 #tagMCHorseSkinTimeInfoList class tagMCHorseSkinTimeInfo(Structure): _pack_ = 1 _fields_ = [ ("ID", c_int), # 对应坐骑幻化表ID ("InvalidTime", c_int), # 失效时间戳 ] def __init__(self): self.Clear() 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.ID = 0 self.InvalidTime = 0 return def GetLength(self): return sizeof(tagMCHorseSkinTimeInfo) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): DumpString = '''// A3 10 通知坐骑幻化时效信息 //tagMCHorseSkinTimeInfoList: ID:%d, InvalidTime:%d '''\ %( self.ID, self.InvalidTime ) return DumpString class tagMCHorseSkinTimeInfoList(Structure): Head = tagHead() TimeCnt = 0 #(BYTE TimeCnt)//个数 TimeInfoList = list() #(vector<tagMCHorseSkinTimeInfo> TimeInfoList)// 数据列表 data = None def __init__(self): self.Clear() self.Head.Cmd = 0xA3 self.Head.SubCmd = 0x10 return def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() _pos = self.Head.ReadData(_lpData, _pos) self.TimeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.TimeCnt): temTimeInfoList = tagMCHorseSkinTimeInfo() _pos = temTimeInfoList.ReadData(_lpData, _pos) self.TimeInfoList.append(temTimeInfoList) return _pos def Clear(self): self.Head = tagHead() self.Head.Clear() self.Head.Cmd = 0xA3 self.Head.SubCmd = 0x10 self.TimeCnt = 0 self.TimeInfoList = list() return def GetLength(self): length = 0 length += self.Head.GetLength() length += 1 for i in range(self.TimeCnt): length += self.TimeInfoList[i].GetLength() return length def GetBuffer(self): data = '' data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) data = CommFunc.WriteBYTE(data, self.TimeCnt) for i in range(self.TimeCnt): data = CommFunc.WriteString(data, self.TimeInfoList[i].GetLength(), self.TimeInfoList[i].GetBuffer()) return data def OutputString(self): DumpString = ''' Head:%s, TimeCnt:%d, TimeInfoList:%s '''\ %( self.Head.OutputString(), self.TimeCnt, "..." ) return DumpString m_NAtagMCHorseSkinTimeInfoList=tagMCHorseSkinTimeInfoList() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCHorseSkinTimeInfoList.Head.Cmd,m_NAtagMCHorseSkinTimeInfoList.Head.SubCmd))] = m_NAtagMCHorseSkinTimeInfoList #------------------------------------------------------ # A3 38 投资理财信息 #tagMCInvestInfo class tagMCInvestInfo(Structure): ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3996,6 +3996,7 @@ Def_PDict_HorserLV = "HorserLV" # 坐骑等级 Def_PDict_HorserEatItemCount = "HorserEatItemCount" # 当前阶已吃培养丹个数 Def_PDict_HorserSkinPlusState = "HorserSkinPlusState" # 坐骑幻化皮肤激活状态,按二进制位存储,每位代表幻化ID是否已激活 Def_PDict_HorserSkinEndTime = "HorserSkinEndTime_%s" # 坐骑幻化皮肤激活结束时间戳,仅针对非永久的幻化皮肤 Def_PDict_HorserTrainLV = "HorserTrainLV_%s" # 坐骑培养等阶,参数(培养类型) Def_PDict_HorserTrainItemCount = "HorserTrainItemCount_%s" # 坐骑培养当前阶已吃培养丹个数,参数(培养类型) ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -20805,6 +20805,114 @@ #------------------------------------------------------ # A3 10 通知坐骑幻化时效信息 #tagMCHorseSkinTimeInfoList class tagMCHorseSkinTimeInfo(Structure): _pack_ = 1 _fields_ = [ ("ID", c_int), # 对应坐骑幻化表ID ("InvalidTime", c_int), # 失效时间戳 ] def __init__(self): self.Clear() 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.ID = 0 self.InvalidTime = 0 return def GetLength(self): return sizeof(tagMCHorseSkinTimeInfo) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): DumpString = '''// A3 10 通知坐骑幻化时效信息 //tagMCHorseSkinTimeInfoList: ID:%d, InvalidTime:%d '''\ %( self.ID, self.InvalidTime ) return DumpString class tagMCHorseSkinTimeInfoList(Structure): Head = tagHead() TimeCnt = 0 #(BYTE TimeCnt)//个数 TimeInfoList = list() #(vector<tagMCHorseSkinTimeInfo> TimeInfoList)// 数据列表 data = None def __init__(self): self.Clear() self.Head.Cmd = 0xA3 self.Head.SubCmd = 0x10 return def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() _pos = self.Head.ReadData(_lpData, _pos) self.TimeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.TimeCnt): temTimeInfoList = tagMCHorseSkinTimeInfo() _pos = temTimeInfoList.ReadData(_lpData, _pos) self.TimeInfoList.append(temTimeInfoList) return _pos def Clear(self): self.Head = tagHead() self.Head.Clear() self.Head.Cmd = 0xA3 self.Head.SubCmd = 0x10 self.TimeCnt = 0 self.TimeInfoList = list() return def GetLength(self): length = 0 length += self.Head.GetLength() length += 1 for i in range(self.TimeCnt): length += self.TimeInfoList[i].GetLength() return length def GetBuffer(self): data = '' data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) data = CommFunc.WriteBYTE(data, self.TimeCnt) for i in range(self.TimeCnt): data = CommFunc.WriteString(data, self.TimeInfoList[i].GetLength(), self.TimeInfoList[i].GetBuffer()) return data def OutputString(self): DumpString = ''' Head:%s, TimeCnt:%d, TimeInfoList:%s '''\ %( self.Head.OutputString(), self.TimeCnt, "..." ) return DumpString m_NAtagMCHorseSkinTimeInfoList=tagMCHorseSkinTimeInfoList() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCHorseSkinTimeInfoList.Head.Cmd,m_NAtagMCHorseSkinTimeInfoList.Head.SubCmd))] = m_NAtagMCHorseSkinTimeInfoList #------------------------------------------------------ # A3 38 投资理财信息 #tagMCInvestInfo class tagMCInvestInfo(Structure): ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
@@ -19,6 +19,7 @@ import ChConfig import PlayerControl import PlayerHorse import IpyGameDataPY #--------------------------------------------------------------------- #逻辑实现 @@ -45,6 +46,12 @@ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainLV % trainType, 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainItemCount % trainType, 0) ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()): skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index) skinID = skinPlusIpyData.GetID() PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0) elif len(msgList) == 2: lv, eatItemCount = msgList if lv < 1: ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -38,6 +38,8 @@ import PlayerSuccess import PlayerPet import time Def_HorseEquipIndex = 5 @@ -172,15 +174,25 @@ if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse): return activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState) if activateState & pow(2, activateID): GameWorld.DebugLog("该坐骑已幻化!activateState=%s,activateID=%s" % (activateState, activateID)) return ipyData = IpyGameDataPY.GetIpyGameData("HorseSkinPlus", activateID) if not ipyData: return updSkinEndTime = 0 validTime = ipyData.GetSkinValidTime() if validTime: curTime = int(time.time()) skinEndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinEndTime % activateID) if curTime >= skinEndTime: updSkinEndTime = curTime + validTime else: updSkinEndTime = skinEndTime + validTime else: activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState) if activateState & pow(2, activateID): GameWorld.DebugLog("该坐骑已幻化!activateState=%s,activateID=%s" % (activateState, activateID)) return needItemID = ipyData.GetUnlockItemID() needItemCnt = ipyData.GetUnlockItemCnt() itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) @@ -190,16 +202,23 @@ return ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, ChConfig.ItemDel_Horse) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, activateState|pow(2, activateID)) if validTime: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % activateID, updSkinEndTime) GameWorld.DebugLog("坐骑幻化时效 activateID=%s,updSkinEndTime=%s(%s)" % (activateID, updSkinEndTime, GameWorld.ChangeTimeNumToStr(updSkinEndTime)), playerID) else: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, activateState|pow(2, activateID)) playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) itemRideHorse = playerEquip.GetAt(Def_HorseEquipIndex) #无指定道具 if itemRideHorse.IsEmpty(): DoChangeHorse(curPlayer, 2, activateID, tick) Sync_HorseClassData(curPlayer) GameWorld.Log("坐骑激活成功!activateID=%s" % (activateID), playerID) if validTime: SyncHorseSkinTimeInfo(curPlayer, activateID) else: Sync_HorseClassData(curPlayer) GameWorld.Log("坐骑激活成功!activateID=%s,updSkinEndTime=%s" % (activateID, updSkinEndTime), playerID) # 刷属性,更新排行榜 RefreshHorseAttr(curPlayer) @@ -265,13 +284,10 @@ # 按幻化 elif chooseType == 2: activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState) if not activateState & pow(2, lvID): GameWorld.DebugLog("坐骑幻化未激活,无法使用该坐骑皮肤! activateState=%s,lvID=%s" % (activateState, lvID)) return skinPlusIpyData = IpyGameDataPY.GetIpyGameData("HorseSkinPlus", lvID) if not skinPlusIpyData: return if not CheckHorseSkinState(curPlayer, skinPlusIpyData): return horseItemID = skinPlusIpyData.GetHorseSkinPlusID() @@ -306,6 +322,31 @@ return True def CheckHorseSkinState(curPlayer, skinPlusIpyData): skinID = skinPlusIpyData.GetID() if skinPlusIpyData.GetSkinValidTime(): skinEndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinEndTime % skinID) if not skinEndTime: return False curTime = int(time.time()) if curTime >= skinEndTime: playerID = curPlayer.GetPlayerID() GameWorld.Log("坐骑幻化已过期! skinID=%s,skinEndTime=%s(%s)" % (skinID, skinEndTime, GameWorld.ChangeTimeNumToStr(skinEndTime)), playerID) # 发送过期通知邮件,重置为0 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0) skinItemID = skinPlusIpyData.GetUnlockItemID() addItemList = [] paramList = [skinItemID] PlayerControl.SendMailByKey("HorseSkinInvalidNotify", [playerID], addItemList, paramList) return False else: activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState) if not activateState & pow(2, skinID): #GameWorld.DebugLog("坐骑幻化未激活! skinID=%s,activateState=%s" % (skinID, activateState), curPlayer.GetPlayerID()) return False return True def DoHorseOpen(curPlayer): ## 马匹功能开启 horseLV = 1 @@ -318,6 +359,12 @@ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, 0) for trainType in xrange(1, GetHorseTrainTypes() + 1): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainLV % trainType, 1) ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()): skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index) skinID = skinPlusIpyData.GetID() PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0) horseID = ipyData.GetHorseSkinID() if not ItemCommon.FindItemInPackByItemID(curPlayer, horseID, IPY_GameWorld.rptEquip): @@ -386,11 +433,9 @@ # 幻化属性 initFPAdd = 0 #初始战力 activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState) for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()): skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index) skinPlusID = skinPlusIpyData.GetID() if not activateState & pow(2, skinPlusID): if not CheckHorseSkinState(curPlayer, skinPlusIpyData): continue initFPAdd += skinPlusIpyData.GetInitFightPower() attrTypeList = skinPlusIpyData.GetAttrType() @@ -643,6 +688,7 @@ Sync_HorseClassData(curPlayer) SyncHorsePetSkinData(curPlayer) SyncHorseSkinTimeInfo(curPlayer) return def Sync_HorseClassData(curPlayer): @@ -837,4 +883,29 @@ NetPackCommon.SendFakePack(curPlayer, packData) return def SyncHorseSkinTimeInfo(curPlayer, skinID=None): skinList = [] if skinID > 0: timeInfo = ChPyNetSendPack.tagMCHorseSkinTimeInfo() timeInfo.ID = skinID timeInfo.InvalidTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinEndTime % skinID) skinList.append(timeInfo) else: ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()): skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index) skinID = skinPlusIpyData.GetID() if not skinPlusIpyData.GetSkinValidTime(): continue timeInfo = ChPyNetSendPack.tagMCHorseSkinTimeInfo() timeInfo.ID = skinID timeInfo.InvalidTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinEndTime % skinID) skinList.append(timeInfo) packData = ChPyNetSendPack.tagMCHorseSkinTimeInfoList() packData.Clear() packData.TimeInfoList = skinList packData.TimeCnt = len(packData.TimeInfoList) NetPackCommon.SendFakePack(curPlayer, packData) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -311,9 +311,18 @@ ## 坐骑信息 def __GetHorseInfo(curPlayer): skinEndTimeInfo = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()): skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index) skinID = skinPlusIpyData.GetID() if not skinPlusIpyData.GetSkinValidTime(): continue 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), "SkinEndTimeInfo":skinEndTimeInfo, } return horseInfo