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