From 3372c42f7017bbe6f8e111197ef64476014e21e6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 25 十一月 2025 17:38:24 +0800
Subject: [PATCH] 358 【内政】红颜系统-服务端(增加游历系统;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTravel.py  |  504 +++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Travel.py   |   56 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py          |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py          |  454 +--------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py      | 1390 ++-----------------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py  |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py   |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                  |   28 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py        |   83 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py      |   53 -
 PySysDB/PySysDBPY.h                                                                         |   31 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py  |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py             |    9 
 14 files changed, 862 insertions(+), 1,765 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index fdf790c..139a4a8 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1003,6 +1003,28 @@
     list		AttrPerStarAddList;	//每星加成值列表
 };
 
+//游历事件表
+
+struct TravelEvent
+{
+	WORD		_EventID;
+    DWORD		EventWeight;	//事件权重
+	DWORD		AwardItemID;	//奖励物品ID
+	DWORD		AwardItemCnt;	//奖励物品数量
+};
+
+//游历景观奖励表
+
+struct TravelScenery
+{
+	BYTE		_SceneryType;	//景观类型
+    BYTE		AwardQuality;	//景观品质
+	DWORD		UpRate;	//升下个品质概率
+	list		AwardItemRandCntList;	//奖励物品随机个数列表 [[物品ID, 随机数量A, 到B], ...]
+	list		AwardItemExWeightList;	//额外奖励物品权重 [[权重,物品ID,个数], ...]
+    BYTE		AwardItemExCnt;	//额外奖励物品数
+};
+
 //玩家等级表
 
 struct PlayerLV
@@ -2703,15 +2725,6 @@
 	DWORD		NeedExp;	//升级需要经验
 	dict		AttrInfo;	//属性
 	BYTE		SkinIndex;	//外观
-};
-
-//协助感谢礼盒表
-
-struct tagAssistThanksGift
-{
-	DWORD		_GiftID;	//礼盒物品ID
-	list		RequestPlayerAward;	// 发布奖励物品 物品ID|个数
-	list		AssistPlayerAward;	// 协助奖励物品 物品ID|个数
 };
 
 //功能特权奖励表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 0b0154c..54f27c9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -394,13 +394,13 @@
 PacketSubCMD_3=0x11
 PacketCallFunc_3=OnQueryBossHurtList
 
-PacketCMD_4=0xB0
-PacketSubCMD_4=0x24
-PacketCallFunc_4=ReceiveFamilyArrestAward
+PacketCMD_4=
+PacketSubCMD_4=
+PacketCallFunc_4=
 
-PacketCMD_5=0xB0
-PacketSubCMD_5=0x26
-PacketCallFunc_5=QueryFamilyArrestAwardReceiveState
+PacketCMD_5=
+PacketSubCMD_5=
+PacketCallFunc_5=
 
 PacketCMD_6=0xB4
 PacketSubCMD_6=0x0B
@@ -1152,6 +1152,22 @@
 PacketSubCMD_3=0x21
 PacketCallFunc_3=OnBeautySkinOP
 
+;游历
+[PlayerTravel]
+ScriptName = Player\PlayerTravel.py
+Writer = hxp
+Releaser = hxp
+RegType = 0
+RegisterPackCount = 2
+
+PacketCMD_1=0xB0
+PacketSubCMD_1=0x40
+PacketCallFunc_1=OnTravelClick
+
+PacketCMD_2=0xB0
+PacketSubCMD_2=0x41
+PacketCallFunc_2=OnTravelSceneryUP
+
 ;主线战斗
 [GameLogic_MainLevel]
 ScriptName = GameWorldLogic\FBProcess\GameLogic_MainLevel.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 6084922..a04cbe8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3518,6 +3518,15 @@
 Def_PDict_BeautyAwardLV = "BeautyAwardLV_%s"  # 红颜已领取到的奖励等级,参数(红颜ID)
 Def_PDict_BeautySkinInfo = "BeautySkinInfo_%s"  # 红颜时装信息,参数(时装ID) 星级*100+是否使用+是否已激活
 
+#游历
+Def_PDict_TravelEnergy = "TravelEnergy"  # 剩余体力
+Def_PDict_TravelEnergyTime = "TravelEnergyTime"  # 上次恢复体力时间戳
+Def_PDict_TravelCnt = "TravelCnt"  # 累计游历次数
+Def_PDict_TravelScenery = "TravelScenery"  # 景观信息,景观左上角所在格子索引 * 10 + 景观类型
+Def_PDict_TravelSceneryLVInfo = "TravelSceneryLVInfo"  # 景观等级信息,个位数-第1次升级成功与否,1-成功,2-失败;十位-第2次 ...
+Def_PDict_TravelGridInfo = "TravelGridInfo_%s_%s"  # 格子信息,参数(行, 列) 事件ID*100+是否双倍*10+开启状态
+Def_PDict_TravelState = "TravelState"  # 本盘游历记录,1-已领取景观奖励
+
 #周狂欢
 Def_PDict_WeekPartyActID = "WeekPartyActID"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值
 Def_PDict_WeekPartyID = "WeekPartyID"  # 玩家身上的活动ID,配置ID,用于补发上次活动用
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 3874002..470ff06 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -10601,115 +10601,6 @@
 
 
 #------------------------------------------------------
-# B0 13 取消协助Boss #tagCGCancelAssistBoss
-
-class  tagCGCancelAssistBoss(Structure):
-    Head = tagHead()
-    AssistGUID = ""    #(char AssistGUID[40])//协助GUID
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x13
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.AssistGUID,_pos = CommFunc.ReadString(_lpData, _pos,40)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x13
-        self.AssistGUID = ""
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 40
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteString(data, 40, self.AssistGUID)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                AssistGUID:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.AssistGUID
-                                )
-        return DumpString
-
-
-m_NAtagCGCancelAssistBoss=tagCGCancelAssistBoss()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGCancelAssistBoss.Head.Cmd,m_NAtagCGCancelAssistBoss.Head.SubCmd))] = m_NAtagCGCancelAssistBoss
-
-
-#------------------------------------------------------
-# B0 15 接收协助感谢礼物 #tagCGGetAssistThanksGift
-
-class  tagCGGetAssistThanksGift(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("IsPreview", c_ubyte),    #是否预览,非预览即确认领取,无额外奖励确认时也需要回复领取包代表已读
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x15
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x15
-        self.IsPreview = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCGGetAssistThanksGift)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// B0 15 接收协助感谢礼物 //tagCGGetAssistThanksGift:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                IsPreview:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.IsPreview
-                                )
-        return DumpString
-
-
-m_NAtagCGGetAssistThanksGift=tagCGGetAssistThanksGift()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGGetAssistThanksGift.Cmd,m_NAtagCGGetAssistThanksGift.SubCmd))] = m_NAtagCGGetAssistThanksGift
-
-
-#------------------------------------------------------
 # B0 39 自动淘金免费使用 #tagCSGoldRushAutoFreeUse
 
 class  tagCSGoldRushAutoFreeUse(Structure):
@@ -10930,19 +10821,21 @@
 
 
 #------------------------------------------------------
-#B0 26 请求家族悬赏奖励领取情况 #tagQueryFamilyArrestAwardReceiveState
+# B0 40 游历点击 #tagCSTravelClick
 
-class  tagQueryFamilyArrestAwardReceiveState(Structure):
+class  tagCSTravelClick(Structure):
     _pack_ = 1
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
+                  ("Row", c_ubyte),    #行,从1开始
+                  ("Col", c_ubyte),    #列,从1开始
                   ]
 
     def __init__(self):
         self.Clear()
         self.Cmd = 0xB0
-        self.SubCmd = 0x26
+        self.SubCmd = 0x40
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -10952,17 +10845,71 @@
 
     def Clear(self):
         self.Cmd = 0xB0
-        self.SubCmd = 0x26
+        self.SubCmd = 0x40
+        self.Row = 0
+        self.Col = 0
         return
 
     def GetLength(self):
-        return sizeof(tagQueryFamilyArrestAwardReceiveState)
+        return sizeof(tagCSTravelClick)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''//B0 26 请求家族悬赏奖励领取情况 //tagQueryFamilyArrestAwardReceiveState:
+        DumpString = '''// B0 40 游历点击 //tagCSTravelClick:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                Row:%d,
+                                Col:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.Row,
+                                self.Col
+                                )
+        return DumpString
+
+
+m_NAtagCSTravelClick=tagCSTravelClick()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSTravelClick.Cmd,m_NAtagCSTravelClick.SubCmd))] = m_NAtagCSTravelClick
+
+
+#------------------------------------------------------
+# B0 41 游历景观升级 #tagCSTravelSceneryUP
+
+class  tagCSTravelSceneryUP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB0
+        self.SubCmd = 0x41
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB0
+        self.SubCmd = 0x41
+        return
+
+    def GetLength(self):
+        return sizeof(tagCSTravelSceneryUP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B0 41 游历景观升级 //tagCSTravelSceneryUP:
                                 Cmd:%s,
                                 SubCmd:%s
                                 '''\
@@ -10973,221 +10920,8 @@
         return DumpString
 
 
-m_NAtagQueryFamilyArrestAwardReceiveState=tagQueryFamilyArrestAwardReceiveState()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagQueryFamilyArrestAwardReceiveState.Cmd,m_NAtagQueryFamilyArrestAwardReceiveState.SubCmd))] = m_NAtagQueryFamilyArrestAwardReceiveState
-
-
-#------------------------------------------------------
-#B0 25 请求家族悬赏任务完成情况 #tagQueryFamilyArrestOverState
-
-class  tagQueryFamilyArrestOverState(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x25
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x25
-        return
-
-    def GetLength(self):
-        return sizeof(tagQueryFamilyArrestOverState)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''//B0 25 请求家族悬赏任务完成情况 //tagQueryFamilyArrestOverState:
-                                Cmd:%s,
-                                SubCmd:%s
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd
-                                )
-        return DumpString
-
-
-m_NAtagQueryFamilyArrestOverState=tagQueryFamilyArrestOverState()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagQueryFamilyArrestOverState.Cmd,m_NAtagQueryFamilyArrestOverState.SubCmd))] = m_NAtagQueryFamilyArrestOverState
-
-
-#------------------------------------------------------
-#B0 24 领取家族悬赏奖励 #tagReceiveFamilyArrestAward
-
-class  tagReceiveFamilyArrestAward(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ArrestID", c_int),    #悬赏任务ID
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x24
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x24
-        self.ArrestID = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagReceiveFamilyArrestAward)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''//B0 24 领取家族悬赏奖励 //tagReceiveFamilyArrestAward:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                ArrestID:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.ArrestID
-                                )
-        return DumpString
-
-
-m_NAtagReceiveFamilyArrestAward=tagReceiveFamilyArrestAward()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagReceiveFamilyArrestAward.Cmd,m_NAtagReceiveFamilyArrestAward.SubCmd))] = m_NAtagReceiveFamilyArrestAward
-
-
-#------------------------------------------------------
-# B0 12 开始协助Boss #tagCGStartAssistBoss
-
-class  tagCGStartAssistBoss(Structure):
-    Head = tagHead()
-    AssistGUID = ""    #(char AssistGUID[40])//协助GUID
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x12
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.AssistGUID,_pos = CommFunc.ReadString(_lpData, _pos,40)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x12
-        self.AssistGUID = ""
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 40
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteString(data, 40, self.AssistGUID)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                AssistGUID:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.AssistGUID
-                                )
-        return DumpString
-
-
-m_NAtagCGStartAssistBoss=tagCGStartAssistBoss()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGStartAssistBoss.Head.Cmd,m_NAtagCGStartAssistBoss.Head.SubCmd))] = m_NAtagCGStartAssistBoss
-
-
-#------------------------------------------------------
-# B0 14 使用协助感谢礼盒 #tagCGUseAssistThanksGift
-
-class  tagCGUseAssistThanksGift(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ItemID", c_int),    
-                  ("IsPreview", c_ubyte),    #是否预览,非预览即确认使用
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x14
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x14
-        self.ItemID = 0
-        self.IsPreview = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCGUseAssistThanksGift)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// B0 14 使用协助感谢礼盒 //tagCGUseAssistThanksGift:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                ItemID:%d,
-                                IsPreview:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.ItemID,
-                                self.IsPreview
-                                )
-        return DumpString
-
-
-m_NAtagCGUseAssistThanksGift=tagCGUseAssistThanksGift()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGUseAssistThanksGift.Cmd,m_NAtagCGUseAssistThanksGift.SubCmd))] = m_NAtagCGUseAssistThanksGift
+m_NAtagCSTravelSceneryUP=tagCSTravelSceneryUP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSTravelSceneryUP.Cmd,m_NAtagCSTravelSceneryUP.SubCmd))] = m_NAtagCSTravelSceneryUP
 
 
 #------------------------------------------------------
@@ -11260,66 +10994,6 @@
 
 m_NAtagCMWorldTransfer=tagCMWorldTransfer()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMWorldTransfer.Cmd,m_NAtagCMWorldTransfer.SubCmd))] = m_NAtagCMWorldTransfer
-
-
-#------------------------------------------------------
-# B0 20 请求膜拜玩家 #tagCGWorship
-
-class  tagCGWorship(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("PlayerID", c_int),    # 目标玩家ID
-                  ("WorshipType", c_ubyte),    # 膜拜类型
-                  ("WorshipValue", c_int),    # 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x20
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x20
-        self.PlayerID = 0
-        self.WorshipType = 0
-        self.WorshipValue = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCGWorship)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// B0 20 请求膜拜玩家 //tagCGWorship:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                PlayerID:%d,
-                                WorshipType:%d,
-                                WorshipValue:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.PlayerID,
-                                self.WorshipType,
-                                self.WorshipValue
-                                )
-        return DumpString
-
-
-m_NAtagCGWorship=tagCGWorship()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGWorship.Cmd,m_NAtagCGWorship.SubCmd))] = m_NAtagCGWorship
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 32086a3..8841653 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -30193,896 +30193,6 @@
 
 
 #------------------------------------------------------
-# B0 27 活跃放置信息 #tagMCActivityPlaceInfo
-
-class  tagMCActivityPlaceInfo(Structure):
-    Head = tagHead()
-    StartTime = 0    #(DWORD StartTime)// 开始探索time时间戳,完成一次探索会自动下一次探索并更新该时间
-    PlaceCount = 0    #(BYTE PlaceCount)// 剩余未完成探索次数
-    RewardCount = 0    #(BYTE RewardCount)// 累计未领取探索奖励次数
-    RewardLen = 0    #(BYTE RewardLen)
-    RewardInfo = ""    #(String RewardInfo)//累计未领取探索奖励 [[itemID, count], ...]
-    TodayExp = 0    #(DWORD TodayExp)
-    TodayExpPoint = 0    #(DWORD TodayExpPoint)
-    YestordayExp = 0    #(DWORD YestordayExp)
-    YestordayExpPoint = 0    #(DWORD YestordayExpPoint)
-    TotalCount = 0    #(DWORD TotalCount)// 累计活跃放置次数
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x27
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.StartTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PlaceCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.RewardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.RewardLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.RewardInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.RewardLen)
-        self.TodayExp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.TodayExpPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.YestordayExp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.YestordayExpPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.TotalCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x27
-        self.StartTime = 0
-        self.PlaceCount = 0
-        self.RewardCount = 0
-        self.RewardLen = 0
-        self.RewardInfo = ""
-        self.TodayExp = 0
-        self.TodayExpPoint = 0
-        self.YestordayExp = 0
-        self.YestordayExpPoint = 0
-        self.TotalCount = 0
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 4
-        length += 1
-        length += 1
-        length += 1
-        length += len(self.RewardInfo)
-        length += 4
-        length += 4
-        length += 4
-        length += 4
-        length += 4
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteDWORD(data, self.StartTime)
-        data = CommFunc.WriteBYTE(data, self.PlaceCount)
-        data = CommFunc.WriteBYTE(data, self.RewardCount)
-        data = CommFunc.WriteBYTE(data, self.RewardLen)
-        data = CommFunc.WriteString(data, self.RewardLen, self.RewardInfo)
-        data = CommFunc.WriteDWORD(data, self.TodayExp)
-        data = CommFunc.WriteDWORD(data, self.TodayExpPoint)
-        data = CommFunc.WriteDWORD(data, self.YestordayExp)
-        data = CommFunc.WriteDWORD(data, self.YestordayExpPoint)
-        data = CommFunc.WriteDWORD(data, self.TotalCount)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                StartTime:%d,
-                                PlaceCount:%d,
-                                RewardCount:%d,
-                                RewardLen:%d,
-                                RewardInfo:%s,
-                                TodayExp:%d,
-                                TodayExpPoint:%d,
-                                YestordayExp:%d,
-                                YestordayExpPoint:%d,
-                                TotalCount:%d
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.StartTime,
-                                self.PlaceCount,
-                                self.RewardCount,
-                                self.RewardLen,
-                                self.RewardInfo,
-                                self.TodayExp,
-                                self.TodayExpPoint,
-                                self.YestordayExp,
-                                self.YestordayExpPoint,
-                                self.TotalCount
-                                )
-        return DumpString
-
-
-m_NAtagMCActivityPlaceInfo=tagMCActivityPlaceInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActivityPlaceInfo.Head.Cmd,m_NAtagMCActivityPlaceInfo.Head.SubCmd))] = m_NAtagMCActivityPlaceInfo
-
-
-#------------------------------------------------------
-# B0 01 新增协助 #tagGCAssistInfoList
-
-class  tagGCAssistInfo(Structure):
-    AssistGUID = ""    #(char AssistGUID[40])//协助GUID
-    PlayerID = 0    #(DWORD PlayerID)
-    PlayerName = ""    #(char PlayerName[33])
-    Job = 0    #(BYTE Job)
-    LV = 0    #(WORD LV)//等级
-    RealmLV = 0    #(BYTE RealmLV)//境界
-    Face = 0    #(DWORD Face)//基本脸型
-    FacePic = 0    #(DWORD FacePic)//头像框
-    MapID = 0    #(DWORD MapID)
-    LineID = 0    #(DWORD LineID)
-    NPCID = 0    #(DWORD NPCID)
-    ExDataLen = 0    #(WORD ExDataLen)
-    ExData = ""    #(String ExData)//其他自定义数据
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        self.AssistGUID,_pos = CommFunc.ReadString(_lpData, _pos,40)
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
-        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.LineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.NPCID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.ExDataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.ExData,_pos = CommFunc.ReadString(_lpData, _pos,self.ExDataLen)
-        return _pos
-
-    def Clear(self):
-        self.AssistGUID = ""
-        self.PlayerID = 0
-        self.PlayerName = ""
-        self.Job = 0
-        self.LV = 0
-        self.RealmLV = 0
-        self.Face = 0
-        self.FacePic = 0
-        self.MapID = 0
-        self.LineID = 0
-        self.NPCID = 0
-        self.ExDataLen = 0
-        self.ExData = ""
-        return
-
-    def GetLength(self):
-        length = 0
-        length += 40
-        length += 4
-        length += 33
-        length += 1
-        length += 2
-        length += 1
-        length += 4
-        length += 4
-        length += 4
-        length += 4
-        length += 4
-        length += 2
-        length += len(self.ExData)
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, 40, self.AssistGUID)
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
-        data = CommFunc.WriteString(data, 33, self.PlayerName)
-        data = CommFunc.WriteBYTE(data, self.Job)
-        data = CommFunc.WriteWORD(data, self.LV)
-        data = CommFunc.WriteBYTE(data, self.RealmLV)
-        data = CommFunc.WriteDWORD(data, self.Face)
-        data = CommFunc.WriteDWORD(data, self.FacePic)
-        data = CommFunc.WriteDWORD(data, self.MapID)
-        data = CommFunc.WriteDWORD(data, self.LineID)
-        data = CommFunc.WriteDWORD(data, self.NPCID)
-        data = CommFunc.WriteWORD(data, self.ExDataLen)
-        data = CommFunc.WriteString(data, self.ExDataLen, self.ExData)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                AssistGUID:%s,
-                                PlayerID:%d,
-                                PlayerName:%s,
-                                Job:%d,
-                                LV:%d,
-                                RealmLV:%d,
-                                Face:%d,
-                                FacePic:%d,
-                                MapID:%d,
-                                LineID:%d,
-                                NPCID:%d,
-                                ExDataLen:%d,
-                                ExData:%s
-                                '''\
-                                %(
-                                self.AssistGUID,
-                                self.PlayerID,
-                                self.PlayerName,
-                                self.Job,
-                                self.LV,
-                                self.RealmLV,
-                                self.Face,
-                                self.FacePic,
-                                self.MapID,
-                                self.LineID,
-                                self.NPCID,
-                                self.ExDataLen,
-                                self.ExData
-                                )
-        return DumpString
-
-
-class  tagGCAssistInfoList(Structure):
-    Head = tagHead()
-    Count = 0    #(BYTE Count)
-    AssistInfoList = list()    #(vector<tagGCAssistInfo> AssistInfoList)
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x01
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.Count):
-            temAssistInfoList = tagGCAssistInfo()
-            _pos = temAssistInfoList.ReadData(_lpData, _pos)
-            self.AssistInfoList.append(temAssistInfoList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x01
-        self.Count = 0
-        self.AssistInfoList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 1
-        for i in range(self.Count):
-            length += self.AssistInfoList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.Count)
-        for i in range(self.Count):
-            data = CommFunc.WriteString(data, self.AssistInfoList[i].GetLength(), self.AssistInfoList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                Count:%d,
-                                AssistInfoList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.Count,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagGCAssistInfoList=tagGCAssistInfoList()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCAssistInfoList.Head.Cmd,m_NAtagGCAssistInfoList.Head.SubCmd))] = m_NAtagGCAssistInfoList
-
-
-#------------------------------------------------------
-# B0 03 正在进行中的协助 #tagGCAssistingInfo
-
-class  tagGCAssistingInfo(Structure):
-    Head = tagHead()
-    AssistGUID = ""    #(char AssistGUID[40])//协助GUID
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x03
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.AssistGUID,_pos = CommFunc.ReadString(_lpData, _pos,40)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x03
-        self.AssistGUID = ""
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 40
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteString(data, 40, self.AssistGUID)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                AssistGUID:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.AssistGUID
-                                )
-        return DumpString
-
-
-m_NAtagGCAssistingInfo=tagGCAssistingInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCAssistingInfo.Head.Cmd,m_NAtagGCAssistingInfo.Head.SubCmd))] = m_NAtagGCAssistingInfo
-
-
-#------------------------------------------------------
-# B0 08 协助结束 #tagGCAssistOver
-
-class  tagGCAssistOver(Structure):
-    Head = tagHead()
-    IsTagPlayerReason = 0    #(BYTE IsTagPlayerReason)//是否发布方原因
-    ReasonLen = 0    #(BYTE ReasonLen)
-    Reason = ""    #(String Reason)//原因
-    AssistGUID = ""    #(char AssistGUID[40])//协助GUID
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x08
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.IsTagPlayerReason,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.ReasonLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.Reason,_pos = CommFunc.ReadString(_lpData, _pos,self.ReasonLen)
-        self.AssistGUID,_pos = CommFunc.ReadString(_lpData, _pos,40)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x08
-        self.IsTagPlayerReason = 0
-        self.ReasonLen = 0
-        self.Reason = ""
-        self.AssistGUID = ""
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 1
-        length += 1
-        length += len(self.Reason)
-        length += 40
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.IsTagPlayerReason)
-        data = CommFunc.WriteBYTE(data, self.ReasonLen)
-        data = CommFunc.WriteString(data, self.ReasonLen, self.Reason)
-        data = CommFunc.WriteString(data, 40, self.AssistGUID)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                IsTagPlayerReason:%d,
-                                ReasonLen:%d,
-                                Reason:%s,
-                                AssistGUID:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.IsTagPlayerReason,
-                                self.ReasonLen,
-                                self.Reason,
-                                self.AssistGUID
-                                )
-        return DumpString
-
-
-m_NAtagGCAssistOver=tagGCAssistOver()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCAssistOver.Head.Cmd,m_NAtagGCAssistOver.Head.SubCmd))] = m_NAtagGCAssistOver
-
-
-#------------------------------------------------------
-# B0 06 可接收协助感谢礼物个数 #tagGCCanGetAssistThanksGiftCount
-
-class  tagGCCanGetAssistThanksGiftCount(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("CanGetCount", c_ubyte),    
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x06
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x06
-        self.CanGetCount = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagGCCanGetAssistThanksGiftCount)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// B0 06 可接收协助感谢礼物个数 //tagGCCanGetAssistThanksGiftCount:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                CanGetCount:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.CanGetCount
-                                )
-        return DumpString
-
-
-m_NAtagGCCanGetAssistThanksGiftCount=tagGCCanGetAssistThanksGiftCount()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCanGetAssistThanksGiftCount.Cmd,m_NAtagGCCanGetAssistThanksGiftCount.SubCmd))] = m_NAtagGCCanGetAssistThanksGiftCount
-
-
-#------------------------------------------------------
-# B0 02 删除协助 #tagGCClearAssist
-
-class  tagGCClearAssist(Structure):
-    Head = tagHead()
-    AssistGUID = ""    #(char AssistGUID[40])//协助GUID
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x02
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.AssistGUID,_pos = CommFunc.ReadString(_lpData, _pos,40)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x02
-        self.AssistGUID = ""
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 40
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteString(data, 40, self.AssistGUID)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                AssistGUID:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.AssistGUID
-                                )
-        return DumpString
-
-
-m_NAtagGCClearAssist=tagGCClearAssist()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCClearAssist.Head.Cmd,m_NAtagGCClearAssist.Head.SubCmd))] = m_NAtagGCClearAssist
-
-
-#------------------------------------------------------
-#B0 25 家族悬赏任务奖励领取情况 #tagFamilyArrestAwardReceiveState
-
-class  tagFamilyArrestAwardReceiveState(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ReceiveState", c_int),    #悬赏任务奖励领取情况
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x25
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x25
-        self.ReceiveState = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagFamilyArrestAwardReceiveState)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''//B0 25 家族悬赏任务奖励领取情况 //tagFamilyArrestAwardReceiveState:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                ReceiveState:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.ReceiveState
-                                )
-        return DumpString
-
-
-m_NAtagFamilyArrestAwardReceiveState=tagFamilyArrestAwardReceiveState()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagFamilyArrestAwardReceiveState.Cmd,m_NAtagFamilyArrestAwardReceiveState.SubCmd))] = m_NAtagFamilyArrestAwardReceiveState
-
-
-#------------------------------------------------------
-#B0 26 家族悬赏任务完成情况 #tagFamilyArrestOverStateInfo
-
-class  tagFamilyArrestOverState(Structure):
-    ID = 0    #(DWORD ID)//悬赏任务ID
-    NameLen = 0    #(WORD NameLen)//名字长度
-    Name = ""    #(String Name)//size = NameLen
-    OverState = 0    #(DWORD OverState)//任务完成情况
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        self.ID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.NameLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
-        self.OverState,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        return _pos
-
-    def Clear(self):
-        self.ID = 0
-        self.NameLen = 0
-        self.Name = ""
-        self.OverState = 0
-        return
-
-    def GetLength(self):
-        length = 0
-        length += 4
-        length += 2
-        length += len(self.Name)
-        length += 4
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteDWORD(data, self.ID)
-        data = CommFunc.WriteWORD(data, self.NameLen)
-        data = CommFunc.WriteString(data, self.NameLen, self.Name)
-        data = CommFunc.WriteDWORD(data, self.OverState)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                ID:%d,
-                                NameLen:%d,
-                                Name:%s,
-                                OverState:%d
-                                '''\
-                                %(
-                                self.ID,
-                                self.NameLen,
-                                self.Name,
-                                self.OverState
-                                )
-        return DumpString
-
-
-class  tagFamilyArrestOverStateInfo(Structure):
-    Head = tagHead()
-    Count = 0    #(WORD Count)
-    ArrestOverStateInfo = list()    #(vector<tagFamilyArrestOverState> ArrestOverStateInfo)///size = Count	
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x26
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        for i in range(self.Count):
-            temArrestOverStateInfo = tagFamilyArrestOverState()
-            _pos = temArrestOverStateInfo.ReadData(_lpData, _pos)
-            self.ArrestOverStateInfo.append(temArrestOverStateInfo)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x26
-        self.Count = 0
-        self.ArrestOverStateInfo = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 2
-        for i in range(self.Count):
-            length += self.ArrestOverStateInfo[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteWORD(data, self.Count)
-        for i in range(self.Count):
-            data = CommFunc.WriteString(data, self.ArrestOverStateInfo[i].GetLength(), self.ArrestOverStateInfo[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                Count:%d,
-                                ArrestOverStateInfo:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.Count,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagFamilyArrestOverStateInfo=tagFamilyArrestOverStateInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagFamilyArrestOverStateInfo.Head.Cmd,m_NAtagFamilyArrestOverStateInfo.Head.SubCmd))] = m_NAtagFamilyArrestOverStateInfo
-
-
-#------------------------------------------------------
-# B0 05 接收协助感谢礼物预览 #tagGCGetAssistThanksGiftPreview
-
-class  tagGCGetAssistThanksGiftPreview(Structure):
-    Head = tagHead()
-    ItemID = 0    #(DWORD ItemID)//礼盒ID
-    PlayerID = 0    #(DWORD PlayerID)//发起玩家ID
-    PlayerName = ""    #(char PlayerName[33])
-    Job = 0    #(BYTE Job)
-    LV = 0    #(WORD LV)
-    RealmLV = 0    #(BYTE RealmLV)//境界
-    Face = 0    #(DWORD Face)//基本脸型
-    FacePic = 0    #(DWORD FacePic)//头像框
-    MapID = 0    #(DWORD MapID)
-    LineID = 0    #(DWORD LineID)
-    NPCID = 0    #(DWORD NPCID)
-    ExDataLen = 0    #(WORD ExDataLen)
-    ExData = ""    #(String ExData)//其他自定义数据
-    TimeStr = ""    #(char TimeStr[19])//协助时间yyyy-MM-dd hh:mm:ss
-    ExtraAward = 0    #(BYTE ExtraAward)//是否有额外奖励
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x05
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.ItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
-        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.LineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.NPCID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.ExDataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.ExData,_pos = CommFunc.ReadString(_lpData, _pos,self.ExDataLen)
-        self.TimeStr,_pos = CommFunc.ReadString(_lpData, _pos,19)
-        self.ExtraAward,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x05
-        self.ItemID = 0
-        self.PlayerID = 0
-        self.PlayerName = ""
-        self.Job = 0
-        self.LV = 0
-        self.RealmLV = 0
-        self.Face = 0
-        self.FacePic = 0
-        self.MapID = 0
-        self.LineID = 0
-        self.NPCID = 0
-        self.ExDataLen = 0
-        self.ExData = ""
-        self.TimeStr = ""
-        self.ExtraAward = 0
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 4
-        length += 4
-        length += 33
-        length += 1
-        length += 2
-        length += 1
-        length += 4
-        length += 4
-        length += 4
-        length += 4
-        length += 4
-        length += 2
-        length += len(self.ExData)
-        length += 19
-        length += 1
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteDWORD(data, self.ItemID)
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
-        data = CommFunc.WriteString(data, 33, self.PlayerName)
-        data = CommFunc.WriteBYTE(data, self.Job)
-        data = CommFunc.WriteWORD(data, self.LV)
-        data = CommFunc.WriteBYTE(data, self.RealmLV)
-        data = CommFunc.WriteDWORD(data, self.Face)
-        data = CommFunc.WriteDWORD(data, self.FacePic)
-        data = CommFunc.WriteDWORD(data, self.MapID)
-        data = CommFunc.WriteDWORD(data, self.LineID)
-        data = CommFunc.WriteDWORD(data, self.NPCID)
-        data = CommFunc.WriteWORD(data, self.ExDataLen)
-        data = CommFunc.WriteString(data, self.ExDataLen, self.ExData)
-        data = CommFunc.WriteString(data, 19, self.TimeStr)
-        data = CommFunc.WriteBYTE(data, self.ExtraAward)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                ItemID:%d,
-                                PlayerID:%d,
-                                PlayerName:%s,
-                                Job:%d,
-                                LV:%d,
-                                RealmLV:%d,
-                                Face:%d,
-                                FacePic:%d,
-                                MapID:%d,
-                                LineID:%d,
-                                NPCID:%d,
-                                ExDataLen:%d,
-                                ExData:%s,
-                                TimeStr:%s,
-                                ExtraAward:%d
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.ItemID,
-                                self.PlayerID,
-                                self.PlayerName,
-                                self.Job,
-                                self.LV,
-                                self.RealmLV,
-                                self.Face,
-                                self.FacePic,
-                                self.MapID,
-                                self.LineID,
-                                self.NPCID,
-                                self.ExDataLen,
-                                self.ExData,
-                                self.TimeStr,
-                                self.ExtraAward
-                                )
-        return DumpString
-
-
-m_NAtagGCGetAssistThanksGiftPreview=tagGCGetAssistThanksGiftPreview()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCGetAssistThanksGiftPreview.Head.Cmd,m_NAtagGCGetAssistThanksGiftPreview.Head.SubCmd))] = m_NAtagGCGetAssistThanksGiftPreview
-
-
-#------------------------------------------------------
 # B0 37 淘金营地信息 #tagSCGoldRushCampInfo
 
 class  tagSCGoldRushCamp(Structure):
@@ -31305,21 +30415,20 @@
 
 
 #------------------------------------------------------
-# B0 07 今日协助活跃令信息 #tagMCTodayAssistMoneyInfo
+# B0 40 游历信息 #tagSCTravelInfo
 
-class  tagMCTodayAssistMoneyInfo(Structure):
+class  tagSCTravelGrid(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("TodayAssistMoney", c_ushort),    #今日已获得活跃令,不含社交加成
-                  ("SocialMoney", c_ushort),    #社交额外加成
+                  ("Row", c_ubyte),    #行,从1开始
+                  ("Col", c_ubyte),    #列,从1开始
+                  ("State", c_ubyte),    #状态:0-未点击;1-已开启;2-裂纹
+                  ("Multi", c_ubyte),    #奖励倍值: 默认1倍;2-双倍;...
+                  ("EventID", c_ushort),    #事件ID
                   ]
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x07
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -31328,434 +30437,157 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x07
-        self.TodayAssistMoney = 0
-        self.SocialMoney = 0
+        self.Row = 0
+        self.Col = 0
+        self.State = 0
+        self.Multi = 0
+        self.EventID = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCTodayAssistMoneyInfo)
+        return sizeof(tagSCTravelGrid)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// B0 07 今日协助活跃令信息 //tagMCTodayAssistMoneyInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                TodayAssistMoney:%d,
-                                SocialMoney:%d
+        DumpString = '''// B0 40 游历信息 //tagSCTravelInfo:
+                                Row:%d,
+                                Col:%d,
+                                State:%d,
+                                Multi:%d,
+                                EventID:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.TodayAssistMoney,
-                                self.SocialMoney
+                                self.Row,
+                                self.Col,
+                                self.State,
+                                self.Multi,
+                                self.EventID
                                 )
         return DumpString
 
 
-m_NAtagMCTodayAssistMoneyInfo=tagMCTodayAssistMoneyInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTodayAssistMoneyInfo.Cmd,m_NAtagMCTodayAssistMoneyInfo.SubCmd))] = m_NAtagMCTodayAssistMoneyInfo
-
-
-#------------------------------------------------------
-# B0 04 使用协助感谢礼盒预览 #tagGCUseAssistThanksGiftPreview
-
-class  tagGCAssistPlayerInfo(Structure):
-    PlayerID = 0    #(DWORD PlayerID)
-    PlayerName = ""    #(char PlayerName[33])
-    Job = 0    #(BYTE Job)
-    LV = 0    #(WORD LV)
-    RealmLV = 0    #(BYTE RealmLV)//境界
-    Face = 0    #(DWORD Face)//基本脸型
-    FacePic = 0    #(DWORD FacePic)//头像框
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
-        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        return _pos
-
-    def Clear(self):
-        self.PlayerID = 0
-        self.PlayerName = ""
-        self.Job = 0
-        self.LV = 0
-        self.RealmLV = 0
-        self.Face = 0
-        self.FacePic = 0
-        return
-
-    def GetLength(self):
-        length = 0
-        length += 4
-        length += 33
-        length += 1
-        length += 2
-        length += 1
-        length += 4
-        length += 4
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
-        data = CommFunc.WriteString(data, 33, self.PlayerName)
-        data = CommFunc.WriteBYTE(data, self.Job)
-        data = CommFunc.WriteWORD(data, self.LV)
-        data = CommFunc.WriteBYTE(data, self.RealmLV)
-        data = CommFunc.WriteDWORD(data, self.Face)
-        data = CommFunc.WriteDWORD(data, self.FacePic)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                PlayerID:%d,
-                                PlayerName:%s,
-                                Job:%d,
-                                LV:%d,
-                                RealmLV:%d,
-                                Face:%d,
-                                FacePic:%d
-                                '''\
-                                %(
-                                self.PlayerID,
-                                self.PlayerName,
-                                self.Job,
-                                self.LV,
-                                self.RealmLV,
-                                self.Face,
-                                self.FacePic
-                                )
-        return DumpString
-
-
-class  tagGCUseAssistThanksGiftPreview(Structure):
+class  tagSCTravelInfo(Structure):
     Head = tagHead()
-    ItemID = 0    #(DWORD ItemID)//礼盒ID
-    MapID = 0    #(DWORD MapID)
-    LineID = 0    #(DWORD LineID)
-    NPCID = 0    #(DWORD NPCID)
-    ExDataLen = 0    #(WORD ExDataLen)
-    ExData = ""    #(String ExData)//其他自定义数据
-    AssistPlayerCount = 0    #(BYTE AssistPlayerCount)
-    AssistPlayerList = list()    #(vector<tagGCAssistPlayerInfo> AssistPlayerList)//协助玩家列表
+    Energy = 0    #(BYTE Energy)//剩余体力
+    EnergyTime = 0    #(DWORD EnergyTime)//上次恢复体力时间戳
+    TravelCnt = 0    #(DWORD TravelCnt)//累计游历次数
+    SceneryType = 0    #(BYTE SceneryType)//景观类型
+    SceneryRow = 0    #(BYTE SceneryRow)//景观左上角所在行,从1开始
+    SceneryCol = 0    #(BYTE SceneryCol)//景观左上角所在列,从1开始
+    SceneryLVInfo = 0    #(DWORD SceneryLVInfo)//景观升级信息:0-还未处理景观升级;个位数-第1次升级成功与否,1-成功,2-失败;十位-第2次 ...
+    Result = 0    #(BYTE Result)//后端处理:0-无;1-常规;2-马车炸弹;3-传送门;4-景观;5-重置开始
+    GridCnt = 0    #(BYTE GridCnt)
+    GridList = list()    #(vector<tagSCTravelGrid> GridList)//格子信息列表,只同步变化的
     data = None
 
     def __init__(self):
         self.Clear()
         self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x04
+        self.Head.SubCmd = 0x40
         return
 
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.ItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.LineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.NPCID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.ExDataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.ExData,_pos = CommFunc.ReadString(_lpData, _pos,self.ExDataLen)
-        self.AssistPlayerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.AssistPlayerCount):
-            temAssistPlayerList = tagGCAssistPlayerInfo()
-            _pos = temAssistPlayerList.ReadData(_lpData, _pos)
-            self.AssistPlayerList.append(temAssistPlayerList)
+        self.Energy,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.EnergyTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TravelCnt,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.SceneryType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SceneryRow,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SceneryCol,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SceneryLVInfo,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Result,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GridCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.GridCnt):
+            temGridList = tagSCTravelGrid()
+            _pos = temGridList.ReadData(_lpData, _pos)
+            self.GridList.append(temGridList)
         return _pos
 
     def Clear(self):
         self.Head = tagHead()
         self.Head.Clear()
         self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x04
-        self.ItemID = 0
-        self.MapID = 0
-        self.LineID = 0
-        self.NPCID = 0
-        self.ExDataLen = 0
-        self.ExData = ""
-        self.AssistPlayerCount = 0
-        self.AssistPlayerList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 4
-        length += 4
-        length += 4
-        length += 4
-        length += 2
-        length += len(self.ExData)
-        length += 1
-        for i in range(self.AssistPlayerCount):
-            length += self.AssistPlayerList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteDWORD(data, self.ItemID)
-        data = CommFunc.WriteDWORD(data, self.MapID)
-        data = CommFunc.WriteDWORD(data, self.LineID)
-        data = CommFunc.WriteDWORD(data, self.NPCID)
-        data = CommFunc.WriteWORD(data, self.ExDataLen)
-        data = CommFunc.WriteString(data, self.ExDataLen, self.ExData)
-        data = CommFunc.WriteBYTE(data, self.AssistPlayerCount)
-        for i in range(self.AssistPlayerCount):
-            data = CommFunc.WriteString(data, self.AssistPlayerList[i].GetLength(), self.AssistPlayerList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                ItemID:%d,
-                                MapID:%d,
-                                LineID:%d,
-                                NPCID:%d,
-                                ExDataLen:%d,
-                                ExData:%s,
-                                AssistPlayerCount:%d,
-                                AssistPlayerList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.ItemID,
-                                self.MapID,
-                                self.LineID,
-                                self.NPCID,
-                                self.ExDataLen,
-                                self.ExData,
-                                self.AssistPlayerCount,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagGCUseAssistThanksGiftPreview=tagGCUseAssistThanksGiftPreview()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCUseAssistThanksGiftPreview.Head.Cmd,m_NAtagGCUseAssistThanksGiftPreview.Head.SubCmd))] = m_NAtagGCUseAssistThanksGiftPreview
-
-
-#------------------------------------------------------
-# B0 20 膜拜信息列表 #tagGCWorshipInfoList
-
-class  tagGCWorshipInfo(Structure):
-    PlayerID = 0    #(DWORD PlayerID)// 目标玩家ID
-    WorshipType = 0    #(BYTE WorshipType)// 膜拜类型
-    WorshipValue = 0    #(DWORD WorshipValue)// 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义
-    InfoLen = 0    #(WORD InfoLen)
-    PlayerInfo = ""    #(String PlayerInfo)// 玩家信息{k:v, ...}
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.WorshipType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.WorshipValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.InfoLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.PlayerInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.InfoLen)
-        return _pos
-
-    def Clear(self):
-        self.PlayerID = 0
-        self.WorshipType = 0
-        self.WorshipValue = 0
-        self.InfoLen = 0
-        self.PlayerInfo = ""
-        return
-
-    def GetLength(self):
-        length = 0
-        length += 4
-        length += 1
-        length += 4
-        length += 2
-        length += len(self.PlayerInfo)
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
-        data = CommFunc.WriteBYTE(data, self.WorshipType)
-        data = CommFunc.WriteDWORD(data, self.WorshipValue)
-        data = CommFunc.WriteWORD(data, self.InfoLen)
-        data = CommFunc.WriteString(data, self.InfoLen, self.PlayerInfo)
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                PlayerID:%d,
-                                WorshipType:%d,
-                                WorshipValue:%d,
-                                InfoLen:%d,
-                                PlayerInfo:%s
-                                '''\
-                                %(
-                                self.PlayerID,
-                                self.WorshipType,
-                                self.WorshipValue,
-                                self.InfoLen,
-                                self.PlayerInfo
-                                )
-        return DumpString
-
-
-class  tagGCWorshipInfoList(Structure):
-    Head = tagHead()
-    WorshipCount = 0    #(BYTE WorshipCount)
-    WorshipInfoList = list()    #(vector<tagGCWorshipInfo> WorshipInfoList)
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x20
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.WorshipCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.WorshipCount):
-            temWorshipInfoList = tagGCWorshipInfo()
-            _pos = temWorshipInfoList.ReadData(_lpData, _pos)
-            self.WorshipInfoList.append(temWorshipInfoList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xB0
-        self.Head.SubCmd = 0x20
-        self.WorshipCount = 0
-        self.WorshipInfoList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 1
-        for i in range(self.WorshipCount):
-            length += self.WorshipInfoList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.WorshipCount)
-        for i in range(self.WorshipCount):
-            data = CommFunc.WriteString(data, self.WorshipInfoList[i].GetLength(), self.WorshipInfoList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                WorshipCount:%d,
-                                WorshipInfoList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.WorshipCount,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagGCWorshipInfoList=tagGCWorshipInfoList()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipInfoList.Head.Cmd,m_NAtagGCWorshipInfoList.Head.SubCmd))] = m_NAtagGCWorshipInfoList
-
-
-#------------------------------------------------------
-# B0 21 膜拜结果 #tagGCWorshipResult
-
-class  tagGCWorshipResult(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("PlayerID", c_int),    # 目标玩家ID
-                  ("WorshipType", c_ubyte),    # 膜拜类型
-                  ("WorshipValue", c_int),    # 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义
-                  ("Result", c_ubyte),    # 膜拜结果:0-成功;1-不存在该膜拜类型;2-不存在该目标膜拜;3-不能膜拜该目标;
-                  ("MoneyType", c_ubyte),    # 货币类型
-                  ("MoneyValue", c_int),    # 货币奖励
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB0
-        self.SubCmd = 0x21
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB0
-        self.SubCmd = 0x21
-        self.PlayerID = 0
-        self.WorshipType = 0
-        self.WorshipValue = 0
+        self.Head.SubCmd = 0x40
+        self.Energy = 0
+        self.EnergyTime = 0
+        self.TravelCnt = 0
+        self.SceneryType = 0
+        self.SceneryRow = 0
+        self.SceneryCol = 0
+        self.SceneryLVInfo = 0
         self.Result = 0
-        self.MoneyType = 0
-        self.MoneyValue = 0
+        self.GridCnt = 0
+        self.GridList = list()
         return
 
     def GetLength(self):
-        return sizeof(tagGCWorshipResult)
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 1
+        length += 4
+        length += 1
+        length += 1
+        for i in range(self.GridCnt):
+            length += self.GridList[i].GetLength()
+
+        return length
 
     def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Energy)
+        data = CommFunc.WriteDWORD(data, self.EnergyTime)
+        data = CommFunc.WriteDWORD(data, self.TravelCnt)
+        data = CommFunc.WriteBYTE(data, self.SceneryType)
+        data = CommFunc.WriteBYTE(data, self.SceneryRow)
+        data = CommFunc.WriteBYTE(data, self.SceneryCol)
+        data = CommFunc.WriteDWORD(data, self.SceneryLVInfo)
+        data = CommFunc.WriteBYTE(data, self.Result)
+        data = CommFunc.WriteBYTE(data, self.GridCnt)
+        for i in range(self.GridCnt):
+            data = CommFunc.WriteString(data, self.GridList[i].GetLength(), self.GridList[i].GetBuffer())
+        return data
 
     def OutputString(self):
-        DumpString = '''// B0 21 膜拜结果 //tagGCWorshipResult:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                PlayerID:%d,
-                                WorshipType:%d,
-                                WorshipValue:%d,
+        DumpString = '''
+                                Head:%s,
+                                Energy:%d,
+                                EnergyTime:%d,
+                                TravelCnt:%d,
+                                SceneryType:%d,
+                                SceneryRow:%d,
+                                SceneryCol:%d,
+                                SceneryLVInfo:%d,
                                 Result:%d,
-                                MoneyType:%d,
-                                MoneyValue:%d
+                                GridCnt:%d,
+                                GridList:%s
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.PlayerID,
-                                self.WorshipType,
-                                self.WorshipValue,
+                                self.Head.OutputString(),
+                                self.Energy,
+                                self.EnergyTime,
+                                self.TravelCnt,
+                                self.SceneryType,
+                                self.SceneryRow,
+                                self.SceneryCol,
+                                self.SceneryLVInfo,
                                 self.Result,
-                                self.MoneyType,
-                                self.MoneyValue
+                                self.GridCnt,
+                                "..."
                                 )
         return DumpString
 
 
-m_NAtagGCWorshipResult=tagGCWorshipResult()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipResult.Cmd,m_NAtagGCWorshipResult.SubCmd))] = m_NAtagGCWorshipResult
+m_NAtagSCTravelInfo=tagSCTravelInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCTravelInfo.Head.Cmd,m_NAtagSCTravelInfo.Head.SubCmd))] = m_NAtagSCTravelInfo
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Travel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Travel.py
new file mode 100644
index 0000000..8a9978e
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Travel.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.Travel
+#
+# @todo:游历
+# @author hxp
+# @date 2025-11-25
+# @version 1.0
+#
+# 详细描述: 游历
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-11-25 17:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import IpyGameDataPY
+import PlayerControl
+import PlayerTravel
+import ChConfig
+
+import time
+
+def OnExec(curPlayer, msgList):
+    
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "重刷游历: Travel 0 [指定景观类型]")
+        GameWorld.DebugAnswer(curPlayer, "游历次数: Travel t 累计游历次数")
+        GameWorld.DebugAnswer(curPlayer, "设置体力: Travel e 体力 [差几秒可恢复体力]")
+        return
+    
+    value1 = msgList[0]
+    if value1 == 0:
+        sceneryType = msgList[1] if len(msgList) > 1 else 0 
+        sceneryType, randRow, randCol = PlayerTravel.ResetTravelGrid(curPlayer, sceneryType)
+        GameWorld.DebugAnswer(curPlayer, "重刷游历景观类型:%s,行:%s,列:%s" % (sceneryType, randRow, randCol))
+        
+    elif value1 == "t":
+        travelCnt = msgList[1] if len(msgList) > 1 else 0 
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelCnt, travelCnt)
+        GameWorld.DebugAnswer(curPlayer, "累计游历次数: %s" % travelCnt)
+        PlayerTravel.SyncTravelInfo(curPlayer)
+        
+    elif value1 == "e":
+        energy = msgList[1] if len(msgList) > 1 else 0
+        remainSeconds = msgList[2] if len(msgList) > 2 else 0
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergy, energy)
+        if remainSeconds:
+            cdSeconds = IpyGameDataPY.GetFuncCfg("TravelSet", 2) * 60
+            energyTime = int(time.time()) - cdSeconds + remainSeconds
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergyTime, energyTime)
+        GameWorld.DebugAnswer(curPlayer, "设置体力: %s" % (energy))
+        PlayerTravel.SyncTravelInfo(curPlayer)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 235b16d..c408770 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -834,6 +834,22 @@
                         ("list", "AttrPerStarAddList", 0),
                         ),
 
+                "TravelEvent":(
+                        ("WORD", "EventID", 1),
+                        ("DWORD", "EventWeight", 0),
+                        ("DWORD", "AwardItemID", 0),
+                        ("DWORD", "AwardItemCnt", 0),
+                        ),
+
+                "TravelScenery":(
+                        ("BYTE", "SceneryType", 1),
+                        ("BYTE", "AwardQuality", 0),
+                        ("DWORD", "UpRate", 0),
+                        ("list", "AwardItemRandCntList", 0),
+                        ("list", "AwardItemExWeightList", 0),
+                        ("BYTE", "AwardItemExCnt", 0),
+                        ),
+
                 "PlayerLV":(
                         ("WORD", "LV", 1),
                         ("DWORD", "Exp", 0),
@@ -2125,12 +2141,6 @@
                         ("BYTE", "SkinIndex", 0),
                         ),
 
-                "AssistThanksGift":(
-                        ("DWORD", "GiftID", 1),
-                        ("list", "RequestPlayerAward", 0),
-                        ("list", "AssistPlayerAward", 0),
-                        ),
-
                 "FuncSysPrivilege":(
                         ("BYTE", "FuncSysID", 1),
                         ("BYTE", "DayNum", 0),
@@ -3377,6 +3387,32 @@
     def GetAttrIDList(self): return self.attrTuple[7] # 属性ID列表 list
     def GetInitAttrValueList(self): return self.attrTuple[8] # 初始属性值列表 list
     def GetAttrPerStarAddList(self): return self.attrTuple[9] # 每星加成值列表 list
+
+# 游历事件表
+class IPY_TravelEvent():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetEventID(self): return self.attrTuple[0] # WORD
+    def GetEventWeight(self): return self.attrTuple[1] # 事件权重 DWORD
+    def GetAwardItemID(self): return self.attrTuple[2] # 奖励物品ID DWORD
+    def GetAwardItemCnt(self): return self.attrTuple[3] # 奖励物品数量 DWORD
+
+# 游历景观奖励表
+class IPY_TravelScenery():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetSceneryType(self): return self.attrTuple[0] # 景观类型 BYTE
+    def GetAwardQuality(self): return self.attrTuple[1] # 景观品质 BYTE
+    def GetUpRate(self): return self.attrTuple[2] # 升下个品质概率 DWORD
+    def GetAwardItemRandCntList(self): return self.attrTuple[3] # 奖励物品随机个数列表 [[物品ID, 随机数量A, 到B], ...] list
+    def GetAwardItemExWeightList(self): return self.attrTuple[4] # 额外奖励物品权重 [[权重,物品ID,个数], ...] list
+    def GetAwardItemExCnt(self): return self.attrTuple[5] # 额外奖励物品数 BYTE
 
 # 玩家等级表
 class IPY_PlayerLV():
@@ -5359,17 +5395,6 @@
     def GetAttrInfo(self): return self.attrTuple[4] # 属性 dict
     def GetSkinIndex(self): return self.attrTuple[5] # 外观 BYTE
 
-# 协助感谢礼盒表
-class IPY_AssistThanksGift():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetGiftID(self): return self.attrTuple[0] # 礼盒物品ID DWORD
-    def GetRequestPlayerAward(self): return self.attrTuple[1] #  发布奖励物品 物品ID|个数 list
-    def GetAssistPlayerAward(self): return self.attrTuple[2] #  协助奖励物品 物品ID|个数 list
-
 # 功能特权奖励表
 class IPY_FuncSysPrivilege():
     
@@ -5639,6 +5664,8 @@
         self.__LoadFileData("Beauty", onlyCheck)
         self.__LoadFileData("BeautyQualityLV", onlyCheck)
         self.__LoadFileData("BeautySkin", onlyCheck)
+        self.__LoadFileData("TravelEvent", onlyCheck)
+        self.__LoadFileData("TravelScenery", onlyCheck)
         self.__LoadFileData("PlayerLV", onlyCheck)
         self.__LoadFileData("SpecMapPlayerAttrFormat", onlyCheck)
         self.__LoadFileData("GMAttr", onlyCheck)
@@ -5777,7 +5804,6 @@
         self.__LoadFileData("LoveRing", onlyCheck)
         self.__LoadFileData("LoveCharm", onlyCheck)
         self.__LoadFileData("HorsePetSkin", onlyCheck)
-        self.__LoadFileData("AssistThanksGift", onlyCheck)
         self.__LoadFileData("FuncSysPrivilege", onlyCheck)
         self.__LoadFileData("HistoryRechargeAward", onlyCheck)
         self.__LoadFileData("CustomAward", onlyCheck)
@@ -6518,6 +6544,20 @@
     def GetBeautySkinByIndex(self, index):
         self.CheckLoadData("BeautySkin")
         return self.ipyBeautySkinCache[index]
+
+    def GetTravelEventCount(self):
+        self.CheckLoadData("TravelEvent")
+        return self.ipyTravelEventLen
+    def GetTravelEventByIndex(self, index):
+        self.CheckLoadData("TravelEvent")
+        return self.ipyTravelEventCache[index]
+
+    def GetTravelSceneryCount(self):
+        self.CheckLoadData("TravelScenery")
+        return self.ipyTravelSceneryLen
+    def GetTravelSceneryByIndex(self, index):
+        self.CheckLoadData("TravelScenery")
+        return self.ipyTravelSceneryCache[index]
 
     def GetPlayerLVCount(self):
         self.CheckLoadData("PlayerLV")
@@ -7484,13 +7524,6 @@
     def GetHorsePetSkinByIndex(self, index):
         self.CheckLoadData("HorsePetSkin")
         return self.ipyHorsePetSkinCache[index]
-
-    def GetAssistThanksGiftCount(self):
-        self.CheckLoadData("AssistThanksGift")
-        return self.ipyAssistThanksGiftLen
-    def GetAssistThanksGiftByIndex(self, index):
-        self.CheckLoadData("AssistThanksGift")
-        return self.ipyAssistThanksGiftCache[index]
 
     def GetFuncSysPrivilegeCount(self):
         self.CheckLoadData("FuncSysPrivilege")
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 6592bf1..1107e1b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -131,6 +131,7 @@
 import PlayerHero
 import PlayerOnline
 import PlayerBeauty
+import PlayerTravel
 import TurnAttack
 import PlayerHJG
 import ObjPool
@@ -731,6 +732,7 @@
         PlayerActivity.OnPlayerLogin(curPlayer)
         PlayerLLMJ.OnPlayerLogin(curPlayer)
         PlayerBeauty.OnPlayerLogin(curPlayer)
+        PlayerTravel.OnPlayerLogin(curPlayer)
         
         # 上线查询一次充值订单
         curPlayer.SendDBQueryRecharge()
@@ -3112,54 +3114,6 @@
     curPlayer.Syn_OfflineTimeQueryResult() # 通知客服端离线时间
     return
 
-
-#//B0 24 领取家族悬赏奖励 #tagReceiveFamilyArrestAward
-#
-#struct    tagReceiveFamilyArrestAward
-#
-#{
-#    tagHead        Head;
-#    DWORD        ArrestID;        //悬赏任务ID
-#};
-## 领取家族悬赏奖励
-#  @param index: 玩家索引
-#  @param clientData: 封包结构体
-#  @param tick: 时间戳
-#  @return: None
-def ReceiveFamilyArrestAward(index, clientData, tick):
-    return
-
-
-#//B0 26 请求家族悬赏奖励领取情况 #tagQueryFamilyArrestAwardReceiveState
-#
-#struct    tagQueryFamilyArrestAwardReceiveState
-#
-#{
-#    tagHead        Head;
-#};
-## 请求家族悬赏奖励领取情况
-#  @param index: 玩家索引
-#  @param clientData: 封包结构体
-#  @param tick: 时间戳
-#  @return: None
-def QueryFamilyArrestAwardReceiveState(index, clientData, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    Sync_FamilyArrestAwardReceiveState(curPlayer)
-    return
-
-
-## 通知客户端家族悬赏任务奖励领取情况
-#  @param curPlayer: 玩家实例
-#  @return: None
-def Sync_FamilyArrestAwardReceiveState(curPlayer):
-    awardReceiveState = ChPyNetSendPack.tagFamilyArrestAwardReceiveState()
-    awardReceiveState.Clear()
-    
-    state = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyArrestAwardState)
-    awardReceiveState.ReceiveState = state
-    NetPackCommon.SendFakePack(curPlayer, awardReceiveState)
-    return
-
 def PlayerOnDay(curPlayer):
     #玩法前瞻奖励
     gameNoticeAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GameNoticeAwardState)
@@ -3399,6 +3353,9 @@
     elif adAwardType == 3:
         treasureType = adAwardValue
         PlayerTreasure.DoTreasure(curPlayer, treasureType, PlayerTreasure.CostType_ADFree)
+    # 游历体力
+    elif adAwardType == 4:
+        PlayerTravel.AddTravelEnergy(curPlayer, adAwardValue)
     return
 
 def ADCntOnDay(curPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
index cb52de0..667d289 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -31,9 +31,8 @@
 import PlayerActBuyCountGift
 import PlayerActLoginNew
 import PlayerActTask
-import IPY_GameWorld
-import ItemCommon
 import ItemControler
+import PlayerTravel
 import PlayerHorse
 import PlayerArena
 import PlayerTask
@@ -45,6 +44,7 @@
                      ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj),
                      ShareDefine.GameFuncID_Shop:lambda curObj:FunctionNPCCommon.DoShopOpen(curObj),
                      ShareDefine.GameFuncID_Horse:lambda curObj:PlayerHorse.DoHorseOpen(curObj),
+                     ShareDefine.GameFuncID_Travel:lambda curObj:PlayerTravel.DoTravelOpen(curObj),
                      }
 
 def GetFuncOpenLVIpyData(funcID): return IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
index 413f347..7c358e6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
@@ -25,10 +25,10 @@
 import PlayerGoldRush
 import NetPackCommon
 import ItemControler
+import PyGameData
 import PlayerTask
 import FBCommon
 import ObjPool
-import PyGameData
 
 # 红颜解锁方式
 (
@@ -188,7 +188,7 @@
             return
         
     elif unlockWay == UnlockWay_TravelCnt:
-        travelCnt = 0
+        travelCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelCnt)
         needTravelCnt = unlockNeedCnt
         if travelCnt < needTravelCnt:
             GameWorld.DebugLog("激活红颜所需游历次数不足! beautyID=%s,travelCnt=%s < %s" % (beautyID, travelCnt, needTravelCnt), playerID)
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 6bcaf3f..9572b02 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -2945,8 +2945,9 @@
             return
         SetMoney(curPlayer, priceType, updPlayerGold)
         
-        if isGiveBourseMoney and updPlayerGold > 0:
-            GiveMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney, min(value, updPlayerGold))
+        #废弃交易所额度
+        #if isGiveBourseMoney and updPlayerGold > 0:
+        #    GiveMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney, min(value, updPlayerGold))
         addDataDict["BourseMoney"] = GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney)
         
     elif priceType == IPY_GameWorld.TYPE_Price_Gold_Paper:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 81fc54f..9df0805 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -37,6 +37,7 @@
 import PlayerBackup
 import PlayerOnline
 import PlayerGoldRush
+import PlayerTravel
 import PlayerHorse
 import PlayerHJG
 
@@ -1049,6 +1050,8 @@
     #PlayerFlashSale.ProcessFlashSaleMail(curPlayer, tick)
     #淘金
     PlayerGoldRush.OnProcess(curPlayer)
+    #游历
+    PlayerTravel.OnProcess(curPlayer)
     return
 
 def ProcessPlayerMinute(curPlayer, tick):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTravel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTravel.py
new file mode 100644
index 0000000..b4ea635
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTravel.py
@@ -0,0 +1,504 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerTravel
+#
+# @todo:游历
+# @author hxp
+# @date 2025-11-25
+# @version 1.0
+#
+# 详细描述: 游历
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-11-25 17:30"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import PlayerControl
+import IpyGameDataPY
+import ChPyNetSendPack
+import NetPackCommon
+import ItemControler
+import PlayerBeauty
+import GameWorld
+import ObjPool
+
+import random
+import time
+
+GridState_None = 0 # 未点击
+GridState_Opend = 1 # 已打开
+GridState_Crack = 2 # 裂纹的,需再次点击开启
+
+# 景观类型相关设置 {景观类型:[占地行,列], ...}
+SceneryTypeSet = {
+                  1:[1, 1],
+                  4:[2, 2],
+                  6:[3, 2],
+                  }
+
+# 小于99的为景观行列编号事件标记: 1~n
+EventID_Portal = 99 # 传送门
+EventID_Blank = 100 # 空白
+EventID_Bomb = 101 # 十字炸弹
+
+#固定的特殊事件ID
+SpecEventIDList = [EventID_Portal, EventID_Blank, EventID_Bomb]
+
+# 后端处理
+(
+Result_None, # 无,后端主动同步,如登录、GM等 0
+Result_Comm, # 常规点击返回 1
+Result_Bomb, # 马车炸弹 2
+Result_Portal, # 点击传送门 3
+Result_SceneryUp, # 升级景观 4
+Result_Reset, # 重新开始 5
+) = range(6)
+
+def DoTravelOpen(curPlayer):
+    energy = IpyGameDataPY.GetFuncCfg("TravelSet", 1)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergy, energy)
+    ResetTravelGrid(curPlayer)
+    return
+
+def OnPlayerLogin(curPlayer):
+    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelState) == 2:
+        ResetTravelGrid(curPlayer)
+    else:
+        SyncTravelInfo(curPlayer, isAll=True)
+    return
+
+## Def_PDict_TravelGridInfo 格子信息, 事件ID*100+是否双倍*10+开启状态
+def GetGridState(curPlayer, row, col):
+    ## 格子状态: 0-未开启;1-已开启;2-裂纹
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelGridInfo % (row, col)) % 10
+def SetGridState(curPlayer, row, col, state):
+    dataValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelGridInfo % (row, col))
+    updValue = dataValue / 10 * 10 + min(state, 9)
+    return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelGridInfo % (row, col), updValue)
+def GetGridMulti(curPlayer, row, col):
+    ## 奖励倍值
+    dataValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelGridInfo % (row, col))
+    return max(1, GameWorld.GetValue(dataValue, 2, 1))
+def SetGridMulti(curPlayer, row, col, multi=1):
+    dataValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelGridInfo % (row, col))
+    updValue = GameWorld.SetValue(dataValue, 2, 1, multi)
+    return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelGridInfo % (row, col), updValue)
+def GetGridEventID(curPlayer, row, col):
+    ## 格子事件ID
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelGridInfo % (row, col)) / 100
+def SetGridEventID(curPlayer, row, col, eventID):
+    dataValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelGridInfo % (row, col))
+    updValue = eventID * 100 + dataValue % 100
+    return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelGridInfo % (row, col), updValue)
+
+def ResetTravelGrid(curPlayer, sceneryType=0):
+    ## 重置游历网格
+    
+    rowMax, colMax = IpyGameDataPY.GetFuncEvalCfg("TravelSet", 3) # 行列
+    for row in range(1, 1 + rowMax):
+        for col in range(1, 1 + colMax):
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelGridInfo % (row, col), 0)
+            
+    # 初始化景观类型、位置
+    if sceneryType in SceneryTypeSet:
+        # GM指定了类型
+        pass
+    else:
+        sceneryTypeWeightList = IpyGameDataPY.GetFuncEvalCfg("TravelRate", 3)
+        sceneryType = GameWorld.GetResultByWeightList(sceneryTypeWeightList)
+        if sceneryType not in SceneryTypeSet:
+            sceneryType = SceneryTypeSet.keys()[0]    
+    rowSet, colSet = SceneryTypeSet[sceneryType]
+    
+    randRowMax = rowMax - rowSet + 1
+    randColMax = colMax - colSet + 1
+    GameWorld.DebugLog("重置游历网格: sceneryType=%s,rowSet=%s,colSet=%s,randRowMax=%s,randColMax=%s" % (sceneryType, rowSet, colSet, randRowMax, randColMax))
+    randRow = random.randint(1, randRowMax)
+    randCol = random.randint(1, randColMax)
+    sceneryValue = randRow * 100 + randCol * 10 + sceneryType
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelScenery, sceneryValue)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelSceneryLVInfo, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelState, 0)
+    GameWorld.DebugLog("    景观位置: randRow=%s,randCol=%s,sceneryValue=%s" % (randRow, randCol, sceneryValue))
+    
+    for row in range(randRow, randRow + rowSet):
+        for col in range(randCol, randCol + colSet):
+            eventID = (row - randRow) * colSet + (col - randCol) + 1 # 景观各位置对应事件ID,1~n
+            SetGridEventID(curPlayer, row, col, eventID) 
+            GameWorld.DebugLog("    row=%s,col=%s,eventID=%s" % (row, col, eventID))
+            
+    SyncTravelInfo(curPlayer, result=Result_Reset, isAll=True)
+    return sceneryType, randRow, randCol
+
+def __getSceneryInfo(curPlayer):
+    sceneryValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelScenery)
+    sRow = sceneryValue / 100
+    sCol = sceneryValue % 100 / 10
+    sceneryType = sceneryValue % 10
+    return sceneryType, sRow, sCol
+
+def __checkSceneryOpend(curPlayer):
+    ## 检查景观相关格子是否已全部打开
+    sceneryType, sRow, sCol = __getSceneryInfo(curPlayer)
+    if sceneryType not in SceneryTypeSet:
+        return
+    rowSet, colSet = SceneryTypeSet[sceneryType]
+    for row in range(sRow, sRow + rowSet):
+        for col in range(sCol, sCol + colSet):
+            gridState = GetGridState(curPlayer, row, col)
+            if gridState != GridState_Opend:
+                GameWorld.DebugLog("还有景观格子未开启: row=%s,col=%s,gridState=%s" % (row, col, gridState))
+                return
+    return True
+
+def OnProcess(curPlayer):
+    CheckTravelEnergyRecover(curPlayer)
+    return
+
+def GetTravelEnergyMax(curPlayer):
+    initEnergy = IpyGameDataPY.GetFuncCfg("TravelSet", 1)
+    addEnergy = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_TravelEnergy)[0]
+    return initEnergy + addEnergy
+
+def CheckTravelEnergyRecover(curPlayer, isNotify=True):
+    ## 检查体力恢复
+    maxEnergy = GetTravelEnergyMax(curPlayer)
+    curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelEnergy)
+    lastRecoverTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelEnergyTime)
+    if curEnergy >= maxEnergy:
+        if lastRecoverTime:
+            GameWorld.DebugLog("游历体力已满! curEnergy=%s/%s" % (curEnergy, maxEnergy))
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergyTime, 0)
+            isNotify and SyncTravelInfo(curPlayer)
+        return
+    
+    curTime = int(time.time())
+    passSeconds = curTime - lastRecoverTime
+    if not lastRecoverTime or passSeconds < 0:
+        GameWorld.DebugLog("重设游历体力恢复时间! curEnergy=%s/%s" % (curEnergy, maxEnergy))
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergyTime, curTime)
+        isNotify and SyncTravelInfo(curPlayer)
+        return
+    
+    cdSeconds = IpyGameDataPY.GetFuncCfg("TravelSet", 2) * 60
+    if passSeconds < cdSeconds:
+        return
+    recoverCnt = passSeconds / cdSeconds
+    recoverCnt = min(recoverCnt, maxEnergy - curEnergy)
+    updEnergy = curEnergy + recoverCnt
+    updRecoverTime = curTime - passSeconds % cdSeconds
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergy, updEnergy)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergyTime, updRecoverTime)
+    GameWorld.DebugLog("恢复游历体力: %s,curEnergy=%s,updEnergy=%s/%s,passSeconds=%s,上次恢复:%s" 
+                       % (recoverCnt, curEnergy, updEnergy, maxEnergy, passSeconds, GameWorld.ChangeTimeNumToStr(lastRecoverTime)))
+    if updEnergy >= maxEnergy:
+        GameWorld.DebugLog("体力已满!")
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergyTime, 0)
+    isNotify and SyncTravelInfo(curPlayer)
+    return
+
+def AddTravelEnergy(curPlayer, addEnergy):
+    ## 增加体力
+    energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelEnergy)
+    updEnergy = energy + addEnergy
+    updEnergy = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergy, updEnergy)
+    SyncTravelInfo(curPlayer)
+    return
+
+#// B0 40 游历点击 #tagCSTravelClick
+#
+#struct    tagCSTravelClick
+#{
+#    tagHead        Head;
+#    BYTE        Row;        //行,从1开始
+#    BYTE        Col;        //列,从1开始
+#};
+def OnTravelClick(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    row = curPackData.Row
+    col = curPackData.Col
+    
+    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelState) == 2:
+        GameWorld.DebugLog("请求重置游历格子")
+        ResetTravelGrid(curPlayer)
+        return
+    
+    gridState = GetGridState(curPlayer, row, col)
+    GameWorld.DebugLog("游历点击: row=%s,col=%s,gridState=%s" % (row, col, gridState))
+    
+    rowMax, colMax = IpyGameDataPY.GetFuncEvalCfg("TravelSet", 3) # 行列
+    if row <= 0 or col <= 0 or row > rowMax or col > colMax:
+        GameWorld.DebugLog("不存在该格子: row=%s,col=%s,rowMax=%s,colMax=%s" % (row, col, rowMax, colMax))
+        return
+    
+    if gridState in [GridState_None, GridState_Crack]:
+        energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelEnergy)
+        if not energy:
+            GameWorld.DebugLog("游历没有体力")
+            return
+        
+        __doClickUnOpendGrid(curPlayer, row, col)
+        
+        energy -= 1
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelEnergy, energy)
+        
+        travelCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelCnt) + 1
+        travelCnt = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelCnt, travelCnt)
+        GameWorld.DebugLog("更新体力: energy=%s,travelCnt=%s" % (energy, travelCnt))
+        CheckTravelEnergyRecover(curPlayer, False)
+        SyncTravelInfo(curPlayer, [[row, col]], Result_Comm)
+    else:
+        __doClickGridEvent(curPlayer, row, col)
+        
+    return
+
+def __doClickUnOpendGrid(curPlayer, row, col):
+    ## 执行点击未开启的格子
+    gridState = GetGridState(curPlayer, row, col)
+    if gridState == GridState_None:
+        crackRate = IpyGameDataPY.GetFuncCfg("TravelRate", 1)
+        if GameWorld.CanHappen(crackRate):
+            GameWorld.DebugLog("触发裂纹: row=%s,col=%s,crackRate=%s" % (row, col, crackRate))
+            SetGridState(curPlayer, row, col, GridState_Crack)
+        else:
+            __openGridRandEvent(curPlayer, row, col)
+            
+    # 再次点击裂纹
+    elif gridState == GridState_Crack:
+        __openGridRandEvent(curPlayer, row, col)
+    else:
+        return
+    return True
+
+def __openGridRandEvent(curPlayer, row, col):
+    ## 执行打开格子随机生成事件
+    SetGridState(curPlayer, row, col, GridState_Opend)
+    eventID = GetGridEventID(curPlayer, row, col)
+    if eventID:
+        GameWorld.DebugLog("该游历格子已经有事件ID了! row=%s,col=%s,eventID=%s" % (row, col, eventID))
+        return
+    
+    # 生成事件ID
+    eventWeightList = []
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in range(ipyDataMgr.GetTravelEventCount()):
+        ipyData = ipyDataMgr.GetTravelEventByIndex(index)
+        eventID = ipyData.GetEventID()
+        eventWeight = ipyData.GetEventWeight()
+        eventWeightList.append([eventWeight, ipyData])
+        
+    multi = 1
+    ipyData = GameWorld.GetResultByWeightList(eventWeightList)
+    if not ipyData:
+        eventID = EventID_Blank
+    else:
+        eventID = ipyData.GetEventID()
+        if ipyData.GetAwardItemID():
+            multiRate = IpyGameDataPY.GetFuncCfg("TravelRate", 2)
+            if GameWorld.CanHappen(multiRate):
+                multi = 2
+    SetGridMulti(curPlayer, row, col, multi)
+    SetGridEventID(curPlayer, row, col, eventID)
+    GameWorld.DebugLog("随机格子事件: row=%s,col=%s,eventID=%s,multi=%s" % (row, col, eventID, multi))
+    return
+
+def __doClickGridEvent(curPlayer, row, col):
+    ## 点击结算格子的事件
+    eventID = GetGridEventID(curPlayer, row, col)
+    if not eventID:
+        GameWorld.DebugLog("该游历格子还未生成事件! row=%s,col=%s,eventID=%s" % (row, col, eventID))
+        return
+    
+    if eventID == EventID_Blank:
+        GameWorld.DebugLog("空白事件不处理! row=%s,col=%s,eventID=%s" % (row, col, eventID))
+        return
+    
+    syncGridList = []
+    # 十字炸弹
+    if eventID == EventID_Bomb:
+        GameWorld.DebugLog("点击马车炸弹! row=%s,col=%s,eventID=%s" % (row, col, eventID))
+        result = Result_Bomb
+        rowMax, colMax = IpyGameDataPY.GetFuncEvalCfg("TravelSet", 3) # 行列
+        # 同行
+        for c in range(1, 1 + colMax):
+            if __doClickUnOpendGrid(curPlayer, row, c):
+                syncGridList.append([row, c])
+        # 同列
+        for r in range(1, 1 + rowMax):
+            if __doClickUnOpendGrid(curPlayer, r, col):
+                syncGridList.append([r, col])
+                
+    # 传送门
+    elif eventID == EventID_Portal:
+        GameWorld.DebugLog("点击传送门! row=%s,col=%s,eventID=%s" % (row, col, eventID))
+        result = Result_Portal
+        __giveAwardEvent(curPlayer, syncGridList, "TravelPortal")
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelState, 2) # 标记已点传送门
+        if not syncGridList:
+            GameWorld.DebugLog("点击传送门时没有未领取的,直接重新开始")
+            ResetTravelGrid(curPlayer)
+            return
+        
+    # 景观
+    elif eventID < EventID_Portal:
+        GameWorld.DebugLog("点击景观! row=%s,col=%s,eventID=%s" % (row, col, eventID))
+        result = Result_SceneryUp
+        if not __checkSceneryOpend(curPlayer):
+            return
+        
+    # 其他默认按物品奖励处理
+    else:
+        GameWorld.DebugLog("领取所有已开启的格子奖励! row=%s,col=%s,eventID=%s" % (row, col, eventID))
+        result = Result_Comm
+        __giveAwardEvent(curPlayer, syncGridList, "TravelAward")
+        
+    SyncTravelInfo(curPlayer, syncGridList, result)
+    return
+
+def __giveAwardEvent(curPlayer, syncGridList, eventName):
+    ## 结算所有未领取的奖励事件
+    itemDict = {}
+    rowMax, colMax = IpyGameDataPY.GetFuncEvalCfg("TravelSet", 3)
+    for row in range(1, 1 + rowMax):
+        for col in range(1, 1 + colMax):
+            eventID = GetGridEventID(curPlayer, row, col)
+            if eventID in SpecEventIDList or eventID < EventID_Portal:
+                continue
+            ipyData = IpyGameDataPY.GetIpyGameDataNotLog("TravelEvent", eventID)
+            if not ipyData:
+                continue
+            itemID = ipyData.GetAwardItemID()
+            itemCount = ipyData.GetAwardItemCnt()
+            if not itemID or not itemCount:
+                continue
+            multi = GetGridMulti(curPlayer, row, col)
+            itemDict[itemID] = itemDict.get(itemID, 0) + itemCount * multi
+            SetGridEventID(curPlayer, row, col, EventID_Blank) # 处理完奖励后设置为空白
+            syncGridList.append([row, col])
+            GameWorld.DebugLog("    格子奖励: row=%s,col=%s,eventID=%s,itemID=%s,itemCount=%s,multi=%s,%s" 
+                               % (row, col, eventID, itemID, itemCount, multi, itemDict))
+    if not itemDict:
+        return
+    
+    itemList = [[itemID, itemCount] for itemID, itemCount in itemDict.items()]
+    GameWorld.DebugLog("    奖励汇总: itemList=%s" % (itemList))
+    ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=[eventName, False, {}])
+    return
+
+#// B0 41 游历景观升级 #tagCSTravelSceneryUP
+#
+#struct    tagCSTravelSceneryUP
+#{
+#    tagHead        Head;
+#};
+def OnTravelSceneryUP(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    
+    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelState):
+        GameWorld.DebugLog("景观奖励已经结算过了!")
+        return
+    
+    if not __checkSceneryOpend(curPlayer):
+        return
+    
+    sceneryType, sRow, sCol = __getSceneryInfo(curPlayer)
+    ipyDataList = IpyGameDataPY.GetIpyGameDataList("TravelScenery", sceneryType)
+    if not ipyDataList:
+        return
+    qualityCnt = len(ipyDataList)
+    sceneryLVInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelSceneryLVInfo)
+    GameWorld.DebugLog("景观升级: sceneryType=%s,sRow=%s,sCol=%s,qualityCnt=%s,sceneryLVInfo=%s" % (sceneryType, sRow, sCol, qualityCnt, sceneryLVInfo))
+    
+    upRetList = [] # 升级结果列表
+    upSuccCnt = 0
+    for upBit in range(1, qualityCnt):
+        upRet = GameWorld.GetValue(sceneryLVInfo, upBit, 1)
+        if not upRet:
+            break
+        upRetList.append(upRet)
+        if upRet == 1:
+            upSuccCnt += 1
+            
+    awardIpyData = ipyDataList[upSuccCnt] if len(ipyDataList) > upSuccCnt else ipyDataList[-1]
+    awardQuality = awardIpyData.GetAwardQuality()
+    GameWorld.DebugLog("upSuccCnt=%s,upRetList=%s,awardQuality=%s" % (upSuccCnt, upRetList, awardQuality))
+    if len(upRetList) < qualityCnt - 1:
+        upRate = awardIpyData.GetUpRate()
+        upRet = 1 if GameWorld.CanHappen(upRate) else 2
+        updSceneryLVInfo = GameWorld.SetValue(sceneryLVInfo, len(upRetList) + 1, 1, upRet)
+        GameWorld.DebugLog("升级结果=%s,upRate=%s,updSceneryLVInfo=%s" % (upRet, upRate, updSceneryLVInfo))
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelSceneryLVInfo, updSceneryLVInfo)
+        SyncTravelInfo(curPlayer, result=Result_SceneryUp)
+        return
+    
+    GameWorld.DebugLog("景观升级次数已达上限,直接发放奖励!")
+    awardItemList = []
+    awardItemRandCntList = awardIpyData.GetAwardItemRandCntList()
+    for itemID, itemCntA, itemCntB in awardItemRandCntList:
+        awardItemList.append([itemID, random.randint(itemCntA, itemCntB)])
+    GameWorld.DebugLog("随机物品个数奖励: %s" % awardItemList)
+        
+    awardItemExWeightList = awardIpyData.GetAwardItemExWeightList()
+    awardItemExCnt = awardIpyData.GetAwardItemExCnt()
+    for _ in range(awardItemExCnt):
+        randItemInfo = GameWorld.GetResultByWeightList(awardItemExWeightList)
+        if not randItemInfo or len(randItemInfo) != 2:
+            continue
+        itemID, itemCount = randItemInfo
+        awardItemList.append([itemID, itemCount])
+    GameWorld.DebugLog("附加额外物品奖励: %s" % awardItemList)
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TravelState, 1) # 标记已领取景观奖励
+    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TravelScenery", False, {}])
+    
+    # 景观替换为传送门
+    syncGridList = []
+    rowSet, colSet = SceneryTypeSet[sceneryType]
+    for row in range(sRow, sRow + rowSet):
+        for col in range(sCol, sCol + colSet):
+            if row == sRow and col == sCol:
+                GameWorld.DebugLog("设置为传送门: row=%s,col=%s" % (row, col))
+                SetGridEventID(curPlayer, row, col, EventID_Portal)
+                syncGridList.append([row, col])
+            else:
+                GameWorld.DebugLog("设置为空白: row=%s,col=%s" % (row, col))
+                SetGridEventID(curPlayer, row, col, EventID_Blank)
+                syncGridList.append([row, col])
+    SyncTravelInfo(curPlayer, syncGridList, result=Result_SceneryUp)
+    return
+
+def SyncTravelInfo(curPlayer, syncGridList=[], result=Result_None, isAll=False):
+    if isAll:
+        syncGridList = []
+        rowMax, colMax = IpyGameDataPY.GetFuncEvalCfg("TravelSet", 3)
+        for row in range(1, 1 + rowMax):
+            for col in range(1, 1 + colMax):
+                syncGridList.append([row, col])
+                
+    gridList = []
+    for row, col in syncGridList:
+        grid = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTravelGrid)
+        grid.Row = row
+        grid.Col = col
+        grid.State = GetGridState(curPlayer, row, col)
+        grid.Multi = GetGridMulti(curPlayer, row, col)
+        grid.EventID = GetGridEventID(curPlayer, row, col)
+        gridList.append(grid)
+        
+    sceneryType, sRow, sCol = __getSceneryInfo(curPlayer)
+    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTravelInfo)
+    clientPack.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelEnergy)
+    clientPack.EnergyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelEnergyTime)
+    clientPack.TravelCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelCnt)
+    clientPack.SceneryType = sceneryType
+    clientPack.SceneryRow = sRow
+    clientPack.SceneryCol = sCol
+    clientPack.SceneryLVInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelSceneryLVInfo)
+    clientPack.Result = result
+    clientPack.GridList = gridList
+    clientPack.GridCnt = len(clientPack.GridList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 198d05d..3ec5a8f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -239,8 +239,6 @@
 
 Def_Notify_WorldKey_HurtLog = 'HurtLog'  # 战斗伤害日志
 
-Def_Notify_WorldKey_AssistBoss = "AssistBoss"  # 协助boss
-
 Def_Notify_WorldKey_CoupleInfo = "CoupleInfo"  # 伴侣信息
 
 #活动类型定义
@@ -807,6 +805,7 @@
 GameFuncID_Shop = 16            # 商城,坊市
 GameFuncID_Arena = 27           # 竞技场
 GameFuncID_Horse = 37           # 坐骑
+GameFuncID_Travel = 44          # 游历
 
 # 以下为暂时无用的
 GameFuncID_Pet = -1             # 宠物,灵宠 6

--
Gitblit v1.8.0