From 94ca00f866c8c947240cfbfaa399a88bdd05f62b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 01 二月 2021 14:47:01 +0800
Subject: [PATCH] 8716 【主干】【后端】【BT2】H.活动-节日祈愿(增加节日游历);

---
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                                         |   44 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                  |  454 ++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py                            |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py                         |    2 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                       |  454 ++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py  |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_BZZD.py          |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py                       |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_AllFamilyBoss.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                    |   87 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                                  |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py                                |    2 
 PySysDB/PySysDBPY.h                                                                                                     |   33 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py                         |  311 +++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                           |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py                             |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                      |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SealDemon.py     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py                          |   88 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastWish.py                           |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py           |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                                    |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py                        |    4 
 PySysDB/PySysDBG.h                                                                                                      |   16 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                         |   32 +
 26 files changed, 1,564 insertions(+), 7 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 6074880..3261164 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -298,6 +298,22 @@
 	list		NotifyInfoLoop;	//全服提示信息 - 循环广播[间隔分钟, 广播key]
 };
 
+//节日游历时间表
+
+struct tagActFeastTravel
+{
+	DWORD		_CfgID;	//配置ID
+	char		ActMark;	//活动组标记
+	list		PlatformList;	//活动平台列表["平台A", "平台A", ...],配[]代表所有
+	list		ServerGroupIDList;	//服务器ID列表
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
+	dict		NotifyInfoStart;	//全服提示信息 - 相对开始时间
+	dict		NotifyInfoEnd;	//全服提示信息 - 相对结束时间
+	list		NotifyInfoLoop;	//全服提示信息 - 循环广播[间隔分钟, 广播key]
+};
+
 //等级开启功能 #tagFuncOpenLV
 
 struct	tagFuncOpenLV
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 294ba85..5d66d89 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1889,6 +1889,7 @@
 	DWORD		_CfgID;	//配置ID
 	char		StartDate;	//开启日期
 	char		EndDate;	//结束日期
+	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
 	dict		TemplateIDInfo;	//模板信息 {(世界等级A,B):模板编号, ...}
 };
 
@@ -1916,6 +1917,38 @@
 	char		WorldNotifyKey;	//全服广播key,参数(玩家名, 物品ID, 物品数据, 个数,)
 };
 
+//节日游历时间表
+
+struct tagActFeastTravel
+{
+	DWORD		_CfgID;	//配置ID
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
+	dict		TemplateIDInfo;	//模板信息 {(世界等级A,B):模板编号, ...}
+};
+
+//节日游历任务表
+
+struct tagActFeastTravelTask
+{
+	BYTE		_TraveTasklD;	//游历ID
+	WORD		FinishNeedValue;	//完成所需进度值
+	WORD		FinishTimeMax;	//总可完成次数,0不限
+	BYTE		AddTravelPoint;	//完成次数获得游历值
+};
+
+//节日游历奖励表
+
+struct tagActFeastTravelAward
+{
+	BYTE		_TemplatelD;	//奖励模板ID
+	BYTE		RecordIndex;	//奖励记录索引
+	WORD		NeedTravelPoint;	//领奖所需游历值
+	BYTE		AwardCountMax;	//可领取次数,0代表不限
+	list		TravelAwardInfo;	//游历奖励 [[物品ID,个数,是否拍品], ...]
+};
+
 //诛仙BOSS表
 
 struct tagZhuXianBoss
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index edf4da4..7ce2e59 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -27426,6 +27426,453 @@
 
 
 #------------------------------------------------------
+# AA 46 节日游历活动信息 #tagMCFeastTravelInfo
+
+class  tagMCFeastTravelAwardItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", 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.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelAwardItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 46 节日游历活动信息 //tagMCFeastTravelInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelAward(Structure):
+    AwardIndex = 0    #(BYTE AwardIndex)//游历奖励索引
+    NeedTravelPoint = 0    #(WORD NeedTravelPoint)//单次领奖所需游历值
+    AwardCountMax = 0    #(BYTE AwardCountMax)//最大可领取次数,0代表不限
+    AwardItemCount = 0    #(BYTE AwardItemCount)//奖励物品数
+    AwardItemList = list()    #(vector<tagMCFeastTravelAwardItem> AwardItemList)//奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.AwardIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedTravelPoint,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.AwardCountMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.AwardItemCount):
+            temAwardItemList = tagMCFeastTravelAwardItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.AwardIndex = 0
+        self.NeedTravelPoint = 0
+        self.AwardCountMax = 0
+        self.AwardItemCount = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 2
+        length += 1
+        length += 1
+        for i in range(self.AwardItemCount):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.AwardIndex)
+        data = CommFunc.WriteWORD(data, self.NeedTravelPoint)
+        data = CommFunc.WriteBYTE(data, self.AwardCountMax)
+        data = CommFunc.WriteBYTE(data, self.AwardItemCount)
+        for i in range(self.AwardItemCount):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                AwardIndex:%d,
+                                NeedTravelPoint:%d,
+                                AwardCountMax:%d,
+                                AwardItemCount:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.AwardIndex,
+                                self.NeedTravelPoint,
+                                self.AwardCountMax,
+                                self.AwardItemCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelTask(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("TravelTaskID", c_ubyte),    #游历任务ID
+                  ("FinishNeedValue", c_ushort),    #单次完成所需进度
+                  ("FinishTimeMax", c_ubyte),    #最大可完成次数,0代表不限
+                  ("AddTravelPoint", 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.TravelTaskID = 0
+        self.FinishNeedValue = 0
+        self.FinishTimeMax = 0
+        self.AddTravelPoint = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelTask)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 46 节日游历活动信息 //tagMCFeastTravelInfo:
+                                TravelTaskID:%d,
+                                FinishNeedValue:%d,
+                                FinishTimeMax:%d,
+                                AddTravelPoint:%d
+                                '''\
+                                %(
+                                self.TravelTaskID,
+                                self.FinishNeedValue,
+                                self.FinishTimeMax,
+                                self.AddTravelPoint
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelInfo(Structure):
+    Head = tagHead()
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
+    TravelTaskCount = 0    #(BYTE TravelTaskCount)// 游历任务数
+    TravelTaskList = list()    #(vector<tagMCFeastTravelTask> TravelTaskList)//游历任务信息列表
+    TravelAwardCount = 0    #(BYTE TravelAwardCount)// 游历奖励数
+    TravelAwardList = list()    #(vector<tagMCFeastTravelAward> TravelAwardList)//游历奖励信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x46
+        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.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TravelTaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelTaskCount):
+            temTravelTaskList = tagMCFeastTravelTask()
+            _pos = temTravelTaskList.ReadData(_lpData, _pos)
+            self.TravelTaskList.append(temTravelTaskList)
+        self.TravelAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelAwardCount):
+            temTravelAwardList = tagMCFeastTravelAward()
+            _pos = temTravelAwardList.ReadData(_lpData, _pos)
+            self.TravelAwardList.append(temTravelAwardList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x46
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.ResetType = 0
+        self.TravelTaskCount = 0
+        self.TravelTaskList = list()
+        self.TravelAwardCount = 0
+        self.TravelAwardList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 10
+        length += 10
+        length += 1
+        length += 1
+        for i in range(self.TravelTaskCount):
+            length += self.TravelTaskList[i].GetLength()
+        length += 1
+        for i in range(self.TravelAwardCount):
+            length += self.TravelAwardList[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.ResetType)
+        data = CommFunc.WriteBYTE(data, self.TravelTaskCount)
+        for i in range(self.TravelTaskCount):
+            data = CommFunc.WriteString(data, self.TravelTaskList[i].GetLength(), self.TravelTaskList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.TravelAwardCount)
+        for i in range(self.TravelAwardCount):
+            data = CommFunc.WriteString(data, self.TravelAwardList[i].GetLength(), self.TravelAwardList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                ResetType:%d,
+                                TravelTaskCount:%d,
+                                TravelTaskList:%s,
+                                TravelAwardCount:%d,
+                                TravelAwardList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.StartDate,
+                                self.EndtDate,
+                                self.ResetType,
+                                self.TravelTaskCount,
+                                "...",
+                                self.TravelAwardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFeastTravelInfo=tagMCFeastTravelInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFeastTravelInfo.Head.Cmd,m_NAtagMCFeastTravelInfo.Head.SubCmd))] = m_NAtagMCFeastTravelInfo
+
+
+#------------------------------------------------------
+# AA 47 节日游历活动玩家信息 #tagMCFeastTravelPlayerInfo
+
+class  tagMCFeastTravelPlayerAward(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("AwardIndex", c_ubyte),    #游历奖励索引
+                  ("GetAwardCount", c_ubyte),    #已领取次数;前端判断是否可领取: 总游历值 >=  (已领取次数 + 1)  * 单次所需游历值
+                  ]
+
+    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.AwardIndex = 0
+        self.GetAwardCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelPlayerAward)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 47 节日游历活动玩家信息 //tagMCFeastTravelPlayerInfo:
+                                AwardIndex:%d,
+                                GetAwardCount:%d
+                                '''\
+                                %(
+                                self.AwardIndex,
+                                self.GetAwardCount
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelPlayerTask(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("TravelTaskID", c_ubyte),    #游历任务ID
+                  ("TravelValue", c_int),    #当前进度值,一直累加
+                  ("FinishCount", c_ubyte),    #当前已完成次数; 前端计算未完成次数的进度值=max(0, 当前进度值 - (完成次数 * 单次所需进度))
+                  ]
+
+    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.TravelTaskID = 0
+        self.TravelValue = 0
+        self.FinishCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelPlayerTask)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 47 节日游历活动玩家信息 //tagMCFeastTravelPlayerInfo:
+                                TravelTaskID:%d,
+                                TravelValue:%d,
+                                FinishCount:%d
+                                '''\
+                                %(
+                                self.TravelTaskID,
+                                self.TravelValue,
+                                self.FinishCount
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelPlayerInfo(Structure):
+    Head = tagHead()
+    TravelPoint = 0    #(DWORD TravelPoint)//当前总游历值,一直累加,不会扣的
+    TravelPlayerTaskCount = 0    #(BYTE TravelPlayerTaskCount)// 游历任务数,不一定有同步,有同步数据则替换即可
+    TravelPlayerTaskList = list()    #(vector<tagMCFeastTravelPlayerTask> TravelPlayerTaskList)//游历任务信息列表
+    TravelPlayerAwardCount = 0    #(BYTE TravelPlayerAwardCount)// 游历奖励数,不一定有同步,有同步数据则替换即可
+    TravelPlayerAwardList = list()    #(vector<tagMCFeastTravelPlayerAward> TravelPlayerAwardList)//游历奖励信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x47
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.TravelPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TravelPlayerTaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelPlayerTaskCount):
+            temTravelPlayerTaskList = tagMCFeastTravelPlayerTask()
+            _pos = temTravelPlayerTaskList.ReadData(_lpData, _pos)
+            self.TravelPlayerTaskList.append(temTravelPlayerTaskList)
+        self.TravelPlayerAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelPlayerAwardCount):
+            temTravelPlayerAwardList = tagMCFeastTravelPlayerAward()
+            _pos = temTravelPlayerAwardList.ReadData(_lpData, _pos)
+            self.TravelPlayerAwardList.append(temTravelPlayerAwardList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x47
+        self.TravelPoint = 0
+        self.TravelPlayerTaskCount = 0
+        self.TravelPlayerTaskList = list()
+        self.TravelPlayerAwardCount = 0
+        self.TravelPlayerAwardList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.TravelPlayerTaskCount):
+            length += self.TravelPlayerTaskList[i].GetLength()
+        length += 1
+        for i in range(self.TravelPlayerAwardCount):
+            length += self.TravelPlayerAwardList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.TravelPoint)
+        data = CommFunc.WriteBYTE(data, self.TravelPlayerTaskCount)
+        for i in range(self.TravelPlayerTaskCount):
+            data = CommFunc.WriteString(data, self.TravelPlayerTaskList[i].GetLength(), self.TravelPlayerTaskList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.TravelPlayerAwardCount)
+        for i in range(self.TravelPlayerAwardCount):
+            data = CommFunc.WriteString(data, self.TravelPlayerAwardList[i].GetLength(), self.TravelPlayerAwardList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                TravelPoint:%d,
+                                TravelPlayerTaskCount:%d,
+                                TravelPlayerTaskList:%s,
+                                TravelPlayerAwardCount:%d,
+                                TravelPlayerAwardList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.TravelPoint,
+                                self.TravelPlayerTaskCount,
+                                "...",
+                                self.TravelPlayerAwardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFeastTravelPlayerInfo=tagMCFeastTravelPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFeastTravelPlayerInfo.Head.Cmd,m_NAtagMCFeastTravelPlayerInfo.Head.SubCmd))] = m_NAtagMCFeastTravelPlayerInfo
+
+
+#------------------------------------------------------
 # AA 20 节日巡礼活动信息 #tagMCFeastWeekPartyInfo
 
 class  tagMCFeastWeekPartyItem(Structure):
@@ -28062,6 +28509,7 @@
     Head = tagHead()
     StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
     EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
     WishPoolShowCount = 0    #(BYTE WishPoolShowCount)//祝福池展示物品数
     WishPoolShowItemList = list()    #(vector<DWORD> WishPoolShowItemList)//祝福池展示物品ID列表
     BottleCount = 0    #(BYTE BottleCount)// 祝福瓶个数
@@ -28079,6 +28527,7 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
         self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.WishPoolShowCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.WishPoolShowCount):
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
@@ -28097,6 +28546,7 @@
         self.Head.SubCmd = 0x43
         self.StartDate = ""
         self.EndtDate = ""
+        self.ResetType = 0
         self.WishPoolShowCount = 0
         self.WishPoolShowItemList = list()
         self.BottleCount = 0
@@ -28108,6 +28558,7 @@
         length += self.Head.GetLength()
         length += 10
         length += 10
+        length += 1
         length += 1
         length += 4 * self.WishPoolShowCount
         length += 1
@@ -28121,6 +28572,7 @@
         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.ResetType)
         data = CommFunc.WriteBYTE(data, self.WishPoolShowCount)
         for i in range(self.WishPoolShowCount):
             data = CommFunc.WriteDWORD(data, self.WishPoolShowItemList[i])
@@ -28134,6 +28586,7 @@
                                 Head:%s,
                                 StartDate:%s,
                                 EndtDate:%s,
+                                ResetType:%d,
                                 WishPoolShowCount:%d,
                                 WishPoolShowItemList:%s,
                                 BottleCount:%d,
@@ -28143,6 +28596,7 @@
                                 self.Head.OutputString(),
                                 self.StartDate,
                                 self.EndtDate,
+                                self.ResetType,
                                 self.WishPoolShowCount,
                                 "...",
                                 self.BottleCount,
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 4130ece..4d09b1f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -260,6 +260,19 @@
                         ("list", "NotifyInfoLoop", 0),
                         ),
 
+                "ActFeastTravel":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "ActMark", 0),
+                        ("list", "PlatformList", 0),
+                        ("list", "ServerGroupIDList", 0),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("BYTE", "ResetType", 0),
+                        ("dict", "NotifyInfoStart", 0),
+                        ("dict", "NotifyInfoEnd", 0),
+                        ("list", "NotifyInfoLoop", 0),
+                        ),
+
                 "FuncOpenLV":(
                         ("DWORD", "FuncId", 1),
                         ("DWORD", "LimitLV", 0),
@@ -1164,6 +1177,33 @@
 
 # 节日祝福时间表
 class IPY_ActFeastWish():
+    
+    def __init__(self):
+        self.CfgID = 0
+        self.ActMark = ""
+        self.PlatformList = []
+        self.ServerGroupIDList = []
+        self.StartDate = ""
+        self.EndDate = ""
+        self.ResetType = 0
+        self.NotifyInfoStart = {}
+        self.NotifyInfoEnd = {}
+        self.NotifyInfoLoop = []
+        return
+        
+    def GetCfgID(self): return self.CfgID # 配置ID
+    def GetActMark(self): return self.ActMark # 活动组标记
+    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
+    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器ID列表
+    def GetStartDate(self): return self.StartDate # 开启日期
+    def GetEndDate(self): return self.EndDate # 结束日期
+    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]
+
+# 节日游历时间表
+class IPY_ActFeastTravel():
     
     def __init__(self):
         self.CfgID = 0
@@ -2195,6 +2235,8 @@
         self.ipyActFeastLoginLen = len(self.ipyActFeastLoginCache)
         self.ipyActFeastWishCache = self.__LoadFileData("ActFeastWish", IPY_ActFeastWish)
         self.ipyActFeastWishLen = len(self.ipyActFeastWishCache)
+        self.ipyActFeastTravelCache = self.__LoadFileData("ActFeastTravel", IPY_ActFeastTravel)
+        self.ipyActFeastTravelLen = len(self.ipyActFeastTravelCache)
         self.ipyFuncOpenLVCache = self.__LoadFileData("FuncOpenLV", IPY_FuncOpenLV)
         self.ipyFuncOpenLVLen = len(self.ipyFuncOpenLVCache)
         self.ipyChinNPCCache = self.__LoadFileData("ChinNPC", IPY_ChinNPC)
@@ -2489,6 +2531,8 @@
     def GetActFeastLoginByIndex(self, index): return self.ipyActFeastLoginCache[index]
     def GetActFeastWishCount(self): return self.ipyActFeastWishLen
     def GetActFeastWishByIndex(self, index): return self.ipyActFeastWishCache[index]
+    def GetActFeastTravelCount(self): return self.ipyActFeastTravelLen
+    def GetActFeastTravelByIndex(self, index): return self.ipyActFeastTravelCache[index]
     def GetFuncOpenLVCount(self): return self.ipyFuncOpenLVLen
     def GetFuncOpenLVByIndex(self, index): return self.ipyFuncOpenLVCache[index]
     def GetChinNPCCount(self): return self.ipyChinNPCLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index fa2fc3f..f660a05 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -226,12 +226,13 @@
 OperationActionName_RechargeRebateGold = "ActRechargeRebateGold" # 充值返利仙玉活动(活动结束邮件发放,节日活动)
 OperationActionName_GrowupBuy = "ActGrowupBuy" # 成长必买活动
 OperationActionName_FeastLogin = "ActFeastLogin" # 节日登录活动
-OperationActionName_FeastWish = "ActFeastWish" # 节日祝愿活动
+OperationActionName_FeastWish = "ActFeastWish" # 节日祝福活动
+OperationActionName_FeastTravel = "ActFeastTravel" # 节日游历活动
 #节日活动类型列表 - 该类型无视开服天,日期到了就开启
 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket,
                                 OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
                                 OperationActionName_FeastLogin, OperationActionName_TotalRecharge3,
-                                OperationActionName_FeastWish,
+                                OperationActionName_FeastWish, OperationActionName_FeastTravel,
                                 ]
 #所有的运营活动列表,含节日活动
 OperationActionNameList = [OperationActionName_ExpRate, OperationActionName_CostRebate, 
@@ -254,7 +255,7 @@
                                    OperationActionName_WeekParty,
                                    OperationActionName_CollectWords, OperationActionName_CollectWords2,
                                    OperationActionName_FeastLogin, OperationActionName_TotalRecharge3,
-                                   OperationActionName_FeastWish,
+                                   OperationActionName_FeastWish, OperationActionName_FeastTravel,
                                    ]
 
 #所有的累计充值活动
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 4cfe90e..9a8ab21 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3834,6 +3834,13 @@
 Def_PDict_FeastWishID = "FeastWishID"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值
 Def_PDict_FeastWishBottleValue = "FeastWishBottleValue_%s"  # 祝福瓶当前祝福值,参数(瓶子编号)
 Def_PDict_FeastWishBottleGetState = "FeastWishBottleGetState_%s"  # 祝福瓶已领取记录,参数(瓶子编号),按记录索引二进制位存储是否已领取
+
+#节日游历活动
+Def_PDict_FeastTravelID = "FeastTravelID"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值
+Def_PDict_FeastTravelPoint = "FeastTravelPoint" # 当前总游历点数
+Def_PDict_FeastTravelValue = "FeastTravelValue_%s" # 游历任务总进度值,参数(任务ID)
+Def_PDict_FeastTravelCount = "FeastTravelCount_%s" # 游历任务已完成次数,参数(任务ID)
+Def_PDict_FeastTravelAwardCount = "FeastTravelAwardCount_%s" # 游历已领奖次数,参数(奖励索引)
 #-------------------------------------------------------------------------------
 
 #开服活动,Def_PDictType_OpenServerCampaign
@@ -5373,7 +5380,8 @@
 Def_RewardType_GoodGame, #游戏好评奖励35
 Def_RewardType_CACTGBillboardDabiao, #跨服充值排行活动达标奖励36
 Def_RewardType_FeastLogin, #节日登录奖励37
-)= range(38)
+Def_RewardType_FeastTravel, #节日游历奖励38
+)= range(39)
 
 
 #boss复活相关活动定义
@@ -5416,6 +5424,28 @@
 Def_PPAct_FairyDomain,  #缥缈仙域 16  
 ) = range(1, 16+1)
 
+#节日游历活动任务定义
+FeastTravelTaskIDList = (
+Def_FeastTravel_1,
+Def_FeastTravel_Treasure,  #极品寻宝 2
+Def_FeastTravel_RuneTreasure,  #符印寻宝 3
+Def_FeastTravel_4,
+Def_FeastTravel_XJMJ,  #仙界秘境 5
+Def_FeastTravel_6,
+Def_FeastTravel_WorldBoss,  #世界BOSS 7
+Def_FeastTravel_FMT,  #封魔坛 8
+Def_FeastTravel_FamilyParty,  #仙盟宴会 9
+Def_FeastTravel_10,
+Def_FeastTravel_Pray,  #祈愿 11
+Def_FeastTravel_BossHome,  #boss之家 12
+Def_FeastTravel_VIPBoss,  #vipBOSS 13
+Def_FeastTravel_RunFamilyTask, #仙盟任务 14
+Def_FeastTravel_FamilyBoss,  #仙盟Boss 15
+Def_FeastTravel_FairyDomain,  #缥缈仙域 16
+Def_FeastTravel_UseGold,  #累计消费X仙玉 17
+Def_FeastTravel_CTGExp,  #累计充值X仙玉,直接使用充值转化的经验 18
+) = range(1, 1 + 18)
+
 #周狂欢活动定义(七天巡礼)
 WeekPartyActIDList = (
 Def_WPAct_RunTask, #仙盟任务 1
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index edf4da4..7ce2e59 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -27426,6 +27426,453 @@
 
 
 #------------------------------------------------------
+# AA 46 节日游历活动信息 #tagMCFeastTravelInfo
+
+class  tagMCFeastTravelAwardItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", 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.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelAwardItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 46 节日游历活动信息 //tagMCFeastTravelInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelAward(Structure):
+    AwardIndex = 0    #(BYTE AwardIndex)//游历奖励索引
+    NeedTravelPoint = 0    #(WORD NeedTravelPoint)//单次领奖所需游历值
+    AwardCountMax = 0    #(BYTE AwardCountMax)//最大可领取次数,0代表不限
+    AwardItemCount = 0    #(BYTE AwardItemCount)//奖励物品数
+    AwardItemList = list()    #(vector<tagMCFeastTravelAwardItem> AwardItemList)//奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.AwardIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedTravelPoint,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.AwardCountMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.AwardItemCount):
+            temAwardItemList = tagMCFeastTravelAwardItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.AwardIndex = 0
+        self.NeedTravelPoint = 0
+        self.AwardCountMax = 0
+        self.AwardItemCount = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 2
+        length += 1
+        length += 1
+        for i in range(self.AwardItemCount):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.AwardIndex)
+        data = CommFunc.WriteWORD(data, self.NeedTravelPoint)
+        data = CommFunc.WriteBYTE(data, self.AwardCountMax)
+        data = CommFunc.WriteBYTE(data, self.AwardItemCount)
+        for i in range(self.AwardItemCount):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                AwardIndex:%d,
+                                NeedTravelPoint:%d,
+                                AwardCountMax:%d,
+                                AwardItemCount:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.AwardIndex,
+                                self.NeedTravelPoint,
+                                self.AwardCountMax,
+                                self.AwardItemCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelTask(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("TravelTaskID", c_ubyte),    #游历任务ID
+                  ("FinishNeedValue", c_ushort),    #单次完成所需进度
+                  ("FinishTimeMax", c_ubyte),    #最大可完成次数,0代表不限
+                  ("AddTravelPoint", 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.TravelTaskID = 0
+        self.FinishNeedValue = 0
+        self.FinishTimeMax = 0
+        self.AddTravelPoint = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelTask)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 46 节日游历活动信息 //tagMCFeastTravelInfo:
+                                TravelTaskID:%d,
+                                FinishNeedValue:%d,
+                                FinishTimeMax:%d,
+                                AddTravelPoint:%d
+                                '''\
+                                %(
+                                self.TravelTaskID,
+                                self.FinishNeedValue,
+                                self.FinishTimeMax,
+                                self.AddTravelPoint
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelInfo(Structure):
+    Head = tagHead()
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
+    TravelTaskCount = 0    #(BYTE TravelTaskCount)// 游历任务数
+    TravelTaskList = list()    #(vector<tagMCFeastTravelTask> TravelTaskList)//游历任务信息列表
+    TravelAwardCount = 0    #(BYTE TravelAwardCount)// 游历奖励数
+    TravelAwardList = list()    #(vector<tagMCFeastTravelAward> TravelAwardList)//游历奖励信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x46
+        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.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TravelTaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelTaskCount):
+            temTravelTaskList = tagMCFeastTravelTask()
+            _pos = temTravelTaskList.ReadData(_lpData, _pos)
+            self.TravelTaskList.append(temTravelTaskList)
+        self.TravelAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelAwardCount):
+            temTravelAwardList = tagMCFeastTravelAward()
+            _pos = temTravelAwardList.ReadData(_lpData, _pos)
+            self.TravelAwardList.append(temTravelAwardList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x46
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.ResetType = 0
+        self.TravelTaskCount = 0
+        self.TravelTaskList = list()
+        self.TravelAwardCount = 0
+        self.TravelAwardList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 10
+        length += 10
+        length += 1
+        length += 1
+        for i in range(self.TravelTaskCount):
+            length += self.TravelTaskList[i].GetLength()
+        length += 1
+        for i in range(self.TravelAwardCount):
+            length += self.TravelAwardList[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.ResetType)
+        data = CommFunc.WriteBYTE(data, self.TravelTaskCount)
+        for i in range(self.TravelTaskCount):
+            data = CommFunc.WriteString(data, self.TravelTaskList[i].GetLength(), self.TravelTaskList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.TravelAwardCount)
+        for i in range(self.TravelAwardCount):
+            data = CommFunc.WriteString(data, self.TravelAwardList[i].GetLength(), self.TravelAwardList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                ResetType:%d,
+                                TravelTaskCount:%d,
+                                TravelTaskList:%s,
+                                TravelAwardCount:%d,
+                                TravelAwardList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.StartDate,
+                                self.EndtDate,
+                                self.ResetType,
+                                self.TravelTaskCount,
+                                "...",
+                                self.TravelAwardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFeastTravelInfo=tagMCFeastTravelInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFeastTravelInfo.Head.Cmd,m_NAtagMCFeastTravelInfo.Head.SubCmd))] = m_NAtagMCFeastTravelInfo
+
+
+#------------------------------------------------------
+# AA 47 节日游历活动玩家信息 #tagMCFeastTravelPlayerInfo
+
+class  tagMCFeastTravelPlayerAward(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("AwardIndex", c_ubyte),    #游历奖励索引
+                  ("GetAwardCount", c_ubyte),    #已领取次数;前端判断是否可领取: 总游历值 >=  (已领取次数 + 1)  * 单次所需游历值
+                  ]
+
+    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.AwardIndex = 0
+        self.GetAwardCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelPlayerAward)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 47 节日游历活动玩家信息 //tagMCFeastTravelPlayerInfo:
+                                AwardIndex:%d,
+                                GetAwardCount:%d
+                                '''\
+                                %(
+                                self.AwardIndex,
+                                self.GetAwardCount
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelPlayerTask(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("TravelTaskID", c_ubyte),    #游历任务ID
+                  ("TravelValue", c_int),    #当前进度值,一直累加
+                  ("FinishCount", c_ubyte),    #当前已完成次数; 前端计算未完成次数的进度值=max(0, 当前进度值 - (完成次数 * 单次所需进度))
+                  ]
+
+    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.TravelTaskID = 0
+        self.TravelValue = 0
+        self.FinishCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFeastTravelPlayerTask)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 47 节日游历活动玩家信息 //tagMCFeastTravelPlayerInfo:
+                                TravelTaskID:%d,
+                                TravelValue:%d,
+                                FinishCount:%d
+                                '''\
+                                %(
+                                self.TravelTaskID,
+                                self.TravelValue,
+                                self.FinishCount
+                                )
+        return DumpString
+
+
+class  tagMCFeastTravelPlayerInfo(Structure):
+    Head = tagHead()
+    TravelPoint = 0    #(DWORD TravelPoint)//当前总游历值,一直累加,不会扣的
+    TravelPlayerTaskCount = 0    #(BYTE TravelPlayerTaskCount)// 游历任务数,不一定有同步,有同步数据则替换即可
+    TravelPlayerTaskList = list()    #(vector<tagMCFeastTravelPlayerTask> TravelPlayerTaskList)//游历任务信息列表
+    TravelPlayerAwardCount = 0    #(BYTE TravelPlayerAwardCount)// 游历奖励数,不一定有同步,有同步数据则替换即可
+    TravelPlayerAwardList = list()    #(vector<tagMCFeastTravelPlayerAward> TravelPlayerAwardList)//游历奖励信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x47
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.TravelPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TravelPlayerTaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelPlayerTaskCount):
+            temTravelPlayerTaskList = tagMCFeastTravelPlayerTask()
+            _pos = temTravelPlayerTaskList.ReadData(_lpData, _pos)
+            self.TravelPlayerTaskList.append(temTravelPlayerTaskList)
+        self.TravelPlayerAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TravelPlayerAwardCount):
+            temTravelPlayerAwardList = tagMCFeastTravelPlayerAward()
+            _pos = temTravelPlayerAwardList.ReadData(_lpData, _pos)
+            self.TravelPlayerAwardList.append(temTravelPlayerAwardList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x47
+        self.TravelPoint = 0
+        self.TravelPlayerTaskCount = 0
+        self.TravelPlayerTaskList = list()
+        self.TravelPlayerAwardCount = 0
+        self.TravelPlayerAwardList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.TravelPlayerTaskCount):
+            length += self.TravelPlayerTaskList[i].GetLength()
+        length += 1
+        for i in range(self.TravelPlayerAwardCount):
+            length += self.TravelPlayerAwardList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.TravelPoint)
+        data = CommFunc.WriteBYTE(data, self.TravelPlayerTaskCount)
+        for i in range(self.TravelPlayerTaskCount):
+            data = CommFunc.WriteString(data, self.TravelPlayerTaskList[i].GetLength(), self.TravelPlayerTaskList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.TravelPlayerAwardCount)
+        for i in range(self.TravelPlayerAwardCount):
+            data = CommFunc.WriteString(data, self.TravelPlayerAwardList[i].GetLength(), self.TravelPlayerAwardList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                TravelPoint:%d,
+                                TravelPlayerTaskCount:%d,
+                                TravelPlayerTaskList:%s,
+                                TravelPlayerAwardCount:%d,
+                                TravelPlayerAwardList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.TravelPoint,
+                                self.TravelPlayerTaskCount,
+                                "...",
+                                self.TravelPlayerAwardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFeastTravelPlayerInfo=tagMCFeastTravelPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFeastTravelPlayerInfo.Head.Cmd,m_NAtagMCFeastTravelPlayerInfo.Head.SubCmd))] = m_NAtagMCFeastTravelPlayerInfo
+
+
+#------------------------------------------------------
 # AA 20 节日巡礼活动信息 #tagMCFeastWeekPartyInfo
 
 class  tagMCFeastWeekPartyItem(Structure):
@@ -28062,6 +28509,7 @@
     Head = tagHead()
     StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
     EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
     WishPoolShowCount = 0    #(BYTE WishPoolShowCount)//祝福池展示物品数
     WishPoolShowItemList = list()    #(vector<DWORD> WishPoolShowItemList)//祝福池展示物品ID列表
     BottleCount = 0    #(BYTE BottleCount)// 祝福瓶个数
@@ -28079,6 +28527,7 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
         self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.WishPoolShowCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.WishPoolShowCount):
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
@@ -28097,6 +28546,7 @@
         self.Head.SubCmd = 0x43
         self.StartDate = ""
         self.EndtDate = ""
+        self.ResetType = 0
         self.WishPoolShowCount = 0
         self.WishPoolShowItemList = list()
         self.BottleCount = 0
@@ -28108,6 +28558,7 @@
         length += self.Head.GetLength()
         length += 10
         length += 10
+        length += 1
         length += 1
         length += 4 * self.WishPoolShowCount
         length += 1
@@ -28121,6 +28572,7 @@
         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.ResetType)
         data = CommFunc.WriteBYTE(data, self.WishPoolShowCount)
         for i in range(self.WishPoolShowCount):
             data = CommFunc.WriteDWORD(data, self.WishPoolShowItemList[i])
@@ -28134,6 +28586,7 @@
                                 Head:%s,
                                 StartDate:%s,
                                 EndtDate:%s,
+                                ResetType:%d,
                                 WishPoolShowCount:%d,
                                 WishPoolShowItemList:%s,
                                 BottleCount:%d,
@@ -28143,6 +28596,7 @@
                                 self.Head.OutputString(),
                                 self.StartDate,
                                 self.EndtDate,
+                                self.ResetType,
                                 self.WishPoolShowCount,
                                 "...",
                                 self.BottleCount,
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py
index a03dbba..8fd96e8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py
@@ -30,6 +30,7 @@
 import PlayerBossReborn
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
+import PlayerFeastTravel
 import PlayerActLogin
 import PlayerWeekParty
 import EventShell
@@ -176,6 +177,7 @@
     PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Pray, 1)
     PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_Pray, 1)
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Pray, 1)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Pray, 1)
     Sync_NotifyDataChange(curPlayer, [buyType])
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
index e769e71..d57bc94 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -57,6 +57,7 @@
 import PlayerNewFairyCeremony
 import Operate_EquipStone
 import OpenServerCampaign
+import PlayerFeastTravel
 import PlayerWeekParty
 import PlayerFairyDomain
 import GameFuncComm
@@ -5143,6 +5144,7 @@
         PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyRunMission, addCnt)
         PlayerFamily.AddFamilyActivity(curPlayer, ShareDefine.FamilyActive_Task, addCnt)
         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_RunTask, addCnt)
+        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RunFamilyTask, addCnt)
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RunFamilyTask, addCnt)
         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RunFamilyTask, addCnt)
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py
new file mode 100644
index 0000000..b902109
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py
@@ -0,0 +1,88 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.FeastTravel
+#
+# @todo:节日游历
+# @author hxp
+# @date 2021-02-01
+# @version 1.0
+#
+# 详细描述: 节日游历
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2021-02-01 15:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import PlayerControl
+import PlayerFeastTravel
+import IpyGameDataPY
+import ChConfig
+
+
+def __Help(curPlayer):
+    GameWorld.DebugAnswer(curPlayer, "重置所有游历: FeastTravel 0")
+    GameWorld.DebugAnswer(curPlayer, "设置游历点值: FeastTravel 游历值")
+    GameWorld.DebugAnswer(curPlayer, "增加游历进度: FeastTravel 任务ID 增加值")
+    return
+
+## GM命令执行入口
+#  @param curPlayer 当前玩家
+#  @param paramList 参数列表 []
+#  @return None
+#  @remarks 函数详细说明.
+def OnExec(curPlayer, paramList):
+    
+    if not paramList:
+        __Help(curPlayer)
+        return
+    
+    if len(paramList) == 1:
+        # 重置
+        if paramList[0] == 0:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, 0)
+            
+            ipyMgr = IpyGameDataPY.IPY_Data()
+            # 重置游历任务相关
+            for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
+                taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
+                taskID = taskIpyData.GetTraveTasklD()
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, 0)
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, 0)
+                
+            # 重置游历奖励
+            for index in xrange(ipyMgr.GetActFeastTravelAwardCount()):
+                awardIpyData = ipyMgr.GetActFeastTravelAwardByIndex(index)
+                recordIndex = awardIpyData.GetRecordIndex()
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % recordIndex, 0)
+                
+            GameWorld.DebugAnswer(curPlayer, "重置OK!")
+            
+            PlayerFeastTravel.Sync_FeastTravelPlayerInfo(curPlayer)
+            
+        # 设置游历值
+        else:
+            travelPoint = paramList[0]
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, travelPoint)
+            GameWorld.DebugAnswer(curPlayer, "设置OK!")
+            PlayerFeastTravel.Sync_FeastTravelPlayerInfo(curPlayer, -1, -1)
+            
+    elif len(paramList) == 2:
+        taskID, addValue = paramList
+        if taskID not in ChConfig.FeastTravelTaskIDList:
+            GameWorld.DebugAnswer(curPlayer, "游历任务ID不存在,请查看节日游历任务表!")
+            return
+        
+        if PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, taskID, addValue):
+            GameWorld.DebugAnswer(curPlayer, "成功!")
+        else:
+            GameWorld.DebugAnswer(curPlayer, "失败!请检查是否已达最大完成次数!")
+            
+    else:
+        __Help(curPlayer)
+        return
+    
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_AllFamilyBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_AllFamilyBoss.py
index e969313..b290819 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_AllFamilyBoss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_AllFamilyBoss.py
@@ -28,6 +28,7 @@
 import NPCCustomRefresh
 import PlayerAuctionHouse
 import ItemControler
+import PlayerFeastTravel
 import PlayerWeekParty
 import PlayerActivity
 import PlayerFairyCeremony
@@ -162,6 +163,7 @@
         PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyBoss1, 1)
         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_FamilyBoss, 1)
         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FamilyBoss, 1)
+        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_FamilyBoss, 1)
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FamilyBoss, 1)
         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FamilyBoss, 1)
         if fbStep == FB_Step_Open:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_BZZD.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_BZZD.py
index f693c7b..48ad529 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_BZZD.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_BZZD.py
@@ -30,6 +30,7 @@
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
 import PlayerActLogin
+import PlayerFeastTravel
 import PlayerWeekParty
 import ItemControler
 import GameFuncComm
@@ -105,6 +106,7 @@
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_XJMJ, 1)
         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_XJMJ, 1)
         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_XJMJ, 1)
+        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_XJMJ, 1)
         PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_XJMJ, 1)
         EventShell.EventRespons_FBEvent(curPlayer, 'passxjmj')
         FBCommon.UpdateFBEnterTick(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
index 27b0dbf..32c453f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
@@ -24,6 +24,7 @@
 import GameWorld
 import PlayerFamily
 import IpyGameDataPY
+import PlayerFeastTravel
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
 import PlayerActLogin
@@ -165,6 +166,7 @@
     EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_FamilyParty, 0, ChConfig.CME_Log_Start)
     PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FamilyParty, 1)
     PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FamilyParty, 1)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_FamilyParty, 1)
     PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_FamilyParty, 1)
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py
index 6104a38..893cc29 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py
@@ -22,6 +22,7 @@
 import PlayerBossReborn
 import PlayerNewFairyCeremony
 import PlayerFairyCeremony
+import PlayerFeastTravel
 import IpyGameDataPY
 import NPCCommon
 import ChConfig
@@ -98,6 +99,7 @@
     PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_VIPBOSS, 1)
     PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, 1)
     PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, 1)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_VIPBoss, 1)
     
     npcCountDict = {bossID:1}
     dropItemMapInfo = [0, 0]
@@ -138,6 +140,7 @@
     PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_VIPBOSS, sweepCnt)
     PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, sweepCnt)
     PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, sweepCnt)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_VIPBoss, sweepCnt)
     
     npcCountDict = {bossID:sweepCnt}
     jsonItemList = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict, curGrade=grade)[0]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SealDemon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SealDemon.py
index ff06a95..0fdffd1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SealDemon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SealDemon.py
@@ -32,6 +32,7 @@
 import PlayerBossReborn
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
+import PlayerFeastTravel
 import PlayerWeekParty
 import PlayerActLogin
 import EventReport
@@ -333,6 +334,7 @@
     PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FMT, addCnt)
     PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FMT, addCnt)
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FMT, addCnt)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_FMT, addCnt)
     PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_FMT, addCnt)
     return prizeItemList
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 2761b28..af7733c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1473,6 +1473,7 @@
                         ("DWORD", "CfgID", 1),
                         ("char", "StartDate", 0),
                         ("char", "EndDate", 0),
+                        ("BYTE", "ResetType", 0),
                         ("dict", "TemplateIDInfo", 0),
                         ),
 
@@ -1492,6 +1493,29 @@
                         ("list", "WishPoolClientItemShow", 0),
                         ("list", "GoodItemIDList", 0),
                         ("char", "WorldNotifyKey", 0),
+                        ),
+
+                "ActFeastTravel":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("BYTE", "ResetType", 0),
+                        ("dict", "TemplateIDInfo", 0),
+                        ),
+
+                "ActFeastTravelTask":(
+                        ("BYTE", "TraveTasklD", 1),
+                        ("WORD", "FinishNeedValue", 0),
+                        ("WORD", "FinishTimeMax", 0),
+                        ("BYTE", "AddTravelPoint", 0),
+                        ),
+
+                "ActFeastTravelAward":(
+                        ("BYTE", "TemplatelD", 1),
+                        ("BYTE", "RecordIndex", 0),
+                        ("WORD", "NeedTravelPoint", 0),
+                        ("BYTE", "AwardCountMax", 0),
+                        ("list", "TravelAwardInfo", 0),
                         ),
 
                 "ZhuXianBoss":(
@@ -4759,12 +4783,14 @@
         self.CfgID = 0
         self.StartDate = ""
         self.EndDate = ""
+        self.ResetType = 0
         self.TemplateIDInfo = {}
         return
         
     def GetCfgID(self): return self.CfgID # 配置ID
     def GetStartDate(self): return self.StartDate # 开启日期
     def GetEndDate(self): return self.EndDate # 结束日期
+    def GetResetType(self): return self.ResetType # 重置类型,0-0点重置;1-5点重置
     def GetTemplateIDInfo(self): return self.TemplateIDInfo # 模板信息 {(世界等级A,B):模板编号, ...}
 
 # 节日祝福瓶模板表
@@ -4804,6 +4830,55 @@
     def GetWishPoolClientItemShow(self): return self.WishPoolClientItemShow # 前端展示物品列表 [物品ID, ...]
     def GetGoodItemIDList(self): return self.GoodItemIDList # 需要广播的物品ID列表 [物品ID, ...]
     def GetWorldNotifyKey(self): return self.WorldNotifyKey # 全服广播key,参数(玩家名, 物品ID, 物品数据, 个数,)
+
+# 节日游历时间表
+class IPY_ActFeastTravel():
+    
+    def __init__(self):
+        self.CfgID = 0
+        self.StartDate = ""
+        self.EndDate = ""
+        self.ResetType = 0
+        self.TemplateIDInfo = {}
+        return
+        
+    def GetCfgID(self): return self.CfgID # 配置ID
+    def GetStartDate(self): return self.StartDate # 开启日期
+    def GetEndDate(self): return self.EndDate # 结束日期
+    def GetResetType(self): return self.ResetType # 重置类型,0-0点重置;1-5点重置
+    def GetTemplateIDInfo(self): return self.TemplateIDInfo # 模板信息 {(世界等级A,B):模板编号, ...}
+
+# 节日游历任务表
+class IPY_ActFeastTravelTask():
+    
+    def __init__(self):
+        self.TraveTasklD = 0
+        self.FinishNeedValue = 0
+        self.FinishTimeMax = 0
+        self.AddTravelPoint = 0
+        return
+        
+    def GetTraveTasklD(self): return self.TraveTasklD # 游历ID
+    def GetFinishNeedValue(self): return self.FinishNeedValue # 完成所需进度值
+    def GetFinishTimeMax(self): return self.FinishTimeMax # 总可完成次数,0不限
+    def GetAddTravelPoint(self): return self.AddTravelPoint # 完成次数获得游历值
+
+# 节日游历奖励表
+class IPY_ActFeastTravelAward():
+    
+    def __init__(self):
+        self.TemplatelD = 0
+        self.RecordIndex = 0
+        self.NeedTravelPoint = 0
+        self.AwardCountMax = 0
+        self.TravelAwardInfo = []
+        return
+        
+    def GetTemplatelD(self): return self.TemplatelD # 奖励模板ID
+    def GetRecordIndex(self): return self.RecordIndex # 奖励记录索引
+    def GetNeedTravelPoint(self): return self.NeedTravelPoint # 领奖所需游历值
+    def GetAwardCountMax(self): return self.AwardCountMax # 可领取次数,0代表不限
+    def GetTravelAwardInfo(self): return self.TravelAwardInfo # 游历奖励 [[物品ID,个数,是否拍品], ...]
 
 # 诛仙BOSS表
 class IPY_ZhuXianBoss():
@@ -5628,6 +5703,12 @@
         self.ipyActFeastWishBottleLen = len(self.ipyActFeastWishBottleCache)
         self.ipyActFeastWishPoolCache = self.__LoadFileData("ActFeastWishPool", IPY_ActFeastWishPool)
         self.ipyActFeastWishPoolLen = len(self.ipyActFeastWishPoolCache)
+        self.ipyActFeastTravelCache = self.__LoadFileData("ActFeastTravel", IPY_ActFeastTravel)
+        self.ipyActFeastTravelLen = len(self.ipyActFeastTravelCache)
+        self.ipyActFeastTravelTaskCache = self.__LoadFileData("ActFeastTravelTask", IPY_ActFeastTravelTask)
+        self.ipyActFeastTravelTaskLen = len(self.ipyActFeastTravelTaskCache)
+        self.ipyActFeastTravelAwardCache = self.__LoadFileData("ActFeastTravelAward", IPY_ActFeastTravelAward)
+        self.ipyActFeastTravelAwardLen = len(self.ipyActFeastTravelAwardCache)
         self.ipyZhuXianBossCache = self.__LoadFileData("ZhuXianBoss", IPY_ZhuXianBoss)
         self.ipyZhuXianBossLen = len(self.ipyZhuXianBossCache)
         self.ipyActFeastWeekPartyCache = self.__LoadFileData("ActFeastWeekParty", IPY_ActFeastWeekParty)
@@ -6146,6 +6227,12 @@
     def GetActFeastWishBottleByIndex(self, index): return self.ipyActFeastWishBottleCache[index]
     def GetActFeastWishPoolCount(self): return self.ipyActFeastWishPoolLen
     def GetActFeastWishPoolByIndex(self, index): return self.ipyActFeastWishPoolCache[index]
+    def GetActFeastTravelCount(self): return self.ipyActFeastTravelLen
+    def GetActFeastTravelByIndex(self, index): return self.ipyActFeastTravelCache[index]
+    def GetActFeastTravelTaskCount(self): return self.ipyActFeastTravelTaskLen
+    def GetActFeastTravelTaskByIndex(self, index): return self.ipyActFeastTravelTaskCache[index]
+    def GetActFeastTravelAwardCount(self): return self.ipyActFeastTravelAwardLen
+    def GetActFeastTravelAwardByIndex(self, index): return self.ipyActFeastTravelAwardCache[index]
     def GetZhuXianBossCount(self): return self.ipyZhuXianBossLen
     def GetZhuXianBossByIndex(self, index): return self.ipyZhuXianBossCache[index]
     def GetActFeastWeekPartyCount(self): return self.ipyActFeastWeekPartyLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 3c16272..4d3d45d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -54,6 +54,7 @@
 import PlayerNewFairyCeremony
 import GameLogic_CrossGrassland
 import PlayerFeastWish
+import PlayerFeastTravel
 import PlayerWeekParty
 import NPCHurtManager
 import PlayerActLogin
@@ -2396,6 +2397,7 @@
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_WorldBOSS, 1)
+        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_WorldBoss, 1)
         PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_WorldBOSS, 1)
 
     if mapID == ChConfig.Def_FBMapID_BossHome:
@@ -2408,6 +2410,7 @@
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_BOSSHome, 1)
+        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_BossHome, 1)
         
     elif mapID == ChConfig.Def_FBMapID_CrossPenglai:
         #跨服蓬莱仙境
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 f15e221..3005231 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -80,6 +80,7 @@
 import PlayerBossReborn
 import PlayerWeekParty
 import PlayerFeastWeekParty
+import PlayerFeastTravel
 import PlayerFeastLogin
 import PlayerFeastWish
 import PlayerActLogin
@@ -703,6 +704,8 @@
     PlayerFeastLogin.OnPlayerLogin(curPlayer)
     # 节日祝福活动
     PlayerFeastWish.OnPlayerLogin(curPlayer)
+    # 节日游历活动
+    PlayerFeastTravel.OnPlayerLogin(curPlayer)
     # 登录奖励活动
     PlayerActLogin.OnLogin(curPlayer)
     # 仙界盛典活动
@@ -5410,6 +5413,9 @@
     # 领取节日登录奖励
     elif rewardType == ChConfig.Def_RewardType_FeastLogin:
         PlayerFeastLogin.GetFeastLoginAward(curPlayer, dataEx)
+    # 领取节日游历奖励
+    elif rewardType == ChConfig.Def_RewardType_FeastTravel:
+        PlayerFeastTravel.GetFeastTravelAward(curPlayer, dataEx)
     # 领取跨服充值排行活动达标奖励
     elif rewardType == ChConfig.Def_RewardType_CACTGBillboardDabiao:
         CrossActCTGBillboard.GetDabiaoAward(curPlayer, dataEx)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
index 270a29c..0d0b93c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -52,6 +52,7 @@
 import CrossActCTGBillboard
 import PlayerActGrowupBuy
 import OpenServerCampaign
+import PlayerFeastTravel
 import PlayerWeekParty
 import PlayerGoldInvest
 import ItemCommon
@@ -434,6 +435,7 @@
     #开服活动
     #OpenServerCampaign.AddOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_Recharge, orderCoin)
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Recharge, addVIPExp)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_CTGExp, addVIPExp)
     #投资
     if ctgIpyData:
         PlayerGoldInvest.InvestByCTG(curPlayer, ctgIpyData.GetRecordID()) 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 009e152..48c9641 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -70,6 +70,7 @@
 import GameLogic_DuJie
 import PyGameData
 import PlayerMagicWeapon
+import PlayerFeastTravel
 import GameLogic_SealDemon
 import GameLogic_ZhuXianBoss
 import GameLogic_CrossDemonKing
@@ -3168,6 +3169,7 @@
     
     # 消费返利
     PlayerCostRebate.AddCostRebateGold(curPlayer, costType, price, infoDict)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_UseGold, price)
     
     # 事件汇报
     #===========================================================================
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 b09564c..b1c5d28 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -83,6 +83,7 @@
 import PlayerBossReborn
 import PlayerWeekParty
 import PlayerFeastWeekParty
+import PlayerFeastTravel
 import PlayerFeastLogin
 import PlayerFeastWish
 import PlayerActLogin
@@ -1391,6 +1392,9 @@
             elif actionName == ShareDefine.OperationActionName_FeastWish:
                 PlayerFeastWish.RefreshFeastWishActionInfo()
                 
+            elif actionName == ShareDefine.OperationActionName_FeastTravel:
+                PlayerFeastTravel.RefreshFeastTravelActionInfo()
+                
             elif actionName == ShareDefine.OperationActionName_FeastWeekParty:
                 PlayerFeastWeekParty.RefreshOperationAction_FeastWeekParty()
                 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
index e78223e..3ca3d38 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
@@ -27,6 +27,7 @@
 import IpyGameDataPY
 import PlayerActivity
 import PlayerWeekParty
+import PlayerFeastTravel
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
 import ItemCommon
@@ -231,6 +232,7 @@
 
     PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_FairyDomain, 1)
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FairyDomain, 1)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_FairyDomain, 1)
     PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FairyDomain, 1)
     PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FairyDomain, 1)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py
new file mode 100644
index 0000000..2124b2f
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py
@@ -0,0 +1,311 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerFeastTravel
+#
+# @todo:节日游历
+# @author hxp
+# @date 2021-02-01
+# @version 1.0
+#
+# 详细描述: 节日游历
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2021-02-01 15:00"""
+#-------------------------------------------------------------------------------
+
+import PyGameData
+import ShareDefine
+import PlayerControl
+import IpyGameDataPY
+import ItemControler
+import ChPyNetSendPack
+import IPY_GameWorld
+import NetPackCommon
+import GameWorld
+import ChConfig
+
+def OnPlayerLogin(curPlayer):
+    isReset = __CheckPlayerFeastTravelAction(curPlayer)
+    if not isReset:
+        actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
+        # 活动中同步活动信息
+        if actInfo.get(ShareDefine.ActKey_State):
+            Sync_FeastTravelActionInfo(curPlayer)
+            Sync_FeastTravelPlayerInfo(curPlayer)
+    return
+
+def RefreshFeastTravelActionInfo():
+    ## 收到GameServer同步的活动信息,刷新活动信息
+    playerManager = GameWorld.GetPlayerManager()
+    for index in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(index)
+        if curPlayer.GetID() == 0:
+            continue
+        __CheckPlayerFeastTravelAction(curPlayer)
+    return
+
+def __CheckPlayerFeastTravelAction(curPlayer):
+    ## 检查玩家活动信息
+    
+    playerID = curPlayer.GetPlayerID()
+    
+    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
+    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
+    state = actInfo.get(ShareDefine.ActKey_State, 0)
+    
+    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelID) # 玩家身上的活动ID
+    # 活动ID 相同的话不处理
+    if actID == playerActID:
+        GameWorld.DebugLog("节日游历活动ID不变,不处理!", curPlayer.GetPlayerID())
+        return
+    GameWorld.DebugLog("节日游历活动重置! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID)
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelID, actID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, 0)
+    
+    if not state:
+        return
+    
+    templateID = __GetTravelTemplateID()
+    
+    ipyMgr = IpyGameDataPY.IPY_Data()
+    # 重置游历任务相关
+    for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
+        taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
+        taskID = taskIpyData.GetTraveTasklD()
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, 0)
+        
+    # 重置游历奖励
+    for index in xrange(ipyMgr.GetActFeastTravelAwardCount()):
+        awardIpyData = ipyMgr.GetActFeastTravelAwardByIndex(index)
+        if templateID != awardIpyData.GetTemplatelD():
+            continue
+        recordIndex = awardIpyData.GetRecordIndex()
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % recordIndex, 0)
+        
+    Sync_FeastTravelActionInfo(curPlayer)
+    Sync_FeastTravelPlayerInfo(curPlayer)
+    return True
+
+def __GetTravelTemplateID():
+    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
+    if not actInfo:
+        return
+    
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravel", cfgID)
+    if not ipyData:
+        return
+    
+    worldLV = actInfo.get(ShareDefine.ActKey_WorldLV)
+    templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0)
+    return templateID
+
+def AddFeastTravelTaskValue(curPlayer, taskID, addValue=1):
+    ## 增加游历任务完成进度
+    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
+    if not actInfo:
+        return
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravelTask", taskID)
+    if not ipyData:
+        return
+    maxFinishCount = ipyData.GetFinishTimeMax()
+    curFinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelCount % taskID)
+    if maxFinishCount and curFinishCount >= maxFinishCount:
+        GameWorld.DebugLog("该游历任务已达到最大完成次数!taskID=%s,curFinishCount=%s" % (taskID, curFinishCount))
+        return
+    curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelValue % taskID)        
+    updValue = curValue + addValue
+    GameWorld.DebugLog("增加游历进度: taskID=%s,curValue=%s,addValue=%s,updValue=%s" % (taskID, curValue, addValue, updValue))
+    
+    if maxFinishCount:
+        maxValue = ipyData.GetFinishNeedValue() * maxFinishCount
+        if updValue > maxValue:
+            updValue = maxValue
+            GameWorld.DebugLog("    修正进度值不超过最大可完成次数的总进度值! maxFinishCount=%s,maxValue=%s,updValue=%s" 
+                               % (maxFinishCount, maxValue, updValue))
+            
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, updValue)
+    updFinishCount = updValue / ipyData.GetFinishNeedValue()
+    GameWorld.DebugLog("    curFinishCount=%s,updFinishCount=%s" % (curFinishCount, updFinishCount))
+    # 增加完成次数
+    if updFinishCount > curFinishCount:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, updFinishCount)
+        addFinishCount = updFinishCount - curFinishCount
+        addTravelPointTotal = addFinishCount * ipyData.GetAddTravelPoint()
+        
+        curTravelPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint)
+        updTravelPoint = curTravelPoint + addTravelPointTotal
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, updTravelPoint)
+        GameWorld.DebugLog("    完成游历: addFinishCount=%s,addTravelPointTotal=%s,curTravelPoint=%s,updTravelPoint=%s" 
+                           % (addFinishCount, addTravelPointTotal, curTravelPoint, updTravelPoint))
+        
+    Sync_FeastTravelPlayerInfo(curPlayer, taskID, -1) # 不通知奖励
+    return True
+
+def GetFeastTravelAward(curPlayer, index):
+    ## 节日游历领奖
+    
+    templateID = __GetTravelTemplateID()
+    if not templateID:
+        return
+    
+    ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID)
+    if not ipyDataList:
+        return
+    
+    findIpyData = None
+    for ipyData in ipyDataList:
+        if index == ipyData.GetRecordIndex():
+            findIpyData = ipyData
+            break
+        
+    if not findIpyData:
+        return
+    
+    getCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelAwardCount % index)
+    getCountMax = findIpyData.GetAwardCountMax()
+    if getCountMax and getCount >= getCountMax:
+        GameWorld.DebugLog("    节日游历领奖已达最大领取次数! templateID=%s,index=%s,getCount=%s >= getCountMax=%s" 
+                           % (templateID, index, getCount, getCountMax))
+        return
+    
+    curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint)
+    singleNeedPoint = findIpyData.GetNeedTravelPoint()
+    canUsePoint = curPoint - getCount * singleNeedPoint
+    if canUsePoint < singleNeedPoint:
+        GameWorld.DebugLog("    节日游历领奖游历值不足! templateID=%s,index=%s,curPoint=%s,getCount=%s,canUsePoint=%s < singleNeedPoint=%s" 
+                           % (templateID, index, curPoint, getCount, canUsePoint, singleNeedPoint))
+        return
+    
+    awardList = findIpyData.GetTravelAwardInfo()
+    if not awardList:
+        return
+    
+    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardList):
+        return
+    
+    updGetCount = getCount + 1
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % index, updGetCount)
+    
+    GameWorld.DebugLog("    节日游历领奖! templateID=%s,index=%s,curPoint=%s,getCount=%s,canUsePoint=%s,singleNeedPoint=%s,updGetCount=%s" 
+                       % (templateID, index, curPoint, getCount, canUsePoint, singleNeedPoint, updGetCount))
+    
+    for itemID, itemCnt, isAuctionItem in awardList:
+        ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isAuctionItem, [IPY_GameWorld.rptItem], event=["FeastTravel", False, {}])
+        
+    Sync_FeastTravelPlayerInfo(curPlayer, -1, index) # 不通知任务
+    return
+
+def Sync_FeastTravelPlayerInfo(curPlayer, taskID=None, awardIndex=None):
+    ## 通知活动玩家信息
+    # @param taskID: None-通知全部;>=0-单个通知;-1-不通知
+    
+    syncTaskIDList = []
+    if taskID == None:
+        ipyMgr = IpyGameDataPY.IPY_Data()
+        for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
+            taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
+            syncTaskIDList.append(taskIpyData.GetTraveTasklD())
+    elif taskID >= 0:
+        syncTaskIDList = [taskID]
+        
+    syncAwardIndexList = []
+    if awardIndex == None:
+        templateID = __GetTravelTemplateID()
+        if templateID:
+            awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID)
+            if awardIpyDataList:
+                syncAwardIndexList = [awardIpyData.GetRecordIndex() for awardIpyData in awardIpyDataList]
+    elif awardIndex >= 0:
+        syncAwardIndexList = [awardIndex]
+        
+    playerPack = ChPyNetSendPack.tagMCFeastTravelPlayerInfo()
+    playerPack.TravelPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint)
+    playerPack.TravelPlayerTaskList = []
+    for taskID in syncTaskIDList:
+        taskInfo = ChPyNetSendPack.tagMCFeastTravelPlayerTask()
+        taskInfo.TravelTaskID = taskID
+        taskInfo.TravelValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelValue % taskID)
+        taskInfo.FinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelCount % taskID)
+        playerPack.TravelPlayerTaskList.append(taskInfo)
+    playerPack.TravelPlayerTaskCount = len(playerPack.TravelPlayerTaskList)
+    
+    playerPack.TravelPlayerAwardList = []
+    for awardIndex in syncAwardIndexList:
+        awardInfo = ChPyNetSendPack.tagMCFeastTravelPlayerAward()
+        awardInfo.AwardIndex = awardIndex
+        awardInfo.GetAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelAwardCount % awardIndex)
+        playerPack.TravelPlayerAwardList.append(awardInfo)
+    playerPack.TravelPlayerAwardCount = len(playerPack.TravelPlayerAwardList)
+    
+    NetPackCommon.SendFakePack(curPlayer, playerPack)
+    return
+
+def Sync_FeastTravelActionInfo(curPlayer):
+    ## 通知活动信息
+    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
+    if not actInfo:
+        return
+    
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravel", cfgID)
+    if not ipyData:
+        return
+    
+    worldLV = actInfo.get(ShareDefine.ActKey_WorldLV)
+    templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0)
+    if not templateID:
+        return
+    
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
+    actPack = ChPyNetSendPack.tagMCFeastTravelInfo()
+    actPack.Clear()
+    actPack.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
+    actPack.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
+    actPack.ResetType = ipyData.GetResetType()
+    
+    actPack.TravelTaskList = []
+    ipyMgr = IpyGameDataPY.IPY_Data()
+    for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
+        taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
+        taskInfo = ChPyNetSendPack.tagMCFeastTravelTask()
+        taskInfo.TravelTaskID = taskIpyData.GetTraveTasklD()
+        taskInfo.FinishNeedValue = taskIpyData.GetFinishNeedValue()
+        taskInfo.FinishTimeMax = taskIpyData.GetFinishTimeMax()
+        taskInfo.AddTravelPoint = taskIpyData.GetAddTravelPoint()
+        actPack.TravelTaskList.append(taskInfo)
+    actPack.TravelTaskCount = len(actPack.TravelTaskList)
+    
+    awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID)
+    actPack.TravelAwardList = []
+    for awardIpyData in awardIpyDataList:
+        awardInfo = ChPyNetSendPack.tagMCFeastTravelAward()
+        awardInfo.AwardIndex = awardIpyData.GetRecordIndex()
+        awardInfo.NeedTravelPoint = awardIpyData.GetNeedTravelPoint()
+        awardInfo.AwardCountMax = awardIpyData.GetAwardCountMax()
+        awardInfo.AwardItemList = []
+        for itemID, itemCount, isAuctionItem in awardIpyData.GetTravelAwardInfo():
+            itemInfo = ChPyNetSendPack.tagMCFeastTravelAwardItem()
+            itemInfo.ItemID = itemID
+            itemInfo.ItemCount = itemCount
+            itemInfo.IsBind = isAuctionItem
+            awardInfo.AwardItemList.append(itemInfo)
+        awardInfo.AwardItemCount = len(awardInfo.AwardItemList)
+        actPack.TravelAwardList.append(awardInfo)
+    actPack.TravelAwardCount = len(actPack.TravelAwardList)
+    
+    NetPackCommon.SendFakePack(curPlayer, actPack)
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastWish.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastWish.py
index 65f4223..465d7ae 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastWish.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastWish.py
@@ -380,6 +380,7 @@
     actPack.Clear()
     actPack.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
     actPack.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
+    actPack.ResetType = ipyData.GetResetType()
     actPack.WishPoolShowItemList = poolIpyData.GetWishPoolClientItemShow() if poolIpyData else []
     actPack.WishPoolShowCount = len(actPack.WishPoolShowItemList)
     actPack.BottleInfoList = []
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
index 890b980..77792bc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
@@ -27,6 +27,7 @@
 import ItemControler
 import NetPackCommon
 import PlayerBossReborn
+import PlayerFeastTravel
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
 import ItemCommon
@@ -331,10 +332,12 @@
     if treasureType == 2:
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount)
         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount)
+        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount)
         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount)
     else:
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount)
         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount)
+        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Treasure, treasureCount)
         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_Treasure, treasureCount)
     # 给物品
     mailItemList = []
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index fa2fc3f..f660a05 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -226,12 +226,13 @@
 OperationActionName_RechargeRebateGold = "ActRechargeRebateGold" # 充值返利仙玉活动(活动结束邮件发放,节日活动)
 OperationActionName_GrowupBuy = "ActGrowupBuy" # 成长必买活动
 OperationActionName_FeastLogin = "ActFeastLogin" # 节日登录活动
-OperationActionName_FeastWish = "ActFeastWish" # 节日祝愿活动
+OperationActionName_FeastWish = "ActFeastWish" # 节日祝福活动
+OperationActionName_FeastTravel = "ActFeastTravel" # 节日游历活动
 #节日活动类型列表 - 该类型无视开服天,日期到了就开启
 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket,
                                 OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
                                 OperationActionName_FeastLogin, OperationActionName_TotalRecharge3,
-                                OperationActionName_FeastWish,
+                                OperationActionName_FeastWish, OperationActionName_FeastTravel,
                                 ]
 #所有的运营活动列表,含节日活动
 OperationActionNameList = [OperationActionName_ExpRate, OperationActionName_CostRebate, 
@@ -254,7 +255,7 @@
                                    OperationActionName_WeekParty,
                                    OperationActionName_CollectWords, OperationActionName_CollectWords2,
                                    OperationActionName_FeastLogin, OperationActionName_TotalRecharge3,
-                                   OperationActionName_FeastWish,
+                                   OperationActionName_FeastWish, OperationActionName_FeastTravel,
                                    ]
 
 #所有的累计充值活动

--
Gitblit v1.8.0