From dad92ce8acf71cc7ca770571c16a43de65cf78f1 Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期三, 24 十月 2018 14:40:30 +0800 Subject: [PATCH] 4233 【后端】许愿池功能开发 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 2 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 47 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 6 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 116 +++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 443 ++++++++++++++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 116 +++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 443 ++++++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 18 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 73 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 9 PySysDB/PySysDBPY.h | 27 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 6 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 7 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWishingWell.py | 444 ++++++++++++++ PySysDB/PySysDBG.h | 17 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 15 16 files changed, 1,779 insertions(+), 10 deletions(-) diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h index 34a0d5b..aaa128c 100644 --- a/PySysDB/PySysDBG.h +++ b/PySysDB/PySysDBG.h @@ -353,4 +353,21 @@ DWORD ShopType; //商店类型 BYTE RefreshType; //刷新类型 0-不重置,1-onWeek0点,2-onWeek5点,3-OnDay0点,4-OnDay5点 DWORD ServerLimitCnt; //全服限制数量 +}; + +//许愿池活动时间表 + +struct tagActWishingWell +{ + DWORD _CfgID; //配置ID + char ActMark; //活动组标记 + list ServerIDList; //服务器ID列表 + char StartDate; //开启日期 + char EndDate; //结束日期 + BYTE IsDayReset; //是否每天重置 + BYTE ResetType; //重置类型,0-0点重置;1-5点重置 + dict NotifyInfoStart; //全服提示信息 - 相对开始时间 + dict NotifyInfoEnd; //全服提示信息 - 相对结束时间 + list NotifyInfoLoop; //全服提示信息 - 循环广播[间隔分钟, 广播key] + WORD LVLimit; //限制等级 }; \ No newline at end of file diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index dcc29ec..f32dd5d 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -1299,4 +1299,31 @@ list ShopTypeList; //商店类型列表 char MailKey; //活动更新时发送邮件key list MailItemPrize; //活动更新时发送邮件奖励物品 +}; + +//许愿池活动时间表 + +struct tagActWishingWell +{ + DWORD _CfgID; //配置ID + char StartDate; //开启日期 + char EndDate; //结束日期 + BYTE IsDayReset; //是否每天重置 + BYTE ResetType; //重置类型,0-0点重置;1-5点重置 + WORD LVLimit; //限制等级 + BYTE TemplateID; //模板编号 +}; + +//许愿池库模板表 + +struct tagWishingWell +{ + BYTE _TemplateID; //模板ID + BYTE IsFree; //是否免费库 + list WorldLVLimit; //世界等级范围 + DWORD ItemID; //物品ID + WORD ItemCnt; //物品数量 + BYTE IsBind; //是否绑定 + DWORD Weight; //权重 + DWORD Mark; //排序用标识 }; \ No newline at end of file diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py index b037e1b..bd72882 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py @@ -11380,6 +11380,122 @@ #------------------------------------------------------ +# AA 07 许愿池活动刷新奖池 #tagCMActWishingRefresh + +class tagCMActWishingRefresh(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("IsFree", c_ubyte), # 是否免费刷新 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xAA + self.SubCmd = 0x07 + 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 = 0xAA + self.SubCmd = 0x07 + self.IsFree = 0 + return + + def GetLength(self): + return sizeof(tagCMActWishingRefresh) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 07 许愿池活动刷新奖池 //tagCMActWishingRefresh: + Cmd:%s, + SubCmd:%s, + IsFree:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.IsFree + ) + return DumpString + + +m_NAtagCMActWishingRefresh=tagCMActWishingRefresh() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMActWishingRefresh.Cmd,m_NAtagCMActWishingRefresh.SubCmd))] = m_NAtagCMActWishingRefresh + + +#------------------------------------------------------ +# AA 06 许愿池活动许愿 #tagCMActWishing + +class tagCMActWishing(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("SrcWellType", c_ubyte), # 来源库 0-可选库 1-结果库 + ("SrcIndex", c_ubyte), # 来源索引 + ("DesWellType", c_ubyte), # 目标库 0-可选库 1-结果库 + ("DesIndex", c_ubyte), # 目标索引 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xAA + self.SubCmd = 0x06 + 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 = 0xAA + self.SubCmd = 0x06 + self.SrcWellType = 0 + self.SrcIndex = 0 + self.DesWellType = 0 + self.DesIndex = 0 + return + + def GetLength(self): + return sizeof(tagCMActWishing) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 06 许愿池活动许愿 //tagCMActWishing: + Cmd:%s, + SubCmd:%s, + SrcWellType:%d, + SrcIndex:%d, + DesWellType:%d, + DesIndex:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.SrcWellType, + self.SrcIndex, + self.DesWellType, + self.DesIndex + ) + return DumpString + + +m_NAtagCMActWishing=tagCMActWishing() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMActWishing.Cmd,m_NAtagCMActWishing.SubCmd))] = m_NAtagCMActWishing + + +#------------------------------------------------------ # AA 05 限时抢购预约 #tagCMFlashSaleAppointment class tagCMFlashSaleAppointment(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index 80c8e0f..0915012 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -19046,6 +19046,449 @@ #------------------------------------------------------ +# AA 1B 许愿池拖动结果 #tagMCActWishingDragResult + +class tagMCPlayerWishingDragInfo(Structure): + _pack_ = 1 + _fields_ = [ + ("WellType", c_ubyte), # 库 0-可选库 1-结果库 + ("Index", c_ubyte), # 索引 + ("ItemID", c_int), # 物品ID + ("ItemCnt", c_ushort), # 物品数量 + ("IsBind", c_ubyte), # 是否绑定 + ("IsSpecial", c_ubyte), # 是否极品 + ] + + 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.WellType = 0 + self.Index = 0 + self.ItemID = 0 + self.ItemCnt = 0 + self.IsBind = 0 + self.IsSpecial = 0 + return + + def GetLength(self): + return sizeof(tagMCPlayerWishingDragInfo) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 1B 许愿池拖动结果 //tagMCActWishingDragResult: + WellType:%d, + Index:%d, + ItemID:%d, + ItemCnt:%d, + IsBind:%d, + IsSpecial:%d + '''\ + %( + self.WellType, + self.Index, + self.ItemID, + self.ItemCnt, + self.IsBind, + self.IsSpecial + ) + return DumpString + + +class tagMCActWishingDragResult(Structure): + Head = tagHead() + Cnt = 0 #(BYTE Cnt) + InfoList = list() #(vector<tagMCPlayerWishingDragInfo> InfoList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1B + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Cnt): + temInfoList = tagMCPlayerWishingDragInfo() + _pos = temInfoList.ReadData(_lpData, _pos) + self.InfoList.append(temInfoList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1B + self.Cnt = 0 + self.InfoList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.Cnt): + length += self.InfoList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Cnt) + for i in range(self.Cnt): + data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Cnt:%d, + InfoList:%s + '''\ + %( + self.Head.OutputString(), + self.Cnt, + "..." + ) + return DumpString + + +m_NAtagMCActWishingDragResult=tagMCActWishingDragResult() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActWishingDragResult.Head.Cmd,m_NAtagMCActWishingDragResult.Head.SubCmd))] = m_NAtagMCActWishingDragResult + + +#------------------------------------------------------ +# AA 19 许愿池活动信息 #tagMCActWishingWellInfo + +class tagMCWishingWellItem(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), # 物品ID + ("ItemCnt", c_ushort), # 物品数量 + ("IsBind", c_ubyte), # 是否绑定 + ("Mark", 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.ItemID = 0 + self.ItemCnt = 0 + self.IsBind = 0 + self.Mark = 0 + return + + def GetLength(self): + return sizeof(tagMCWishingWellItem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 19 许愿池活动信息 //tagMCActWishingWellInfo: + ItemID:%d, + ItemCnt:%d, + IsBind:%d, + Mark:%d + '''\ + %( + self.ItemID, + self.ItemCnt, + self.IsBind, + self.Mark + ) + return DumpString + + +class tagMCActWishingWellInfo(Structure): + Head = tagHead() + StartDate = "" #(char StartDate[10])// 开始日期 y-m-d + EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d + IsDayReset = 0 #(BYTE IsDayReset)//是否每天重置 + ResetType = 0 #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置 + LimitLV = 0 #(WORD LimitLV)// 限制等级 + Count = 0 #(WORD Count)// 物品数 + WellItemInfo = list() #(vector<tagMCWishingWellItem> WellItemInfo)// 随机库物品信息 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x19 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos) + for i in range(self.Count): + temWellItemInfo = tagMCWishingWellItem() + _pos = temWellItemInfo.ReadData(_lpData, _pos) + self.WellItemInfo.append(temWellItemInfo) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x19 + self.StartDate = "" + self.EndtDate = "" + self.IsDayReset = 0 + self.ResetType = 0 + self.LimitLV = 0 + self.Count = 0 + self.WellItemInfo = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 10 + length += 10 + length += 1 + length += 1 + length += 2 + length += 2 + for i in range(self.Count): + length += self.WellItemInfo[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteString(data, 10, self.StartDate) + data = CommFunc.WriteString(data, 10, self.EndtDate) + data = CommFunc.WriteBYTE(data, self.IsDayReset) + data = CommFunc.WriteBYTE(data, self.ResetType) + data = CommFunc.WriteWORD(data, self.LimitLV) + data = CommFunc.WriteWORD(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.WellItemInfo[i].GetLength(), self.WellItemInfo[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + StartDate:%s, + EndtDate:%s, + IsDayReset:%d, + ResetType:%d, + LimitLV:%d, + Count:%d, + WellItemInfo:%s + '''\ + %( + self.Head.OutputString(), + self.StartDate, + self.EndtDate, + self.IsDayReset, + self.ResetType, + self.LimitLV, + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCActWishingWellInfo=tagMCActWishingWellInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActWishingWellInfo.Head.Cmd,m_NAtagMCActWishingWellInfo.Head.SubCmd))] = m_NAtagMCActWishingWellInfo + + +#------------------------------------------------------ +# AA 1A 许愿池活动玩家信息 #tagMCActWishingWellPlayerInfo + +class tagMCPlayerWishingWellItem(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), # 物品ID + ("ItemCnt", c_ushort), # 物品数量 + ("IsBind", c_ubyte), # 是否绑定 + ("IsSpecial", c_ubyte), # 是否极品 + ] + + 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.ItemID = 0 + self.ItemCnt = 0 + self.IsBind = 0 + self.IsSpecial = 0 + return + + def GetLength(self): + return sizeof(tagMCPlayerWishingWellItem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 1A 许愿池活动玩家信息 //tagMCActWishingWellPlayerInfo: + ItemID:%d, + ItemCnt:%d, + IsBind:%d, + IsSpecial:%d + '''\ + %( + self.ItemID, + self.ItemCnt, + self.IsBind, + self.IsSpecial + ) + return DumpString + + +class tagMCActWishingWellPlayerInfo(Structure): + Head = tagHead() + FreeStartTime = 0 #(DWORD FreeStartTime)// 免费开始倒计时时间 + WishCnt = 0 #(DWORD WishCnt)// 许愿付费刷新次数 + WellItemCnt = 0 #(BYTE WellItemCnt)//许愿池物品数量 + WellItemInfo = list() #(vector<tagMCPlayerWishingWellItem> WellItemInfo)// 随机库物品信息 + CurAwardCnt = 0 #(BYTE CurAwardCnt)// 当前奖励物品数量 + CurAwardItemInfo = list() #(vector<tagMCPlayerWishingWellItem> CurAwardItemInfo)// 当前奖励物品 + LastAwardCnt = 0 #(BYTE LastAwardCnt)// 可领取奖励物品数量 + LastAwardItemInfo = list() #(vector<tagMCPlayerWishingWellItem> LastAwardItemInfo)// 可领取奖励物品 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1A + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.FreeStartTime,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.WishCnt,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.WellItemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.WellItemCnt): + temWellItemInfo = tagMCPlayerWishingWellItem() + _pos = temWellItemInfo.ReadData(_lpData, _pos) + self.WellItemInfo.append(temWellItemInfo) + self.CurAwardCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.CurAwardCnt): + temCurAwardItemInfo = tagMCPlayerWishingWellItem() + _pos = temCurAwardItemInfo.ReadData(_lpData, _pos) + self.CurAwardItemInfo.append(temCurAwardItemInfo) + self.LastAwardCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.LastAwardCnt): + temLastAwardItemInfo = tagMCPlayerWishingWellItem() + _pos = temLastAwardItemInfo.ReadData(_lpData, _pos) + self.LastAwardItemInfo.append(temLastAwardItemInfo) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1A + self.FreeStartTime = 0 + self.WishCnt = 0 + self.WellItemCnt = 0 + self.WellItemInfo = list() + self.CurAwardCnt = 0 + self.CurAwardItemInfo = list() + self.LastAwardCnt = 0 + self.LastAwardItemInfo = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 4 + length += 1 + for i in range(self.WellItemCnt): + length += self.WellItemInfo[i].GetLength() + length += 1 + for i in range(self.CurAwardCnt): + length += self.CurAwardItemInfo[i].GetLength() + length += 1 + for i in range(self.LastAwardCnt): + length += self.LastAwardItemInfo[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.FreeStartTime) + data = CommFunc.WriteDWORD(data, self.WishCnt) + data = CommFunc.WriteBYTE(data, self.WellItemCnt) + for i in range(self.WellItemCnt): + data = CommFunc.WriteString(data, self.WellItemInfo[i].GetLength(), self.WellItemInfo[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.CurAwardCnt) + for i in range(self.CurAwardCnt): + data = CommFunc.WriteString(data, self.CurAwardItemInfo[i].GetLength(), self.CurAwardItemInfo[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.LastAwardCnt) + for i in range(self.LastAwardCnt): + data = CommFunc.WriteString(data, self.LastAwardItemInfo[i].GetLength(), self.LastAwardItemInfo[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + FreeStartTime:%d, + WishCnt:%d, + WellItemCnt:%d, + WellItemInfo:%s, + CurAwardCnt:%d, + CurAwardItemInfo:%s, + LastAwardCnt:%d, + LastAwardItemInfo:%s + '''\ + %( + self.Head.OutputString(), + self.FreeStartTime, + self.WishCnt, + self.WellItemCnt, + "...", + self.CurAwardCnt, + "...", + self.LastAwardCnt, + "..." + ) + return DumpString + + +m_NAtagMCActWishingWellPlayerInfo=tagMCActWishingWellPlayerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActWishingWellPlayerInfo.Head.Cmd,m_NAtagMCActWishingWellPlayerInfo.Head.SubCmd))] = m_NAtagMCActWishingWellPlayerInfo + + +#------------------------------------------------------ # AA 15 仙界盛典全民来嗨玩家信息 #tagMCAllPeoplePartyInfo class tagMCAllPeoplePartyCount(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py index c185620..dcaa4ab 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py @@ -445,7 +445,7 @@ - if state == 1 and actName in ShareDefine.NeedWorldLVOperationActNameList: + if state >= 1 and actName in ShareDefine.NeedWorldLVOperationActNameList: actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OActWorldLV % actName) sendMapServerMsgDict[ShareDefine.ActKey_WorldLV] = actWorldLV diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py index e945a24..70654d8 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py @@ -305,6 +305,20 @@ ("BYTE", "RefreshType", 0), ("DWORD", "ServerLimitCnt", 0), ), + + "ActWishingWell":( + ("DWORD", "CfgID", 1), + ("char", "ActMark", 0), + ("list", "ServerIDList", 0), + ("char", "StartDate", 0), + ("char", "EndDate", 0), + ("BYTE", "IsDayReset", 0), + ("BYTE", "ResetType", 0), + ("dict", "NotifyInfoStart", 0), + ("dict", "NotifyInfoEnd", 0), + ("list", "NotifyInfoLoop", 0), + ("WORD", "LVLimit", 0), + ), } @@ -882,6 +896,35 @@ def GetShopType(self): return self.ShopType # 商店类型 def GetRefreshType(self): return self.RefreshType # 刷新类型 0-不重置,1-onWeek0点,2-onWeek5点,3-OnDay0点,4-OnDay5点 def GetServerLimitCnt(self): return self.ServerLimitCnt # 全服限制数量 + +# 许愿池活动时间表 +class IPY_ActWishingWell(): + + def __init__(self): + self.CfgID = 0 + self.ActMark = "" + self.ServerIDList = [] + self.StartDate = "" + self.EndDate = "" + self.IsDayReset = 0 + self.ResetType = 0 + self.NotifyInfoStart = {} + self.NotifyInfoEnd = {} + self.NotifyInfoLoop = [] + self.LVLimit = 0 + return + + def GetCfgID(self): return self.CfgID # 配置ID + def GetActMark(self): return self.ActMark # 活动组标记 + def GetServerIDList(self): return self.ServerIDList # 服务器ID列表 + def GetStartDate(self): return self.StartDate # 开启日期 + def GetEndDate(self): return self.EndDate # 结束日期 + def GetIsDayReset(self): return self.IsDayReset # 是否每天重置 + def GetResetType(self): return self.ResetType # 重置类型,0-0点重置;1-5点重置 + def GetNotifyInfoStart(self): return self.NotifyInfoStart # 全服提示信息 - 相对开始时间 + def GetNotifyInfoEnd(self): return self.NotifyInfoEnd # 全服提示信息 - 相对结束时间 + def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key] + def GetLVLimit(self): return self.LVLimit # 限制等级 def Log(msg, playerID=0, par=0): @@ -961,6 +1004,8 @@ self.ipyActFlashSaleLen = len(self.ipyActFlashSaleCache) self.ipyStoreCache = self.__LoadFileData("Store", IPY_Store) self.ipyStoreLen = len(self.ipyStoreCache) + self.ipyActWishingWellCache = self.__LoadFileData("ActWishingWell", IPY_ActWishingWell) + self.ipyActWishingWellLen = len(self.ipyActWishingWellCache) Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict)) Log("IPY_DataMgr InitOK!") return @@ -1181,6 +1226,8 @@ def GetActFlashSaleByIndex(self, index): return self.ipyActFlashSaleCache[index] def GetStoreCount(self): return self.ipyStoreLen def GetStoreByIndex(self, index): return self.ipyStoreCache[index] + def GetActWishingWellCount(self): return self.ipyActWishingWellLen + def GetActWishingWellByIndex(self, index): return self.ipyActWishingWellCache[index] IPYData = IPY_DataMgr() def IPY_Data(): return IPYData diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py index a4130f2..3011cb5 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py @@ -233,12 +233,14 @@ OperationActionName_FairyCeremony = "ActFairyCeremony" # 仙界盛典活动 OperationActionName_RealmPoint = "ActRealmPoint" # 多倍修行点活动 OperationActionName_FlashSale = "ActFlashSale" # 限时抢购活动 +OperationActionName_WishingWell = "ActWishingWell" # 许愿池活动 OperationActionNameList = [OperationActionName_ExpRate, OperationActionName_CostRebate, OperationActionName_BossReborn,OperationActionName_SpringSale, OperationActionName_FlashGiftbag, OperationActionName_FairyCeremony, - OperationActionName_RealmPoint, OperationActionName_FlashSale] + OperationActionName_RealmPoint, OperationActionName_FlashSale, + OperationActionName_WishingWell] #需要记录开启活动时的世界等级的运营活动 -NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony] +NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell] #活动信息字典key定义 ActKey_ID = "ID" # 活动ID,唯一标识的ID,一般是活动开启的time值 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini index 960124e..6acc6d0 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini @@ -1339,4 +1339,20 @@ PacketCMD_1=0xAA PacketSubCMD_1=0x05 -PacketCallFunc_1=OnFlashSaleAppointment \ No newline at end of file +PacketCallFunc_1=OnFlashSaleAppointment + +;许愿池 +[PlayerWishingWell] +ScriptName = Player\PlayerWishingWell.py +Writer = xdh +Releaser = xdh +RegType = 0 +RegisterPackCount = 2 + +PacketCMD_1=0xAA +PacketSubCMD_1=0x07 +PacketCallFunc_1=OnActWishingRefresh + +PacketCMD_2=0xAA +PacketSubCMD_2=0x06 +PacketCallFunc_2=OnActWishingDrag \ No newline at end of file diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 7fed019..ec955fe 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -3618,6 +3618,14 @@ Def_PDict_FlashSaleState = "FlashSaleState" # 玩家身上的限时抢购活动state Def_PDict_FlashSaleMailState = "FlashSaleMailState" # 玩家身上的活动更新提醒邮件状态 Def_PDict_FlashSaleYY = "FlashSaleYY_%s" # 玩家预约限时抢购商品 + +#许愿池活动 +Def_PDict_WishingWellID = "WishingWellID" # 玩家身上的许愿池活动ID,唯一标识,取活动开始日期time值 +Def_PDict_WishingWellFreeTime = "WishingWellFreeTime" # 许愿池免费开始计时时间 +Def_PDict_WishingWellAwardTime = "WishingWellAwardTime" # 许愿池许愿时间 +Def_PDict_WishingWellRefreshCnt = "WishingWellRefreshCnt" # 付费刷新次数 +Def_PDict_WishingWellItem = "WishingWellItem_%s_%s" # 物品ID,是否极品、是否绑定信息 参数(类型,物品数据) +Def_PDict_WishingWellItemCnt = "WishingWellItemCnt_%s_%s" # 物品数量记录 参数(类型,物品数据) #------------------------------------------------------------------------------- #类型 Def_PDictType_OnlinePrize Def_PDict1_OnlinePrizeCnt = "OnlinePrizeCnt" # 新手在线已领取奖励次数 @@ -4460,6 +4468,7 @@ Def_Cost_AlchemyPray, # 丹药祈福 Def_Cost_ResetGreatMasterSkill, # 重置天赋技能 Def_Cost_BindJadeWheel, # 绑玉转盘 +Def_Cost_WishingWell, # 许愿池刷新 #-----------以下为暂时没用的,先不删除,如有新增消费点则放在这些之前------------ Def_Cost_RefreshArrestTask, # 刷新悬赏任务 Def_Cost_OffLineExp, # 兑换离线经验 @@ -4480,7 +4489,7 @@ Def_Cost_Trade, # 交易 Def_Cost_Rename, # 改名 Def_Cost_SkillLvUp, # 技能升级 -) = range(2000, 2000 + 56) +) = range(2000, 2000 + 57) Def_Cost_Reason_SonKey = "reason_name_son" # 消费点原因子类说明key @@ -4564,6 +4573,7 @@ Def_Cost_RuneHole:"RuneHole", Def_Cost_AlchemyPray:"AlchemyPray", Def_Cost_BindJadeWheel:"BindJadeWheel", +Def_Cost_WishingWell:"WishingWell", } ## ----------------------------------------------------- @@ -5006,7 +5016,8 @@ Def_RewardType_FCRecharge, # 仙界盛典充值大礼13 Def_RewardType_FCParty, # 仙界盛典全民来嗨14 Def_RewardType_DownLoad, # 分包下载奖励15 -)= range(16) +Def_RewardType_WishingWell, # 许愿池奖励16 +)= range(17) #boss复活相关活动定义 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index b037e1b..bd72882 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -11380,6 +11380,122 @@ #------------------------------------------------------ +# AA 07 许愿池活动刷新奖池 #tagCMActWishingRefresh + +class tagCMActWishingRefresh(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("IsFree", c_ubyte), # 是否免费刷新 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xAA + self.SubCmd = 0x07 + 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 = 0xAA + self.SubCmd = 0x07 + self.IsFree = 0 + return + + def GetLength(self): + return sizeof(tagCMActWishingRefresh) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 07 许愿池活动刷新奖池 //tagCMActWishingRefresh: + Cmd:%s, + SubCmd:%s, + IsFree:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.IsFree + ) + return DumpString + + +m_NAtagCMActWishingRefresh=tagCMActWishingRefresh() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMActWishingRefresh.Cmd,m_NAtagCMActWishingRefresh.SubCmd))] = m_NAtagCMActWishingRefresh + + +#------------------------------------------------------ +# AA 06 许愿池活动许愿 #tagCMActWishing + +class tagCMActWishing(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("SrcWellType", c_ubyte), # 来源库 0-可选库 1-结果库 + ("SrcIndex", c_ubyte), # 来源索引 + ("DesWellType", c_ubyte), # 目标库 0-可选库 1-结果库 + ("DesIndex", c_ubyte), # 目标索引 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xAA + self.SubCmd = 0x06 + 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 = 0xAA + self.SubCmd = 0x06 + self.SrcWellType = 0 + self.SrcIndex = 0 + self.DesWellType = 0 + self.DesIndex = 0 + return + + def GetLength(self): + return sizeof(tagCMActWishing) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 06 许愿池活动许愿 //tagCMActWishing: + Cmd:%s, + SubCmd:%s, + SrcWellType:%d, + SrcIndex:%d, + DesWellType:%d, + DesIndex:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.SrcWellType, + self.SrcIndex, + self.DesWellType, + self.DesIndex + ) + return DumpString + + +m_NAtagCMActWishing=tagCMActWishing() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMActWishing.Cmd,m_NAtagCMActWishing.SubCmd))] = m_NAtagCMActWishing + + +#------------------------------------------------------ # AA 05 限时抢购预约 #tagCMFlashSaleAppointment class tagCMFlashSaleAppointment(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index 80c8e0f..0915012 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -19046,6 +19046,449 @@ #------------------------------------------------------ +# AA 1B 许愿池拖动结果 #tagMCActWishingDragResult + +class tagMCPlayerWishingDragInfo(Structure): + _pack_ = 1 + _fields_ = [ + ("WellType", c_ubyte), # 库 0-可选库 1-结果库 + ("Index", c_ubyte), # 索引 + ("ItemID", c_int), # 物品ID + ("ItemCnt", c_ushort), # 物品数量 + ("IsBind", c_ubyte), # 是否绑定 + ("IsSpecial", c_ubyte), # 是否极品 + ] + + 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.WellType = 0 + self.Index = 0 + self.ItemID = 0 + self.ItemCnt = 0 + self.IsBind = 0 + self.IsSpecial = 0 + return + + def GetLength(self): + return sizeof(tagMCPlayerWishingDragInfo) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 1B 许愿池拖动结果 //tagMCActWishingDragResult: + WellType:%d, + Index:%d, + ItemID:%d, + ItemCnt:%d, + IsBind:%d, + IsSpecial:%d + '''\ + %( + self.WellType, + self.Index, + self.ItemID, + self.ItemCnt, + self.IsBind, + self.IsSpecial + ) + return DumpString + + +class tagMCActWishingDragResult(Structure): + Head = tagHead() + Cnt = 0 #(BYTE Cnt) + InfoList = list() #(vector<tagMCPlayerWishingDragInfo> InfoList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1B + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Cnt): + temInfoList = tagMCPlayerWishingDragInfo() + _pos = temInfoList.ReadData(_lpData, _pos) + self.InfoList.append(temInfoList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1B + self.Cnt = 0 + self.InfoList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.Cnt): + length += self.InfoList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Cnt) + for i in range(self.Cnt): + data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Cnt:%d, + InfoList:%s + '''\ + %( + self.Head.OutputString(), + self.Cnt, + "..." + ) + return DumpString + + +m_NAtagMCActWishingDragResult=tagMCActWishingDragResult() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActWishingDragResult.Head.Cmd,m_NAtagMCActWishingDragResult.Head.SubCmd))] = m_NAtagMCActWishingDragResult + + +#------------------------------------------------------ +# AA 19 许愿池活动信息 #tagMCActWishingWellInfo + +class tagMCWishingWellItem(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), # 物品ID + ("ItemCnt", c_ushort), # 物品数量 + ("IsBind", c_ubyte), # 是否绑定 + ("Mark", 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.ItemID = 0 + self.ItemCnt = 0 + self.IsBind = 0 + self.Mark = 0 + return + + def GetLength(self): + return sizeof(tagMCWishingWellItem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 19 许愿池活动信息 //tagMCActWishingWellInfo: + ItemID:%d, + ItemCnt:%d, + IsBind:%d, + Mark:%d + '''\ + %( + self.ItemID, + self.ItemCnt, + self.IsBind, + self.Mark + ) + return DumpString + + +class tagMCActWishingWellInfo(Structure): + Head = tagHead() + StartDate = "" #(char StartDate[10])// 开始日期 y-m-d + EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d + IsDayReset = 0 #(BYTE IsDayReset)//是否每天重置 + ResetType = 0 #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置 + LimitLV = 0 #(WORD LimitLV)// 限制等级 + Count = 0 #(WORD Count)// 物品数 + WellItemInfo = list() #(vector<tagMCWishingWellItem> WellItemInfo)// 随机库物品信息 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x19 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos) + for i in range(self.Count): + temWellItemInfo = tagMCWishingWellItem() + _pos = temWellItemInfo.ReadData(_lpData, _pos) + self.WellItemInfo.append(temWellItemInfo) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x19 + self.StartDate = "" + self.EndtDate = "" + self.IsDayReset = 0 + self.ResetType = 0 + self.LimitLV = 0 + self.Count = 0 + self.WellItemInfo = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 10 + length += 10 + length += 1 + length += 1 + length += 2 + length += 2 + for i in range(self.Count): + length += self.WellItemInfo[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteString(data, 10, self.StartDate) + data = CommFunc.WriteString(data, 10, self.EndtDate) + data = CommFunc.WriteBYTE(data, self.IsDayReset) + data = CommFunc.WriteBYTE(data, self.ResetType) + data = CommFunc.WriteWORD(data, self.LimitLV) + data = CommFunc.WriteWORD(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.WellItemInfo[i].GetLength(), self.WellItemInfo[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + StartDate:%s, + EndtDate:%s, + IsDayReset:%d, + ResetType:%d, + LimitLV:%d, + Count:%d, + WellItemInfo:%s + '''\ + %( + self.Head.OutputString(), + self.StartDate, + self.EndtDate, + self.IsDayReset, + self.ResetType, + self.LimitLV, + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCActWishingWellInfo=tagMCActWishingWellInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActWishingWellInfo.Head.Cmd,m_NAtagMCActWishingWellInfo.Head.SubCmd))] = m_NAtagMCActWishingWellInfo + + +#------------------------------------------------------ +# AA 1A 许愿池活动玩家信息 #tagMCActWishingWellPlayerInfo + +class tagMCPlayerWishingWellItem(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), # 物品ID + ("ItemCnt", c_ushort), # 物品数量 + ("IsBind", c_ubyte), # 是否绑定 + ("IsSpecial", c_ubyte), # 是否极品 + ] + + 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.ItemID = 0 + self.ItemCnt = 0 + self.IsBind = 0 + self.IsSpecial = 0 + return + + def GetLength(self): + return sizeof(tagMCPlayerWishingWellItem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 1A 许愿池活动玩家信息 //tagMCActWishingWellPlayerInfo: + ItemID:%d, + ItemCnt:%d, + IsBind:%d, + IsSpecial:%d + '''\ + %( + self.ItemID, + self.ItemCnt, + self.IsBind, + self.IsSpecial + ) + return DumpString + + +class tagMCActWishingWellPlayerInfo(Structure): + Head = tagHead() + FreeStartTime = 0 #(DWORD FreeStartTime)// 免费开始倒计时时间 + WishCnt = 0 #(DWORD WishCnt)// 许愿付费刷新次数 + WellItemCnt = 0 #(BYTE WellItemCnt)//许愿池物品数量 + WellItemInfo = list() #(vector<tagMCPlayerWishingWellItem> WellItemInfo)// 随机库物品信息 + CurAwardCnt = 0 #(BYTE CurAwardCnt)// 当前奖励物品数量 + CurAwardItemInfo = list() #(vector<tagMCPlayerWishingWellItem> CurAwardItemInfo)// 当前奖励物品 + LastAwardCnt = 0 #(BYTE LastAwardCnt)// 可领取奖励物品数量 + LastAwardItemInfo = list() #(vector<tagMCPlayerWishingWellItem> LastAwardItemInfo)// 可领取奖励物品 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1A + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.FreeStartTime,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.WishCnt,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.WellItemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.WellItemCnt): + temWellItemInfo = tagMCPlayerWishingWellItem() + _pos = temWellItemInfo.ReadData(_lpData, _pos) + self.WellItemInfo.append(temWellItemInfo) + self.CurAwardCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.CurAwardCnt): + temCurAwardItemInfo = tagMCPlayerWishingWellItem() + _pos = temCurAwardItemInfo.ReadData(_lpData, _pos) + self.CurAwardItemInfo.append(temCurAwardItemInfo) + self.LastAwardCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.LastAwardCnt): + temLastAwardItemInfo = tagMCPlayerWishingWellItem() + _pos = temLastAwardItemInfo.ReadData(_lpData, _pos) + self.LastAwardItemInfo.append(temLastAwardItemInfo) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x1A + self.FreeStartTime = 0 + self.WishCnt = 0 + self.WellItemCnt = 0 + self.WellItemInfo = list() + self.CurAwardCnt = 0 + self.CurAwardItemInfo = list() + self.LastAwardCnt = 0 + self.LastAwardItemInfo = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 4 + length += 1 + for i in range(self.WellItemCnt): + length += self.WellItemInfo[i].GetLength() + length += 1 + for i in range(self.CurAwardCnt): + length += self.CurAwardItemInfo[i].GetLength() + length += 1 + for i in range(self.LastAwardCnt): + length += self.LastAwardItemInfo[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.FreeStartTime) + data = CommFunc.WriteDWORD(data, self.WishCnt) + data = CommFunc.WriteBYTE(data, self.WellItemCnt) + for i in range(self.WellItemCnt): + data = CommFunc.WriteString(data, self.WellItemInfo[i].GetLength(), self.WellItemInfo[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.CurAwardCnt) + for i in range(self.CurAwardCnt): + data = CommFunc.WriteString(data, self.CurAwardItemInfo[i].GetLength(), self.CurAwardItemInfo[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.LastAwardCnt) + for i in range(self.LastAwardCnt): + data = CommFunc.WriteString(data, self.LastAwardItemInfo[i].GetLength(), self.LastAwardItemInfo[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + FreeStartTime:%d, + WishCnt:%d, + WellItemCnt:%d, + WellItemInfo:%s, + CurAwardCnt:%d, + CurAwardItemInfo:%s, + LastAwardCnt:%d, + LastAwardItemInfo:%s + '''\ + %( + self.Head.OutputString(), + self.FreeStartTime, + self.WishCnt, + self.WellItemCnt, + "...", + self.CurAwardCnt, + "...", + self.LastAwardCnt, + "..." + ) + return DumpString + + +m_NAtagMCActWishingWellPlayerInfo=tagMCActWishingWellPlayerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActWishingWellPlayerInfo.Head.Cmd,m_NAtagMCActWishingWellPlayerInfo.Head.SubCmd))] = m_NAtagMCActWishingWellPlayerInfo + + +#------------------------------------------------------ # AA 15 仙界盛典全民来嗨玩家信息 #tagMCAllPeoplePartyInfo class tagMCAllPeoplePartyCount(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index c9510ea..3c85218 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -1032,6 +1032,27 @@ ("char", "MailKey", 0), ("list", "MailItemPrize", 0), ), + + "ActWishingWell":( + ("DWORD", "CfgID", 1), + ("char", "StartDate", 0), + ("char", "EndDate", 0), + ("BYTE", "IsDayReset", 0), + ("BYTE", "ResetType", 0), + ("WORD", "LVLimit", 0), + ("BYTE", "TemplateID", 0), + ), + + "WishingWell":( + ("BYTE", "TemplateID", 1), + ("BYTE", "IsFree", 0), + ("list", "WorldLVLimit", 0), + ("DWORD", "ItemID", 0), + ("WORD", "ItemCnt", 0), + ("BYTE", "IsBind", 0), + ("DWORD", "Weight", 0), + ("DWORD", "Mark", 0), + ), } @@ -3131,6 +3152,50 @@ def GetShopTypeList(self): return self.ShopTypeList # 商店类型列表 def GetMailKey(self): return self.MailKey # 活动更新时发送邮件key def GetMailItemPrize(self): return self.MailItemPrize # 活动更新时发送邮件奖励物品 + +# 许愿池活动时间表 +class IPY_ActWishingWell(): + + def __init__(self): + self.CfgID = 0 + self.StartDate = "" + self.EndDate = "" + self.IsDayReset = 0 + self.ResetType = 0 + self.LVLimit = 0 + self.TemplateID = 0 + return + + def GetCfgID(self): return self.CfgID # 配置ID + def GetStartDate(self): return self.StartDate # 开启日期 + def GetEndDate(self): return self.EndDate # 结束日期 + def GetIsDayReset(self): return self.IsDayReset # 是否每天重置 + def GetResetType(self): return self.ResetType # 重置类型,0-0点重置;1-5点重置 + def GetLVLimit(self): return self.LVLimit # 限制等级 + def GetTemplateID(self): return self.TemplateID # 模板编号 + +# 许愿池库模板表 +class IPY_WishingWell(): + + def __init__(self): + self.TemplateID = 0 + self.IsFree = 0 + self.WorldLVLimit = [] + self.ItemID = 0 + self.ItemCnt = 0 + self.IsBind = 0 + self.Weight = 0 + self.Mark = 0 + return + + def GetTemplateID(self): return self.TemplateID # 模板ID + def GetIsFree(self): return self.IsFree # 是否免费库 + def GetWorldLVLimit(self): return self.WorldLVLimit # 世界等级范围 + def GetItemID(self): return self.ItemID # 物品ID + def GetItemCnt(self): return self.ItemCnt # 物品数量 + def GetIsBind(self): return self.IsBind # 是否绑定 + def GetWeight(self): return self.Weight # 权重 + def GetMark(self): return self.Mark # 排序用标识 def Log(msg, playerID=0, par=0): @@ -3346,6 +3411,10 @@ self.ipyTalentSkillLen = len(self.ipyTalentSkillCache) self.ipyActFlashSaleCache = self.__LoadFileData("ActFlashSale", IPY_ActFlashSale) self.ipyActFlashSaleLen = len(self.ipyActFlashSaleCache) + self.ipyActWishingWellCache = self.__LoadFileData("ActWishingWell", IPY_ActWishingWell) + self.ipyActWishingWellLen = len(self.ipyActWishingWellCache) + self.ipyWishingWellCache = self.__LoadFileData("WishingWell", IPY_WishingWell) + self.ipyWishingWellLen = len(self.ipyWishingWellCache) Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict)) Log("IPY_DataMgr InitOK!") return @@ -3702,6 +3771,10 @@ def GetTalentSkillByIndex(self, index): return self.ipyTalentSkillCache[index] def GetActFlashSaleCount(self): return self.ipyActFlashSaleLen def GetActFlashSaleByIndex(self, index): return self.ipyActFlashSaleCache[index] + def GetActWishingWellCount(self): return self.ipyActWishingWellLen + def GetActWishingWellByIndex(self, index): return self.ipyActWishingWellCache[index] + def GetWishingWellCount(self): return self.ipyWishingWellLen + def GetWishingWellByIndex(self, index): return self.ipyWishingWellCache[index] IPYData = IPY_DataMgr() def IPY_Data(): return IPYData diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py index 29bb164..66c355b 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py @@ -64,7 +64,7 @@ import FBCommon import PlayerBindJadeWheel import BossHurtMng -import PlayerAction +import PlayerWishingWell import PlayerAttrFruit import PlayerSuccess import PlayerDienstgrad @@ -546,7 +546,8 @@ FamilyRobBoss.OnPlayerLogin(curPlayer) # 绑玉转盘 PlayerBindJadeWheel.OnLogin(curPlayer) - + # 许愿池 + PlayerWishingWell.OnLogin(curPlayer) # 上线查询一次充值订单 curPlayer.SendDBQueryRecharge() @@ -4981,6 +4982,10 @@ # 领取分包下载奖励 elif rewardType == ChConfig.Def_RewardType_DownLoad: GetDownloadAward(curPlayer, dataEx) + # 领取许愿池奖励 + elif rewardType == ChConfig.Def_RewardType_WishingWell: + PlayerWishingWell.DoGetWishingAward(curPlayer) + # # # 充值豪礼奖励 # elif rewardType == ShareDefine.Def_RewardType_GoldGift: diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py index 00ab102..6ecda8d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py @@ -92,6 +92,7 @@ import PlayerFairyCeremony import PlayerRefineStove import PlayerFlashSale +import PlayerWishingWell import PlayerVip import PlayerDiceEx import IpyGameDataPY @@ -548,6 +549,8 @@ # 仙盟红包OnDay PlayerFamilyRedPacket.RedPacketOnDay(curPlayer, onEventType) + #许愿池 + PlayerWishingWell.OnDay(curPlayer) return @@ -1284,6 +1287,10 @@ elif actionName == ShareDefine.OperationActionName_FlashSale: PlayerFlashSale.RefreshflashSaleActionInfo() + + elif actionName == ShareDefine.OperationActionName_WishingWell: + PlayerWishingWell.RefreshWishingWellAction() + return if msgValue.isdigit(): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWishingWell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWishingWell.py new file mode 100644 index 0000000..4736a3a --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWishingWell.py @@ -0,0 +1,444 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +#------------------------------------------------------------------------------- +# +##@package Player.PlayerWishingWell +# +# @todo:许愿池 +# @author xdh +# @date 2018-10-18 19:50 +# @version 1.0 +# +# +# 详细描述: 许愿池 +# +#--------------------------------------------------------------------- +"""Version = 2018-10-18 19:50""" +#--------------------------------------------------------------------- + +import IPY_GameWorld +import GameWorld +import ChConfig +import IpyGameDataPY +import PlayerControl +import ChPyNetSendPack +import NetPackCommon +import ShareDefine +import PyGameData +import ItemControler +import ItemCommon + +import time + +g_randomWellDict = {} +g_specialMarkDict = {} + +( +WellType_Select, #可选库 +WellType_Result, #结果库 +WellType_Get, #可领取库 +) = range(3) + + +def __GetItemInfoByData(curPlayer, wellType, i): + itemData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellItem % (wellType, i)) + itemCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellItemCnt % (wellType, i)) + itemID, isBind, isSpecial = itemData / 100, itemData % 100 / 10, itemData % 10 + return itemID, itemCnt, isBind, isSpecial + + +def __SetItemData(curPlayer, wellType, i, itemID, itemCnt, isBind, isSpecial): + itemID = __GetJobItemID(curPlayer, itemID) + itemData = itemID * 100 + isBind * 10 + isSpecial + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WishingWellItem % (wellType, i), itemData) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WishingWellItemCnt % (wellType, i), itemCnt) + return + + +def __GetJobItemID(curPlayer, itemID): + if type(itemID) == int: + return itemID + if type(itemID) != dict: + return 0 + return itemID.get(curPlayer.GetJob(), 0) + + +def OnLogin(curPlayer): + isReset = __CheckPlayerWishingWellAction(curPlayer) + if not isReset: + actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_WishingWell, {}) + # 活动中同步活动信息 + if actCostRebateInfo.get(ShareDefine.ActKey_State): + SyncWishingWellInfo(curPlayer) + SyncWishingWellPlayerInfo(curPlayer) + return + +def OnDay(curPlayer): + actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_WishingWell, {}) + if not actCostRebateInfo.get(ShareDefine.ActKey_State): + __SendWishingWellMail(curPlayer, int(time.time())) + return + +def RefreshWishingWellAction(): + #__InitWishRateList() + playerManager = GameWorld.GetPlayerManager() + for i in xrange(playerManager.GetPlayerCount()): + curPlayer = playerManager.GetPlayerByIndex(i) + if curPlayer == None or not curPlayer.GetInitOK(): + continue + __CheckPlayerWishingWellAction(curPlayer) + return + + +def __CheckPlayerWishingWellAction(curPlayer): + ## 检查玩家许愿池活动数据信息 + global g_randomWellDict + global g_specialMarkDict + playerID = curPlayer.GetPlayerID() + + actWishingWellInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_WishingWell, {}) + WishingWellID = actWishingWellInfo.get(ShareDefine.ActKey_ID, 0) + state = actWishingWellInfo.get(ShareDefine.ActKey_State, 0) + cfgID = actWishingWellInfo.get(ShareDefine.ActKey_CfgID, 0) + worldLV = actWishingWellInfo.get(ShareDefine.ActKey_WorldLV, 0) + playerWishingWellID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellID) # 玩家身上的活动ID + + # 活动ID 相同的话不处理 + if WishingWellID == playerWishingWellID: + #GameWorld.DebugLog("许愿池活动ID不变,不处理!", curPlayer.GetPlayerID()) + return + + GameWorld.DebugLog("许愿池重置! WishingWellID=%s,playerWishingWellID=%s,state=%s,worldLv=%s" + % (WishingWellID, playerWishingWellID, state, worldLV), playerID) + + # 未领取的奖励邮件发放 + __SendWishingWellMail(curPlayer, WishingWellID or int(time.time()), state) + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WishingWellID, WishingWellID) + #每天开始随机一次免费盘 + if state: + g_randomWellDict = {} + g_specialMarkDict = {} + __DoActWishingRefresh(curPlayer, 1, True) + + SyncWishingWellInfo(curPlayer) + SyncWishingWellPlayerInfo(curPlayer) + return True + + +def __SendWishingWellMail(curPlayer, curTime, state=-1): + lastAwardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellAwardTime) + + if not lastAwardTime: + if state != -1: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WishingWellAwardTime, curTime) + return + GameWorld.DebugLog('许愿池未领取的奖励邮件发放检查 lastAwardTime=%s,state=%s,pass=%s'%(lastAwardTime, state, curTime - lastAwardTime)) + passDay = (curTime - lastAwardTime)/86400 + if passDay <= 0: + return + isOver = True + count = IpyGameDataPY.GetFuncCfg('WishingWellCfg', 4) + mailItemList = [] + saveItemList = [] + for i in xrange(count): + itemID, itemCnt, isBind, isSpecial = __GetItemInfoByData(curPlayer, WellType_Get, i) + if itemID: + mailItemList.append([itemID, itemCnt, isBind]) + __SetItemData(curPlayer, WellType_Get, i, 0, 0, 0, 0) + j = 0 + for i in xrange(count): + itemID, itemCnt, isBind, isSpecial = __GetItemInfoByData(curPlayer, WellType_Result, i) + if not itemID: + continue + + if passDay == 1: #相差一天,存储奖励 + __SetItemData(curPlayer, WellType_Get, j, itemID, itemCnt, isBind, isSpecial) + saveItemList.append([itemID, itemCnt, isBind]) + isOver = False + elif passDay > 1: #大于1天,直接邮件发奖励 + mailItemList.append([itemID, itemCnt, isBind]) + __SetItemData(curPlayer, WellType_Result, i, 0, 0, 0, 0) + j +=1 + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WishingWellAwardTime, 0 if isOver else curTime) + if mailItemList: + PlayerControl.SendMailByKey('WishPool', [curPlayer.GetID()], mailItemList) + GameWorld.DebugLog('许愿池距离时间 passDay=%s,mailItemList=%s,saveItemList=%s,isOver=%s'%(passDay, mailItemList, saveItemList, isOver), curPlayer.GetID()) + return + + +def __InitWishRateList(): + ## 初始许愿池随机库 + global g_randomWellDict + global g_specialMarkDict + actWishingWellInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_WishingWell, {}) + state = actWishingWellInfo.get(ShareDefine.ActKey_State, 0) + cfgID = actWishingWellInfo.get(ShareDefine.ActKey_CfgID, 0) + worldLV = actWishingWellInfo.get(ShareDefine.ActKey_WorldLV, 0) + if not cfgID or not worldLV or not state: + return + actIpyData = IpyGameDataPY.GetIpyGameData("ActWishingWell", cfgID) + if not actIpyData: + return + templateID = actIpyData.GetTemplateID() + ipyDataList = IpyGameDataPY.GetIpyGameDataList('WishingWell', templateID) + if not ipyDataList: + return + g_randomWellDict = {} # {是否免费:[[权重,[物品ID,数量,是否绑定,标识]]]} + weightDict = {} + for ipyData in ipyDataList: + worldLVLimit = ipyData.GetWorldLVLimit() + if worldLV < worldLVLimit[0] or worldLV > worldLVLimit[1]: + continue + isFree = ipyData.GetIsFree() + itemID = ipyData.GetItemID() + itemCnt = ipyData.GetItemCnt() + isBind = ipyData.GetIsBind() + weight = ipyData.GetWeight() + mark = ipyData.GetMark() + weightDict[isFree] = weightDict.get(isFree, 0) + weight + if isFree not in g_randomWellDict: + g_randomWellDict[isFree] = [] + g_randomWellDict[isFree].append([weightDict[isFree], [itemID, itemCnt, isBind, mark]]) + + groupID, rowID = mark / 100, mark % 100 + if rowID > g_specialMarkDict.get(groupID, 0) % 100: + g_specialMarkDict[groupID] = mark + GameWorld.DebugLog(' 初始许愿池随机库 g_randomWellDict=%s, g_specialMarkDict=%s' % (g_randomWellDict, g_specialMarkDict)) + return + + +def __GetRandomRateList(isFree): + ## 获取增长列表 + if not g_randomWellDict: + __InitWishRateList() + return g_randomWellDict.get(isFree, []) + + +#// AA 07 许愿池活动刷新奖池 #tagCMActWishingRefresh +#struct tagCMActWishingRefresh +#{ +# tagHead Head; +# BYTE IsFree; // 是否免费刷新 +#}; +def OnActWishingRefresh(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_WishingWell, {}) + state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0) + cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0) + if not state or not cfgID: + return + + isFree = clientData.IsFree + __DoActWishingRefresh(curPlayer, isFree) + #通知 + SyncWishingWellPlayerInfo(curPlayer) + return + +def __DoActWishingRefresh(curPlayer, isFree, isSystem=False): + randomRateList = __GetRandomRateList(isFree) + if not randomRateList: + GameWorld.DebugLog(' 许愿池活动刷新奖池 随机库获取错误 !') + return + playerID = curPlayer.GetID() + GameWorld.DebugLog(' isFree=%s, randomRateList=%s' % (isFree, randomRateList)) + + if isFree: + if not isSystem: + freeStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellFreeTime) + curTime = int(time.time()) + freeCountCD = IpyGameDataPY.GetFuncCfg('WishingWellCfg') + if curTime - freeStartTime < freeCountCD: + GameWorld.DebugLog('许愿池活动免费刷新奖池, 免费CD未到! freeCountCD=%s, passTime=%s' % (freeCountCD, curTime - freeStartTime), playerID) + return + else: + refreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellRefreshCnt) + infoDict = {'refreshCnt':refreshCnt} + costMoney = eval(IpyGameDataPY.GetFuncCompileCfg('WishingWellCfg', 2)) + if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney): + return + + randomCnt = IpyGameDataPY.GetFuncCfg('WishingWellCfg', 3) + randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, randomCnt, []) + if len(randomResultList) != randomCnt: + GameWorld.DebugLog(' 许愿池活动刷新奖池 随机库结果 获取错误 !randomCnt=%s, randomResultList=%s' % (randomCnt, randomResultList)) + return + + if not isFree: + PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_WishingWell, infoDict) + #增加次数 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WishingWellRefreshCnt, refreshCnt+1) + elif not isSystem: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WishingWellFreeTime, int(time.time())) + + for i, info in enumerate(randomResultList): + itemID, itemCnt, isBind, mark = info + isSpecial = 1 if mark in g_specialMarkDict.values() else 0 + __SetItemData(curPlayer, WellType_Select, i, itemID, itemCnt, isBind, isSpecial) + GameWorld.DebugLog(' 许愿池活动刷新 isFree=%s, randomResultList=%s' % (isFree, randomResultList), playerID) + return + +#// AA 06 许愿池活动许愿 #tagCMActWishing +#struct tagCMActWishing +#{ +# tagHead Head; +# BYTE SrcWellType; // 来源库 0-可选库 1-结果库 +# BYTE SrcIndex; // 来源索引 +# BYTE DesWellType; // 目标库 0-可选库 1-结果库 +# BYTE DesIndex; // 目标索引 +#}; +def OnActWishingDrag(index, clientData, tick): + srcWellType = clientData.SrcWellType + srcIndex = clientData.SrcIndex + desWellType = clientData.DesWellType + desIndex = clientData.DesIndex + if srcWellType not in [WellType_Select, WellType_Result] or desWellType not in [WellType_Select, WellType_Result]: + return + if srcWellType == desWellType: + return + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + playerID = curPlayer.GetID() + srcitemID, srcitemCnt, srcisBind, srcisSpecial = __GetItemInfoByData(curPlayer, srcWellType, srcIndex) + if not srcitemID: + GameWorld.DebugLog('许愿池活动拖拽物品 来源位置没有物品 srcWellType=%s, srcIndex=%s' % (srcWellType, srcIndex), playerID) + return + desitemID, desitemCnt, desisBind, desisSpecial = __GetItemInfoByData(curPlayer, desWellType, desIndex) + __SetItemData(curPlayer, desWellType, desIndex, srcitemID, srcitemCnt, srcisBind, srcisSpecial) + if desitemID: + __SetItemData(curPlayer, srcWellType, srcIndex, desitemID, desitemCnt, desisBind, desisSpecial) + else: + __SetItemData(curPlayer, srcWellType, srcIndex, 0, 0, 0, 0) + GameWorld.DebugLog('许愿池活动拖拽物品 desWellType=%s,desIndex=%s,srcitemID=%s'%(desWellType, desIndex,srcitemID)) + #通知 + SyncWellItemChange(curPlayer, [[srcWellType, srcIndex],[desWellType, desIndex]]) + return + +def SyncWellItemChange(curPlayer, changeList): + packData = ChPyNetSendPack.tagMCActWishingDragResult() + packData.InfoList = [] + for wellType, index in changeList: + itemID, itemCnt, isBind, isSpecial = __GetItemInfoByData(curPlayer, wellType, index) + changeInfo = ChPyNetSendPack.tagMCPlayerWishingDragInfo() + changeInfo.WellType = wellType + changeInfo.Index = index + changeInfo.ItemID = itemID + changeInfo.ItemCnt = itemCnt + changeInfo.IsBind = isBind + changeInfo.IsSpecial = isSpecial + packData.InfoList.append(changeInfo) + packData.Cnt = len(packData.InfoList) + NetPackCommon.SendFakePack(curPlayer, packData) + return + +def DoGetWishingAward(curPlayer): + ## 领取许愿池奖励 + count = IpyGameDataPY.GetFuncCfg('WishingWellCfg', 4) + giveItemList = [] + for i in xrange(count): + itemID, itemCnt, isBind, isSpecial = __GetItemInfoByData(curPlayer, WellType_Get, i) + if itemID: + giveItemList.append([itemID, itemCnt, isBind]) + if not giveItemList: + GameWorld.Log('领取许愿池奖励 没有奖励可领取!', curPlayer.GetID()) + return + + needSpace = len(giveItemList) + packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) + if needSpace > packSpace: + PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371") + return + for itemID, itemCnt, isBind in giveItemList: + ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem]) + for i in xrange(count): + __SetItemData(curPlayer, WellType_Get, i, 0, 0, 0, 0) + SyncWishingWellPlayerInfo(curPlayer) + return + + +def SyncWishingWellInfo(curPlayer): + ##同步许愿池活动信息 + actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_WishingWell, {}) + state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0) + cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0) + if not state or not cfgID: + return + actIpyData = IpyGameDataPY.GetIpyGameData("ActWishingWell", cfgID) + if not actIpyData: + return + openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 + actInfo = ChPyNetSendPack.tagMCActWishingWellInfo() + actInfo.Clear() + actInfo.StartDate = GameWorld.GetOperationActionDateStr(actIpyData.GetStartDate(), openServerDay) + actInfo.EndtDate = GameWorld.GetOperationActionDateStr(actIpyData.GetEndDate(), openServerDay) + actInfo.IsDayReset = actIpyData.GetIsDayReset() + actInfo.ResetType = actIpyData.GetResetType() + actInfo.LimitLV = actIpyData.GetLVLimit() + actInfo.WellItemInfo = [] + randomItemList = __GetRandomRateList(0) + for itemInfo in randomItemList: + itemID, itemCnt, isBind, mark = itemInfo[1] + wellItemInfo = ChPyNetSendPack.tagMCWishingWellItem() + wellItemInfo.ItemID = itemID + wellItemInfo.ItemCnt = itemCnt + wellItemInfo.IsBind = isBind + wellItemInfo.Mark = mark + actInfo.WellItemInfo.append(wellItemInfo) + actInfo.Count = len(actInfo.WellItemInfo) + NetPackCommon.SendFakePack(curPlayer, actInfo) + return + + +def SyncWishingWellPlayerInfo(curPlayer): + ##同步许愿池玩家信息 + packData = ChPyNetSendPack.tagMCActWishingWellPlayerInfo() + freeStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellFreeTime) + if not freeStartTime:#没有则默认活动开始时间 + actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_WishingWell, {}) + cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0) + actIpyData = IpyGameDataPY.GetIpyGameData("ActWishingWell", cfgID) + if actIpyData: + openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 + startDate = GameWorld.GetOperationActionDateStr(actIpyData.GetStartDate(), openServerDay) + + resetType = actIpyData.GetResetType() # 重置类型,0-0点重置;1-5点重置 + if resetType == 1: + startDayDate = "%s 05:00:00" % (startDate) + else: + startDayDate = "%s 00:00:00" % (startDate) + freeStartTime = GameWorld.ChangeTimeStrToNum(startDayDate, timeFormat=ChConfig.TYPE_Time_Format) + GameWorld.DebugLog('许愿池活动开始时间 startDayDate=%s'%startDayDate) + + + packData.FreeStartTime = freeStartTime + packData.WishCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WishingWellRefreshCnt) + packData.WellItemInfo = [] + __AddWishingWellItemPackInfo(curPlayer, packData.WellItemInfo, WellType_Select) + packData.WellItemCnt = len(packData.WellItemInfo) + packData.CurAwardItemInfo = [] + __AddWishingWellItemPackInfo(curPlayer, packData.CurAwardItemInfo, WellType_Result) + packData.CurAwardCnt = len(packData.CurAwardItemInfo) + packData.LastAwardItemInfo = [] + __AddWishingWellItemPackInfo(curPlayer, packData.LastAwardItemInfo, WellType_Get) + packData.LastAwardCnt = len(packData.LastAwardItemInfo) + NetPackCommon.SendFakePack(curPlayer, packData) + return + + +def __AddWishingWellItemPackInfo(curPlayer, itemList, wellType): + if wellType == WellType_Select: + count = IpyGameDataPY.GetFuncCfg('WishingWellCfg', 3) + else: + count = IpyGameDataPY.GetFuncCfg('WishingWellCfg', 4) + for i in xrange(count): + itemID, itemCnt, isBind, isSpecial = __GetItemInfoByData(curPlayer, wellType, i) + packData = ChPyNetSendPack.tagMCPlayerWishingWellItem() + packData.ItemID = itemID + packData.ItemCnt = itemCnt + packData.IsBind = isBind + packData.IsSpecial = isSpecial + itemList.append(packData) + return + diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py index a4130f2..3011cb5 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py @@ -233,12 +233,14 @@ OperationActionName_FairyCeremony = "ActFairyCeremony" # 仙界盛典活动 OperationActionName_RealmPoint = "ActRealmPoint" # 多倍修行点活动 OperationActionName_FlashSale = "ActFlashSale" # 限时抢购活动 +OperationActionName_WishingWell = "ActWishingWell" # 许愿池活动 OperationActionNameList = [OperationActionName_ExpRate, OperationActionName_CostRebate, OperationActionName_BossReborn,OperationActionName_SpringSale, OperationActionName_FlashGiftbag, OperationActionName_FairyCeremony, - OperationActionName_RealmPoint, OperationActionName_FlashSale] + OperationActionName_RealmPoint, OperationActionName_FlashSale, + OperationActionName_WishingWell] #需要记录开启活动时的世界等级的运营活动 -NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony] +NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell] #活动信息字典key定义 ActKey_ID = "ID" # 活动ID,唯一标识的ID,一般是活动开启的time值 -- Gitblit v1.8.0