From ac36bdcfa7db1557790a5b912c3248b22625841f Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期三, 26 十一月 2025 18:49:17 +0800
Subject: [PATCH] Merge branch 'master' of http://mobile.secondworld.net.cn:10010/r/Project_SG_ServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py                              |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py                                |   41 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py                            |   72 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Travel.py                               |   56 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                      |  633 ++----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                  | 2177 +++-------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FBPass.py                               |   40 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py                            |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                                       |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py         |   19 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Beauty.py                               |  110 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py                                 |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py     |   12 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                    |  322 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py                            |   25 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py                             |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                                  |   64 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py                                |    2 
 PySysDB/PySysDBPY.h                                                                                                     |  125 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py             |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py                          |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py                             |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Arena.py                                |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py                             |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTravel.py                              |  504 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py                                |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py                               |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                      |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py                              |  626 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py                               |   45 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py                               |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                                  |  103 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py                               |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py        |    2 
 /dev/null                                                                                                               |  312 ---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevelBoss.py |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py                                |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py      |   33 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py                              |   29 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                              |   48 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                                    |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFace.py                                |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py             |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py                              |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py                        |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                         |   72 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py                                 |    4 
 47 files changed, 2,645 insertions(+), 2,960 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index a62f192..139a4a8 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -249,6 +249,8 @@
 	DWORD		_Quality;	//品质
 	DWORD		_HeroLV;	//武将等级
 	list		UPCostItem;	// 升级到下级消耗道具
+	list		AttrIDList;	// 武将属性ID列表
+	list		AttrValueList;	// 累计总属性值列表
 };
 
 //推荐阵容表
@@ -955,6 +957,74 @@
 	list		LVUPNeedItemInfo;	//升级所需物品 [[物品ID,个数], ...]
 };
 
+//红颜表
+
+struct Beauty
+{
+	WORD		_BeautyID;	//红颜ID
+	BYTE		BeautyQuality;	//品质
+	BYTE		UnlockWay;	//解锁方式
+    DWORD		UnlockValue;	//解锁方式值
+	BYTE		UnlockNeedCnt;	//解锁所需个数
+	list		TalentAttrIDList;	//天赋属性ID列表
+	list		TalentAttrValueList;	//天赋属性初始值
+	list		TalentPerLVAddList;	//天赋属性每级成长
+	BYTE		EffType;	//天赋效果类型
+	BYTE		EffTypeValue;	//效果类型值
+	BYTE		EffValue;	//效果初始值
+	DWORD		EffPerLVAdd;	//天赋效果每级成长
+};
+
+//红颜品质升级表
+
+struct BeautyQualityLV
+{
+	BYTE		_BeautyQuality;
+	WORD		_BeautyLV;
+	WORD		LVNeedExp;	//升到本级所需经验
+	list		AttrIDList;	//本级属性ID列表
+	list		AttrValueList;	//本级属性值列表
+    list		AwardItemList;	//本级奖励
+};
+
+//红颜时装表
+
+struct	BeautySkin
+{
+    WORD		SkinID;	//时装ID
+	WORD		_BeautyID;
+	BYTE		UnlockWay;	//解锁方式
+    DWORD		UnlockValue;	//解锁方式值
+	BYTE		UnlockNeedCnt;	//解锁所需个数
+	BYTE		UpNeedCnt;	//升级所需个数
+	BYTE		StarMax;	//最高星级
+	list		AttrIDList;	//属性ID列表
+	list		InitAttrValueList;	//初始属性值列表
+    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
@@ -1460,19 +1530,6 @@
 	dict		Reward;	//奖励 {"职业":[[物品ID,个数],...], ...}
 	BYTE		VIPLimit;	//需要VIP几
 	list		VIPAward;	//vip奖励[[物品ID,个数],...]
-};
-
-//仙宝寻主表
-
-struct tagXBXZ
-{
-	DWORD		_ID;	//ID
-	BYTE		Type;	//类型
-	DWORD		NeedCnt;	//需要数量
-	list		Condition;	//条件
-	WORD		MWID;	//法宝ID
-	list		AwardItem;	//奖励物品列表
-	list		Money;	//金钱
 };
 
 //寻宝设定表
@@ -2385,39 +2442,6 @@
 	char		WorldNotifyKey;	//全服广播key,参数(玩家名, 物品ID, 物品数据, 个数,)
 };
 
-//节日游历时间表
-
-struct tagActFeastTravel
-{
-	DWORD		_CfgID;	//配置ID
-	char		StartDate;	//开启日期
-	char		EndDate;	//结束日期
-	WORD		LVLimit;	//限制等级
-	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
-	dict		TemplateIDInfo;	//模板信息 {(世界等级A,B):模板编号, ...}
-};
-
-//节日游历任务表
-
-struct tagActFeastTravelTask
-{
-	BYTE		_TraveTasklD;	//游历ID
-	WORD		FinishNeedValue;	//完成所需进度值
-	WORD		FinishTimeMax;	//总可完成次数,0不限
-	BYTE		AddTravelPoint;	//完成次数获得游历值
-};
-
-//节日游历奖励表
-
-struct tagActFeastTravelAward
-{
-	BYTE		_TemplatelD;	//奖励模板ID
-	BYTE		RecordIndex;	//奖励记录索引
-	WORD		NeedTravelPoint;	//领奖所需游历值
-	BYTE		AwardCountMax;	//可领取次数,0代表不限
-	list		TravelAwardInfo;	//游历奖励 [[物品ID,个数,是否拍品], ...]
-};
-
 //节日巡礼活动时间表
 
 struct tagActFeastWeekParty
@@ -2701,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 a461166..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
@@ -1132,6 +1132,42 @@
 PacketSubCMD_3=0x18
 PacketCallFunc_3=OnGubaoLVUp
 
+;红颜
+[PlayerBeauty]
+ScriptName = Player\PlayerBeauty.py
+Writer = hxp
+Releaser = hxp
+RegType = 0
+RegisterPackCount = 3
+
+PacketCMD_1=0xB2
+PacketSubCMD_1=0x19
+PacketCallFunc_1=OnBeautyActivate
+
+PacketCMD_2=0xB2
+PacketSubCMD_2=0x20
+PacketCallFunc_2=OnBeautyLVUP
+
+PacketCMD_3=0xB2
+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 0bf8cb5..368e745 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -219,7 +219,8 @@
 Def_CalcAttr_Gubao, # 古宝 4
 Def_CalcAttr_HJG, # 幻境阁 5
 Def_CalcAttr_Horse, # 坐骑 6
-) = range(7)
+Def_CalcAttr_Beauty, # 红颜 7
+) = range(8)
 
 CalcAttrName = {
                 Def_CalcAttr_LV:"主公等级",
@@ -229,6 +230,7 @@
                 Def_CalcAttr_Gubao:"古宝",
                 Def_CalcAttr_HJG:"幻境阁",
                 Def_CalcAttr_Horse:"坐骑",
+                Def_CalcAttr_Beauty:"红颜",
                 }
 
 ##-----------------------------------------------------------------------------------------------
@@ -1352,7 +1354,8 @@
 SkillTagAffect_AtkHighest, # 攻击力最高 5
 SkillTagAffect_Burn, # 灼烧/玄火目标优先 6
 SkillTagAffect_PoisonCure, # 仅焚血(毒奶)目标 7
-) = range(8)
+SkillTagAffect_DamShield, # 承伤盾目标优先 8
+) = range(9)
 
 #技能施法目标
 Def_UseSkillAim_Type = 3
@@ -3511,6 +3514,20 @@
 Def_PDict_EmojiPackState = "EmojiPackState_%s"  # 表情包状态,参数(key编号)
 Def_PDict_EmojiPackEndTime = "EmojiPackEndTime_%s"  # 到期时间戳,0为永久,参数(表情包ID)
 
+#红颜
+Def_PDict_BeautyLVInfo = "BeautyLVInfo_%s"  # 红颜等级信息,参数(红颜ID) 经验*10000+等级*10+是否已激活
+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,用于补发上次活动用
@@ -3549,13 +3566,6 @@
 Def_PDict_FeastWishTemplateID = "FeastWishTemplateID" # 玩家身上的模板ID
 Def_PDict_FeastWishBottleValue = "FeastWishBottleValue_%s"  # 祝福瓶当前祝福值,参数(瓶子编号)
 Def_PDict_FeastWishBottleGetState = "FeastWishBottleGetState_%s"  # 祝福瓶已领取记录,参数(瓶子编号),按记录索引二进制位存储是否已领取
-
-#节日游历活动
-Def_PDict_FeastTravelID = "FeastTravelID"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值
-Def_PDict_FeastTravelPoint = "FeastTravelPoint" # 当前总游历点数
-Def_PDict_FeastTravelValue = "FeastTravelValue_%s" # 游历任务总进度值,参数(任务ID)
-Def_PDict_FeastTravelCount = "FeastTravelCount_%s" # 游历任务已完成次数,参数(任务ID)
-Def_PDict_FeastTravelAwardCount = "FeastTravelAwardCount_%s" # 游历已领奖次数,参数(奖励索引)
 
 #多日连充活动
 Def_PDict_ManyDayRechargeID = "ManyDayRechargeID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
@@ -3763,6 +3773,7 @@
 
 #竞技场
 Def_PDict_ArenaScore = "ArenaScore" # 当前积分
+Def_PDict_ArenaWinCnt = "ArenaWinCnt" # 累计胜利次数
 
 #功能系统特权
 Def_PDict_FuncSysPrivilegeActTime = "FuncSysPrivilegeActTime_%s" # 系统功能特权激活时间戳,参数(系统功能ID)
@@ -3837,6 +3848,7 @@
 Def_PDict_UnXiantaoCntBooty = "UnXiantaoCntBooty_%s" # 累计未结算战利品掉落的战锤数,参数(itemID)
 Def_PDict_BootyDropToday = "BootyDropToday_%s" # 今日已累计掉落战利品数量,参数(itemID)
 Def_PDict_AppointDropEquipCnt = "AppointDropEquipCnt" # 定制掉落装备掉落第x次,只记录到配置的最高次数
+Def_PDict_ChallengeLVID = "ChallengeLVID" # 最后一次挑战的关卡ID,无论胜负
 
 #天子考验
 Def_PDict_TianziHisHurt = "TianziHisHurt_%s" # 历史最高伤害,求余亿部分,参数(bossID)
@@ -4035,6 +4047,7 @@
 SkillEff_AngerSkillNoXP = 7007 # 无论多少怒气均可释放该怒气技能
 SkillEff_UseSkillHarmSelf = 7008 # 释放技能时自残(先扣血)
 SkillEff_SkillUseCntLimit = 7009 # 限制技能最多触发次数
+SkillEff_UseSkillStealBuff = 7010 # 释放技能前偷取buff
 
 (
 TriggerType_BeSuperHit, # 被暴击触发技能 1
@@ -4767,7 +4780,7 @@
 Def_RewardType_FamilyTaofaBox,  # 公会讨伐领取宝箱奖励 3
 Def_RewardType_LineupRecommend,  # 阵容推荐奖励 4
 Def_RewardType_LVAward,  # 玩家等级奖励5
-Def_RewardType_XBXZ, # 仙宝寻主奖励6
+Def_RewardType_BeautyLVAward, # 红颜等级奖励 6
 Def_RewardType_DayRealmPoint, # 每日任务修行点奖励7
 Def_RewardType_FirstCharge, # 首充礼包奖励8
 Def_RewardType_MWSoulAward, # 法宝之魂奖励9 -废弃
@@ -4799,7 +4812,7 @@
 Def_RewardType_GoodGame, #游戏好评奖励35
 Def_RewardType_CACTGBillboardDabiao, #跨服充值排行活动达标奖励36
 Def_RewardType_FeastLogin, #节日登录奖励37
-Def_RewardType_FeastTravel, #节日游历奖励38
+Def_RewardType_38,
 Def_RewardType_DailyRecharge, #永久每日累充奖励39
 Def_RewardType_RechargeGold30, #1元送30倍充值券每日奖励40
 Def_RewardType_ManyDayRecharge, #多日连充41
@@ -4887,30 +4900,6 @@
 Def_PPAct_FairyDomain,  #缥缈仙域 16  
 Def_PPAct_JSTreasure,  #绝世寻宝 17  
 ) = range(1, 17+1)
-
-#节日游历活动任务定义
-FeastTravelTaskIDList = (
-Def_FeastTravel_1,
-Def_FeastTravel_Treasure,  #极品寻宝 2
-Def_FeastTravel_RuneTreasure,  #符印寻宝 3
-Def_FeastTravel_4,
-Def_FeastTravel_XJMJ,  #仙界秘境 5
-Def_FeastTravel_6,
-Def_FeastTravel_WorldBoss,  #世界BOSS 7
-Def_FeastTravel_FMT,  #封魔坛 8
-Def_FeastTravel_FamilyParty,  #仙盟宴会 9
-Def_FeastTravel_10,
-Def_FeastTravel_Pray,  #祈愿 11
-Def_FeastTravel_BossHome,  #boss之家 12
-Def_FeastTravel_VIPBoss,  #vipBOSS 13
-Def_FeastTravel_RunFamilyTask, #仙盟任务 14
-Def_FeastTravel_FamilyBoss,  #仙盟Boss 15
-Def_FeastTravel_FairyDomain,  #缥缈仙域 16
-Def_FeastTravel_UseGold,  #累计消费X仙玉 17
-Def_FeastTravel_CTGExp,  #累计充值X仙玉,直接使用充值转化的经验 18
-Def_FeastTravel_JSTreasure,  #绝世寻宝 19 
-Def_FeastTravel_Arena,  #竞技场 20 
-) = range(1, 1 + 20)
 
 #周狂欢活动定义(七天巡礼)
 WeekPartyActIDList = (
@@ -5116,7 +5105,18 @@
 TaskType_KillNPC, # 击败X只怪物 7
 TaskType_GetMoney, # 累计获得xx货币 8
 TaskType_EquipColor, # 穿戴x件x品质及以上装备 9
-) = range(1, 1 + 9)
+TaskType_MainLevelChallenge, # 主线挑战xxx 10
+TaskType_ArenaBattle, # 演武场战斗x次 11
+TaskType_HorseLVUP, # 坐骑升级x次 12
+TaskType_FBZhanchui, # 白骨盈野击败xx 13
+TaskType_HeroLVUP, # 武将升级X次 14
+TaskType_HeroStarUP, # 武将升星x次 15
+TaskType_GoldRush, # 淘金采集x次 16
+TaskType_GoldRushWorkers, # 拥有x名监工 17
+TaskType_ReqOrJoinFamily, # 创建或者申请加入公会 18
+TaskType_FBTianzi, # 挑战天子的考验x次 19
+TaskType_Rename, # 改名 20
+) = range(1, 1 + 20)
 
 # 任务分组
 TaskGroupList = (
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index c67123e..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
 
 
 #------------------------------------------------------
@@ -11572,6 +11246,178 @@
 
 m_NAtagCSArenaMatch=tagCSArenaMatch()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSArenaMatch.Cmd,m_NAtagCSArenaMatch.SubCmd))] = m_NAtagCSArenaMatch
+
+
+#------------------------------------------------------
+# B2 19 红颜激活 #tagCSBeautyActivate
+
+class  tagCSBeautyActivate(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("BeautyID", c_ushort),    #红颜ID
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB2
+        self.SubCmd = 0x19
+        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 = 0xB2
+        self.SubCmd = 0x19
+        self.BeautyID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCSBeautyActivate)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B2 19 红颜激活 //tagCSBeautyActivate:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                BeautyID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.BeautyID
+                                )
+        return DumpString
+
+
+m_NAtagCSBeautyActivate=tagCSBeautyActivate()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSBeautyActivate.Cmd,m_NAtagCSBeautyActivate.SubCmd))] = m_NAtagCSBeautyActivate
+
+
+#------------------------------------------------------
+# B2 20 红颜好感度升级 #tagCSBeautyLVUP
+
+class  tagCSBeautyLVUP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("BeautyID", c_ushort),    #红颜ID
+                  ("ItemID", c_int),    #使用物品ID
+                  ("IsQuick", c_ubyte),    # 是否快速升级,0-只消耗1个道具;1-消耗升1级的道具
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB2
+        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 = 0xB2
+        self.SubCmd = 0x20
+        self.BeautyID = 0
+        self.ItemID = 0
+        self.IsQuick = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCSBeautyLVUP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B2 20 红颜好感度升级 //tagCSBeautyLVUP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                BeautyID:%d,
+                                ItemID:%d,
+                                IsQuick:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.BeautyID,
+                                self.ItemID,
+                                self.IsQuick
+                                )
+        return DumpString
+
+
+m_NAtagCSBeautyLVUP=tagCSBeautyLVUP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSBeautyLVUP.Cmd,m_NAtagCSBeautyLVUP.SubCmd))] = m_NAtagCSBeautyLVUP
+
+
+#------------------------------------------------------
+# B2 21 红颜时装操作 #tagCSBeautySkinOP
+
+class  tagCSBeautySkinOP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("BeautyID", c_ushort),    #红颜ID
+                  ("SkinID", c_ushort),    #时装ID
+                  ("OPType", c_ubyte),    #操作 1-激活;2-佩戴;3-升星
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB2
+        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 = 0xB2
+        self.SubCmd = 0x21
+        self.BeautyID = 0
+        self.SkinID = 0
+        self.OPType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCSBeautySkinOP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B2 21 红颜时装操作 //tagCSBeautySkinOP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                BeautyID:%d,
+                                SkinID:%d,
+                                OPType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.BeautyID,
+                                self.SkinID,
+                                self.OPType
+                                )
+        return DumpString
+
+
+m_NAtagCSBeautySkinOP=tagCSBeautySkinOP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSBeautySkinOP.Cmd,m_NAtagCSBeautySkinOP.SubCmd))] = m_NAtagCSBeautySkinOP
 
 
 #------------------------------------------------------
@@ -13723,9 +13569,9 @@
 
 
 #------------------------------------------------------
-# B3 20 聊天 #tagCMTalk
+# B3 20 聊天 #tagCSTalk
 
-class  tagCMPyTalk(Structure):
+class  tagCSTalk(Structure):
     Head = tagHead()
     ChannelType = 0    #(BYTE ChannelType)// 频道
     Len = 0    #(WORD Len)
@@ -13789,6 +13635,9 @@
         return DumpString
 
 
+m_NAtagCSTalk=tagCSTalk()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSTalk.Head.Cmd,m_NAtagCSTalk.Head.SubCmd))] = m_NAtagCSTalk
+
 
 #------------------------------------------------------
 # B4 12 战斗阵容保存 #tagCSHeroLineupSave
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 8adb7ac..6986c21 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -8964,114 +8964,6 @@
 
 
 #------------------------------------------------------
-# A3 48 仙宝寻主领奖记录 #tagMCXBXZAwardRecordList
-
-class  tagMCXBXZAwardRecord(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("RecordIndex", c_ushort),    #第几个记录值 每个key存31个id   0-30为0, 31-61为1..
-                  ("Record", c_int),    #对应是否领取值
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.RecordIndex = 0
-        self.Record = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCXBXZAwardRecord)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A3 48 仙宝寻主领奖记录 //tagMCXBXZAwardRecordList:
-                                RecordIndex:%d,
-                                Record:%d
-                                '''\
-                                %(
-                                self.RecordIndex,
-                                self.Record
-                                )
-        return DumpString
-
-
-class  tagMCXBXZAwardRecordList(Structure):
-    Head = tagHead()
-    RecordCnt = 0    #(WORD RecordCnt)//记录个数
-    RecordList = list()    #(vector<tagMCXBXZAwardRecord> RecordList)//记录列表
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xA3
-        self.Head.SubCmd = 0x48
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.RecordCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        for i in range(self.RecordCnt):
-            temRecordList = tagMCXBXZAwardRecord()
-            _pos = temRecordList.ReadData(_lpData, _pos)
-            self.RecordList.append(temRecordList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xA3
-        self.Head.SubCmd = 0x48
-        self.RecordCnt = 0
-        self.RecordList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 2
-        for i in range(self.RecordCnt):
-            length += self.RecordList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteWORD(data, self.RecordCnt)
-        for i in range(self.RecordCnt):
-            data = CommFunc.WriteString(data, self.RecordList[i].GetLength(), self.RecordList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                RecordCnt:%d,
-                                RecordList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.RecordCnt,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCXBXZAwardRecordList=tagMCXBXZAwardRecordList()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCXBXZAwardRecordList.Head.Cmd,m_NAtagMCXBXZAwardRecordList.Head.SubCmd))] = m_NAtagMCXBXZAwardRecordList
-
-
-#------------------------------------------------------
 # A4 11 传功邀请信息 #tagGCChuangongInviteInfo
 
 class  tagGCChuangongInviteInfo(Structure):
@@ -15003,6 +14895,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("Score", c_int),    #当前积分
+                  ("WinCnt", c_int),    #累计胜利次数
                   ]
 
     def __init__(self):
@@ -15020,6 +14913,7 @@
         self.Cmd = 0xA9
         self.SubCmd = 0x23
         self.Score = 0
+        self.WinCnt = 0
         return
 
     def GetLength(self):
@@ -15032,12 +14926,14 @@
         DumpString = '''// A9 23 演武场玩家信息 //tagSCArenaPlayerInfo:
                                 Cmd:%s,
                                 SubCmd:%s,
-                                Score:%d
+                                Score:%d,
+                                WinCnt:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
-                                self.Score
+                                self.Score,
+                                self.WinCnt
                                 )
         return DumpString
 
@@ -25469,460 +25365,6 @@
 
 
 #------------------------------------------------------
-# AA 46 节日游历活动信息 #tagMCFeastTravelInfo
-
-class  tagMCFeastTravelAwardItem(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("ItemID", c_int),    
-                  ("ItemCount", c_ushort),    
-                  ("IsBind", c_ubyte),    
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.ItemID = 0
-        self.ItemCount = 0
-        self.IsBind = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCFeastTravelAwardItem)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AA 46 节日游历活动信息 //tagMCFeastTravelInfo:
-                                ItemID:%d,
-                                ItemCount:%d,
-                                IsBind:%d
-                                '''\
-                                %(
-                                self.ItemID,
-                                self.ItemCount,
-                                self.IsBind
-                                )
-        return DumpString
-
-
-class  tagMCFeastTravelAward(Structure):
-    AwardIndex = 0    #(BYTE AwardIndex)//游历奖励索引
-    NeedTravelPoint = 0    #(WORD NeedTravelPoint)//单次领奖所需游历值
-    AwardCountMax = 0    #(WORD AwardCountMax)//最大可领取次数,0代表不限
-    AwardItemCount = 0    #(BYTE AwardItemCount)//奖励物品数
-    AwardItemList = list()    #(vector<tagMCFeastTravelAwardItem> AwardItemList)//奖励物品列表
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        self.AwardIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.NeedTravelPoint,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.AwardCountMax,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.AwardItemCount):
-            temAwardItemList = tagMCFeastTravelAwardItem()
-            _pos = temAwardItemList.ReadData(_lpData, _pos)
-            self.AwardItemList.append(temAwardItemList)
-        return _pos
-
-    def Clear(self):
-        self.AwardIndex = 0
-        self.NeedTravelPoint = 0
-        self.AwardCountMax = 0
-        self.AwardItemCount = 0
-        self.AwardItemList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += 1
-        length += 2
-        length += 2
-        length += 1
-        for i in range(self.AwardItemCount):
-            length += self.AwardItemList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteBYTE(data, self.AwardIndex)
-        data = CommFunc.WriteWORD(data, self.NeedTravelPoint)
-        data = CommFunc.WriteWORD(data, self.AwardCountMax)
-        data = CommFunc.WriteBYTE(data, self.AwardItemCount)
-        for i in range(self.AwardItemCount):
-            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                AwardIndex:%d,
-                                NeedTravelPoint:%d,
-                                AwardCountMax:%d,
-                                AwardItemCount:%d,
-                                AwardItemList:%s
-                                '''\
-                                %(
-                                self.AwardIndex,
-                                self.NeedTravelPoint,
-                                self.AwardCountMax,
-                                self.AwardItemCount,
-                                "..."
-                                )
-        return DumpString
-
-
-class  tagMCFeastTravelTask(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("TravelTaskID", c_ubyte),    #游历任务ID
-                  ("FinishNeedValue", c_ushort),    #单次完成所需进度
-                  ("FinishTimeMax", c_ushort),    #最大可完成次数,0代表不限
-                  ("AddTravelPoint", c_ushort),    #单次完成获得游历值
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.TravelTaskID = 0
-        self.FinishNeedValue = 0
-        self.FinishTimeMax = 0
-        self.AddTravelPoint = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCFeastTravelTask)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AA 46 节日游历活动信息 //tagMCFeastTravelInfo:
-                                TravelTaskID:%d,
-                                FinishNeedValue:%d,
-                                FinishTimeMax:%d,
-                                AddTravelPoint:%d
-                                '''\
-                                %(
-                                self.TravelTaskID,
-                                self.FinishNeedValue,
-                                self.FinishTimeMax,
-                                self.AddTravelPoint
-                                )
-        return DumpString
-
-
-class  tagMCFeastTravelInfo(Structure):
-    Head = tagHead()
-    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
-    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
-    LimitLV = 0    #(WORD LimitLV)// 限制等级
-    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
-    TravelTaskCount = 0    #(BYTE TravelTaskCount)// 游历任务数
-    TravelTaskList = list()    #(vector<tagMCFeastTravelTask> TravelTaskList)//游历任务信息列表
-    TravelAwardCount = 0    #(BYTE TravelAwardCount)// 游历奖励数
-    TravelAwardList = list()    #(vector<tagMCFeastTravelAward> TravelAwardList)//游历奖励信息列表
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x46
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
-        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
-        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.TravelTaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.TravelTaskCount):
-            temTravelTaskList = tagMCFeastTravelTask()
-            _pos = temTravelTaskList.ReadData(_lpData, _pos)
-            self.TravelTaskList.append(temTravelTaskList)
-        self.TravelAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.TravelAwardCount):
-            temTravelAwardList = tagMCFeastTravelAward()
-            _pos = temTravelAwardList.ReadData(_lpData, _pos)
-            self.TravelAwardList.append(temTravelAwardList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x46
-        self.StartDate = ""
-        self.EndtDate = ""
-        self.LimitLV = 0
-        self.ResetType = 0
-        self.TravelTaskCount = 0
-        self.TravelTaskList = list()
-        self.TravelAwardCount = 0
-        self.TravelAwardList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 10
-        length += 10
-        length += 2
-        length += 1
-        length += 1
-        for i in range(self.TravelTaskCount):
-            length += self.TravelTaskList[i].GetLength()
-        length += 1
-        for i in range(self.TravelAwardCount):
-            length += self.TravelAwardList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteString(data, 10, self.StartDate)
-        data = CommFunc.WriteString(data, 10, self.EndtDate)
-        data = CommFunc.WriteWORD(data, self.LimitLV)
-        data = CommFunc.WriteBYTE(data, self.ResetType)
-        data = CommFunc.WriteBYTE(data, self.TravelTaskCount)
-        for i in range(self.TravelTaskCount):
-            data = CommFunc.WriteString(data, self.TravelTaskList[i].GetLength(), self.TravelTaskList[i].GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.TravelAwardCount)
-        for i in range(self.TravelAwardCount):
-            data = CommFunc.WriteString(data, self.TravelAwardList[i].GetLength(), self.TravelAwardList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                StartDate:%s,
-                                EndtDate:%s,
-                                LimitLV:%d,
-                                ResetType:%d,
-                                TravelTaskCount:%d,
-                                TravelTaskList:%s,
-                                TravelAwardCount:%d,
-                                TravelAwardList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.StartDate,
-                                self.EndtDate,
-                                self.LimitLV,
-                                self.ResetType,
-                                self.TravelTaskCount,
-                                "...",
-                                self.TravelAwardCount,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCFeastTravelInfo=tagMCFeastTravelInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFeastTravelInfo.Head.Cmd,m_NAtagMCFeastTravelInfo.Head.SubCmd))] = m_NAtagMCFeastTravelInfo
-
-
-#------------------------------------------------------
-# AA 47 节日游历活动玩家信息 #tagMCFeastTravelPlayerInfo
-
-class  tagMCFeastTravelPlayerAward(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("AwardIndex", c_ubyte),    #游历奖励索引
-                  ("GetAwardCount", c_int),    #已领取次数;前端判断是否可领取: 总游历值 >=  (已领取次数 + 1)  * 单次所需游历值
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.AwardIndex = 0
-        self.GetAwardCount = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCFeastTravelPlayerAward)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AA 47 节日游历活动玩家信息 //tagMCFeastTravelPlayerInfo:
-                                AwardIndex:%d,
-                                GetAwardCount:%d
-                                '''\
-                                %(
-                                self.AwardIndex,
-                                self.GetAwardCount
-                                )
-        return DumpString
-
-
-class  tagMCFeastTravelPlayerTask(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("TravelTaskID", c_ubyte),    #游历任务ID
-                  ("TravelValue", c_int),    #当前进度值,一直累加
-                  ("FinishCount", c_ubyte),    #当前已完成次数; 前端计算未完成次数的进度值=max(0, 当前进度值 - (完成次数 * 单次所需进度))
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.TravelTaskID = 0
-        self.TravelValue = 0
-        self.FinishCount = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCFeastTravelPlayerTask)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AA 47 节日游历活动玩家信息 //tagMCFeastTravelPlayerInfo:
-                                TravelTaskID:%d,
-                                TravelValue:%d,
-                                FinishCount:%d
-                                '''\
-                                %(
-                                self.TravelTaskID,
-                                self.TravelValue,
-                                self.FinishCount
-                                )
-        return DumpString
-
-
-class  tagMCFeastTravelPlayerInfo(Structure):
-    Head = tagHead()
-    TravelPoint = 0    #(DWORD TravelPoint)//当前总游历值,一直累加,不会扣的
-    TravelPlayerTaskCount = 0    #(BYTE TravelPlayerTaskCount)// 游历任务数,不一定有同步,有同步数据则替换即可
-    TravelPlayerTaskList = list()    #(vector<tagMCFeastTravelPlayerTask> TravelPlayerTaskList)//游历任务信息列表
-    TravelPlayerAwardCount = 0    #(BYTE TravelPlayerAwardCount)// 游历奖励数,不一定有同步,有同步数据则替换即可
-    TravelPlayerAwardList = list()    #(vector<tagMCFeastTravelPlayerAward> TravelPlayerAwardList)//游历奖励信息列表
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x47
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.TravelPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.TravelPlayerTaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.TravelPlayerTaskCount):
-            temTravelPlayerTaskList = tagMCFeastTravelPlayerTask()
-            _pos = temTravelPlayerTaskList.ReadData(_lpData, _pos)
-            self.TravelPlayerTaskList.append(temTravelPlayerTaskList)
-        self.TravelPlayerAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.TravelPlayerAwardCount):
-            temTravelPlayerAwardList = tagMCFeastTravelPlayerAward()
-            _pos = temTravelPlayerAwardList.ReadData(_lpData, _pos)
-            self.TravelPlayerAwardList.append(temTravelPlayerAwardList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x47
-        self.TravelPoint = 0
-        self.TravelPlayerTaskCount = 0
-        self.TravelPlayerTaskList = list()
-        self.TravelPlayerAwardCount = 0
-        self.TravelPlayerAwardList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 4
-        length += 1
-        for i in range(self.TravelPlayerTaskCount):
-            length += self.TravelPlayerTaskList[i].GetLength()
-        length += 1
-        for i in range(self.TravelPlayerAwardCount):
-            length += self.TravelPlayerAwardList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteDWORD(data, self.TravelPoint)
-        data = CommFunc.WriteBYTE(data, self.TravelPlayerTaskCount)
-        for i in range(self.TravelPlayerTaskCount):
-            data = CommFunc.WriteString(data, self.TravelPlayerTaskList[i].GetLength(), self.TravelPlayerTaskList[i].GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.TravelPlayerAwardCount)
-        for i in range(self.TravelPlayerAwardCount):
-            data = CommFunc.WriteString(data, self.TravelPlayerAwardList[i].GetLength(), self.TravelPlayerAwardList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                TravelPoint:%d,
-                                TravelPlayerTaskCount:%d,
-                                TravelPlayerTaskList:%s,
-                                TravelPlayerAwardCount:%d,
-                                TravelPlayerAwardList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.TravelPoint,
-                                self.TravelPlayerTaskCount,
-                                "...",
-                                self.TravelPlayerAwardCount,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCFeastTravelPlayerInfo=tagMCFeastTravelPlayerInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFeastTravelPlayerInfo.Head.Cmd,m_NAtagMCFeastTravelPlayerInfo.Head.SubCmd))] = m_NAtagMCFeastTravelPlayerInfo
-
-
-#------------------------------------------------------
 # AA 20 节日巡礼活动信息 #tagMCFeastWeekPartyInfo
 
 class  tagMCFeastWeekPartyItem(Structure):
@@ -30751,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):
@@ -31863,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):
@@ -31886,434 +30437,358 @@
         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):
+        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 = '''
+                                Head:%s,
+                                Energy:%d,
+                                EnergyTime:%d,
+                                TravelCnt:%d,
+                                SceneryType:%d,
+                                SceneryRow:%d,
+                                SceneryCol:%d,
+                                SceneryLVInfo:%d,
+                                Result:%d,
+                                GridCnt:%d,
+                                GridList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Energy,
+                                self.EnergyTime,
+                                self.TravelCnt,
+                                self.SceneryType,
+                                self.SceneryRow,
+                                self.SceneryCol,
+                                self.SceneryLVInfo,
+                                self.Result,
+                                self.GridCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagSCTravelInfo=tagSCTravelInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCTravelInfo.Head.Cmd,m_NAtagSCTravelInfo.Head.SubCmd))] = m_NAtagSCTravelInfo
+
+
+#------------------------------------------------------
+# B1 30 红颜信息 #tagSCBeautyInfo
+
+class  tagSCBeautySkin(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("SkinID", c_ushort),    #时装ID
+                  ("State", c_ubyte),    #是否已激活
+                  ("Used", c_ubyte),    #是否已穿戴该时装,某个红颜的所有时装穿戴可能都为0,则前端取默认时装进行展示,如果有同步已穿戴的则以后端为准
+                  ("Star", c_ubyte),    #时装星级,激活时为0星
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.SkinID = 0
+        self.State = 0
+        self.Used = 0
+        self.Star = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagSCBeautySkin)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// B0 21 膜拜结果 //tagGCWorshipResult:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                PlayerID:%d,
-                                WorshipType:%d,
-                                WorshipValue:%d,
-                                Result:%d,
-                                MoneyType:%d,
-                                MoneyValue:%d
+        DumpString = '''// B1 30 红颜信息 //tagSCBeautyInfo:
+                                SkinID:%d,
+                                State:%d,
+                                Used:%d,
+                                Star:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.PlayerID,
-                                self.WorshipType,
-                                self.WorshipValue,
-                                self.Result,
-                                self.MoneyType,
-                                self.MoneyValue
+                                self.SkinID,
+                                self.State,
+                                self.Used,
+                                self.Star
                                 )
         return DumpString
 
 
-m_NAtagGCWorshipResult=tagGCWorshipResult()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipResult.Cmd,m_NAtagGCWorshipResult.SubCmd))] = m_NAtagGCWorshipResult
+class  tagSCBeauty(Structure):
+    BeautyID = 0    #(WORD BeautyID)//红颜ID
+    State = 0    #(BYTE State)//是否已激活
+    LV = 0    #(WORD LV)//红颜好感等级,激活时为0级
+    Exp = 0    #(WORD Exp)//当前等级经验
+    AwardLV = 0    #(WORD AwardLV)//已经领取到的奖励等级记录
+    SkinCnt = 0    #(BYTE SkinCnt)
+    SkinList = list()    #(vector<tagSCBeautySkin> SkinList)//时装皮肤列表,默认解锁的不通知,有变化的才会同步
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.BeautyID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Exp,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.AwardLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.SkinCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.SkinCnt):
+            temSkinList = tagSCBeautySkin()
+            _pos = temSkinList.ReadData(_lpData, _pos)
+            self.SkinList.append(temSkinList)
+        return _pos
+
+    def Clear(self):
+        self.BeautyID = 0
+        self.State = 0
+        self.LV = 0
+        self.Exp = 0
+        self.AwardLV = 0
+        self.SkinCnt = 0
+        self.SkinList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 2
+        length += 1
+        length += 2
+        length += 2
+        length += 2
+        length += 1
+        for i in range(self.SkinCnt):
+            length += self.SkinList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteWORD(data, self.BeautyID)
+        data = CommFunc.WriteBYTE(data, self.State)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteWORD(data, self.Exp)
+        data = CommFunc.WriteWORD(data, self.AwardLV)
+        data = CommFunc.WriteBYTE(data, self.SkinCnt)
+        for i in range(self.SkinCnt):
+            data = CommFunc.WriteString(data, self.SkinList[i].GetLength(), self.SkinList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                BeautyID:%d,
+                                State:%d,
+                                LV:%d,
+                                Exp:%d,
+                                AwardLV:%d,
+                                SkinCnt:%d,
+                                SkinList:%s
+                                '''\
+                                %(
+                                self.BeautyID,
+                                self.State,
+                                self.LV,
+                                self.Exp,
+                                self.AwardLV,
+                                self.SkinCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagSCBeautyInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)
+    BeautyList = list()    #(vector<tagSCBeauty> BeautyList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x30
+        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):
+            temBeautyList = tagSCBeauty()
+            _pos = temBeautyList.ReadData(_lpData, _pos)
+            self.BeautyList.append(temBeautyList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x30
+        self.Count = 0
+        self.BeautyList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Count):
+            length += self.BeautyList[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.BeautyList[i].GetLength(), self.BeautyList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                BeautyList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagSCBeautyInfo=tagSCBeautyInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCBeautyInfo.Head.Cmd,m_NAtagSCBeautyInfo.Head.SubCmd))] = m_NAtagSCBeautyInfo
 
 
 #------------------------------------------------------
@@ -37142,6 +35617,7 @@
     RealmLV = 0    #(BYTE RealmLV)//境界
     Face = 0    #(DWORD Face)//基本脸型
     FacePic = 0    #(DWORD FacePic)//头像框
+    TitleID = 0    #(DWORD TitleID)//佩戴的称号
     ServerID = 0    #(DWORD ServerID)//所属区服ID
     data = None
 
@@ -37166,6 +35642,7 @@
         self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TitleID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
@@ -37186,6 +35663,7 @@
         self.RealmLV = 0
         self.Face = 0
         self.FacePic = 0
+        self.TitleID = 0
         self.ServerID = 0
         return
 
@@ -37202,6 +35680,7 @@
         length += 2
         length += 1
         length += 1
+        length += 4
         length += 4
         length += 4
         length += 4
@@ -37223,6 +35702,7 @@
         data = CommFunc.WriteBYTE(data, self.RealmLV)
         data = CommFunc.WriteDWORD(data, self.Face)
         data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteDWORD(data, self.TitleID)
         data = CommFunc.WriteDWORD(data, self.ServerID)
         return data
 
@@ -37241,6 +35721,7 @@
                                 RealmLV:%d,
                                 Face:%d,
                                 FacePic:%d,
+                                TitleID:%d,
                                 ServerID:%d
                                 '''\
                                 %(
@@ -37257,6 +35738,7 @@
                                 self.RealmLV,
                                 self.Face,
                                 self.FacePic,
+                                self.TitleID,
                                 self.ServerID
                                 )
         return DumpString
@@ -37281,6 +35763,7 @@
     RealmLV = 0    #(BYTE RealmLV)//境界
     Face = 0    #(DWORD Face)//基本脸型
     FacePic = 0    #(DWORD FacePic)//头像框
+    TitleID = 0    #(DWORD TitleID)//佩戴的称号
     ServerID = 0    #(DWORD ServerID)//所属区服ID
     TalkTime = 0    #(DWORD TalkTime)//该聊天发送时间戳
     data = None
@@ -37302,6 +35785,7 @@
         self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TitleID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.TalkTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
@@ -37318,6 +35802,7 @@
         self.RealmLV = 0
         self.Face = 0
         self.FacePic = 0
+        self.TitleID = 0
         self.ServerID = 0
         self.TalkTime = 0
         return
@@ -37333,6 +35818,7 @@
         length += 2
         length += 1
         length += 1
+        length += 4
         length += 4
         length += 4
         length += 4
@@ -37353,6 +35839,7 @@
         data = CommFunc.WriteBYTE(data, self.RealmLV)
         data = CommFunc.WriteDWORD(data, self.Face)
         data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteDWORD(data, self.TitleID)
         data = CommFunc.WriteDWORD(data, self.ServerID)
         data = CommFunc.WriteDWORD(data, self.TalkTime)
         return data
@@ -37370,6 +35857,7 @@
                                 RealmLV:%d,
                                 Face:%d,
                                 FacePic:%d,
+                                TitleID:%d,
                                 ServerID:%d,
                                 TalkTime:%d
                                 '''\
@@ -37385,6 +35873,7 @@
                                 self.RealmLV,
                                 self.Face,
                                 self.FacePic,
+                                self.TitleID,
                                 self.ServerID,
                                 self.TalkTime
                                 )
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Arena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Arena.py
index b6586ff..415b8bf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Arena.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Arena.py
@@ -32,6 +32,7 @@
         GameWorld.DebugAnswer(curPlayer, "重置玩家竞技场: Arena 0")
         GameWorld.DebugAnswer(curPlayer, "设置玩家榜积分: Arena 积分")
         GameWorld.DebugAnswer(curPlayer, "直接匹配到目标: Arena m 对手ID 对手ID ...")
+        GameWorld.DebugAnswer(curPlayer, "设置累计胜利数: Arena w 胜利数")
         GameWorld.DebugAnswer(curPlayer, "重置赛季直接用 test_OnWeek")
         return
     
@@ -54,5 +55,11 @@
         gmMatchIDList = msgList[1:]
         PlayerArena.GMArenaMatch(curPlayer, gmMatchIDList)
         
+    elif value1 == "w":
+        winCnt = msgList[1] if len(msgList) > 1 else 0
+        GameWorld.DebugAnswer(curPlayer, "设置竞技场胜利数: %s" % winCnt)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaWinCnt, winCnt)
+        PlayerArena.Sync_ArenaInfo(curPlayer)
+        
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Beauty.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Beauty.py
new file mode 100644
index 0000000..250a2ad
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Beauty.py
@@ -0,0 +1,110 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.Beauty
+#
+# @todo:红颜
+# @author hxp
+# @date 2025-11-21
+# @version 1.0
+#
+# 详细描述: 红颜
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-11-21 17:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import IpyGameDataPY
+import PlayerControl
+import PlayerBeauty
+import ChConfig
+
+def OnExec(curPlayer, msgList):
+    
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "重置红颜: Beauty 0 [红颜ID]")
+        GameWorld.DebugAnswer(curPlayer, "设置红颜: Beauty 红颜ID [等级 经验 领奖等级]")
+        GameWorld.DebugAnswer(curPlayer, "红颜时装: Beauty s 时装ID [星级]")
+        GameWorld.DebugAnswer(curPlayer, "演武场胜利数: Arena w 胜利数")
+        GameWorld.DebugAnswer(curPlayer, "副本过关进度: FBPass")
+        return
+    
+    beautyIDList, skinIDList = [], []
+    
+    value1 = msgList[0]
+    if value1 == 0:
+        setBeautyID = msgList[1] if len(msgList) > 1 else 0
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for index in range(ipyDataMgr.GetBeautyCount()):
+            ipyData = ipyDataMgr.GetBeautyByIndex(index)
+            beautyID = ipyData.GetBeautyID()
+            if setBeautyID and setBeautyID != beautyID:
+                continue
+            if not PlayerBeauty.GetBeautyState(curPlayer, beautyID):
+                continue
+            beautyIDList.append(beautyID)
+            
+            ipyDataList = IpyGameDataPY.GetIpyGameDataList("BeautySkin", beautyID)
+            if ipyDataList:
+                for skinIpyData in ipyDataList:
+                    skinID = skinIpyData.GetSkinID()
+                    if not PlayerBeauty.GetBeautySkinState(curPlayer, skinID):
+                        continue
+                    skinIDList.append(skinID)
+                    
+                    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautySkinInfo % skinID, 0)
+                    
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautyLVInfo % beautyID, 0)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautyAwardLV % beautyID, 0)
+            
+        GameWorld.DebugAnswer(curPlayer, "重置红颜OK")
+        
+    elif value1 == "s":
+        skinID = msgList[1] if len(msgList) > 1 else 0
+        star = msgList[2] if len(msgList) > 2 else 0
+        ipyData = IpyGameDataPY.GetIpyGameDataByCondition("BeautySkin", {"SkinID":skinID}, False)
+        if not ipyData:
+            GameWorld.DebugAnswer(curPlayer, "不存在红颜时装skinID:%s" % skinID)
+            return
+        beautyID = ipyData.GetBeautyID()
+        star = min(star, ipyData.GetStarMax())
+        PlayerBeauty.DoBeautyActivate(curPlayer, beautyID)
+        PlayerBeauty.SetBeautySkinState(curPlayer, skinID, 1)
+        PlayerBeauty.SetBeautySkinStar(curPlayer, skinID, star)
+        beautyIDList, skinIDList = [beautyID], [skinID]
+        GameWorld.DebugAnswer(curPlayer, "红颜ID:%s,时装ID:%s,星:%s" % (beautyID, skinID, star))
+        
+    elif value1 > 0:
+        beautyID = value1
+        lv = msgList[1] if len(msgList) > 1 else None
+        exp = msgList[2] if len(msgList) > 2 else 0
+        awardLV = msgList[3] if len(msgList) > 3 else None
+        ipyData = IpyGameDataPY.GetIpyGameData("Beauty", beautyID)
+        if not ipyData:
+            GameWorld.DebugAnswer(curPlayer, "不存在红颜! %s" % beautyID)
+            return
+        quality = ipyData.GetBeautyQuality()
+        
+        PlayerBeauty.DoBeautyActivate(curPlayer, beautyID)
+        if lv == None:
+            lv, exp, awardLV = 0, 0, 0
+            
+        if not IpyGameDataPY.GetIpyGameData("BeautyQualityLV", quality, lv):
+            GameWorld.DebugAnswer(curPlayer, "不存在红颜等级! ID:%s,品质:%s,LV:%s" % (beautyID, quality, lv))
+            return
+        PlayerBeauty.SetBeautyLVInfo(curPlayer, beautyID, lv, exp)
+        lv, exp = PlayerBeauty.GetBeautyLVInfo(curPlayer, beautyID)
+        
+        if awardLV != None:
+            awardLV = min(lv, awardLV)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautyAwardLV % beautyID, awardLV)
+        awardLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautyAwardLV % beautyID)
+        
+        GameWorld.DebugAnswer(curPlayer, "红颜ID:%s, 品质:%s, LV:%s-%s, 奖励LV:%s" % (beautyID, quality, lv, exp, awardLV))
+        beautyIDList = [beautyID]
+        
+    PlayerBeauty.RefreshBeautyAttr(curPlayer)
+    PlayerBeauty.SyncBeautyInfo(curPlayer, beautyIDList, skinIDList)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FBPass.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FBPass.py
new file mode 100644
index 0000000..08d0329
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FBPass.py
@@ -0,0 +1,40 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.FBPass
+#
+# @todo:设置副本过关进度
+# @author hxp
+# @date 2025-11-21
+# @version 1.0
+#
+# 详细描述: 设置副本过关进度
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-11-21 17:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import IpyGameDataPY
+import PlayerControl
+import FBCommon
+import ChConfig
+
+def OnExec(curPlayer, paramList):
+    
+    if not paramList:
+        GameWorld.DebugAnswer(curPlayer, "副本过关进度: FBPass mapID lineID")
+        return
+    mapID = paramList[0]
+    funcLineID = paramList[1] if len(paramList) > 1 else 0
+    
+    if not IpyGameDataPY.GetIpyGameData("FBLine", mapID, funcLineID):
+        GameWorld.DebugAnswer(curPlayer, "不存在该副本线路:%s-%s" % (mapID, funcLineID))
+        return
+    
+    GameWorld.DebugAnswer(curPlayer, "副本过关进度:%s-%s" % (mapID, funcLineID))
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
+    FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID)
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py
deleted file mode 100644
index b902109..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package GM.Commands.FeastTravel
-#
-# @todo:节日游历
-# @author hxp
-# @date 2021-02-01
-# @version 1.0
-#
-# 详细描述: 节日游历
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2021-02-01 15:00"""
-#-------------------------------------------------------------------------------
-
-import GameWorld
-import PlayerControl
-import PlayerFeastTravel
-import IpyGameDataPY
-import ChConfig
-
-
-def __Help(curPlayer):
-    GameWorld.DebugAnswer(curPlayer, "重置所有游历: FeastTravel 0")
-    GameWorld.DebugAnswer(curPlayer, "设置游历点值: FeastTravel 游历值")
-    GameWorld.DebugAnswer(curPlayer, "增加游历进度: FeastTravel 任务ID 增加值")
-    return
-
-## GM命令执行入口
-#  @param curPlayer 当前玩家
-#  @param paramList 参数列表 []
-#  @return None
-#  @remarks 函数详细说明.
-def OnExec(curPlayer, paramList):
-    
-    if not paramList:
-        __Help(curPlayer)
-        return
-    
-    if len(paramList) == 1:
-        # 重置
-        if paramList[0] == 0:
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, 0)
-            
-            ipyMgr = IpyGameDataPY.IPY_Data()
-            # 重置游历任务相关
-            for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
-                taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
-                taskID = taskIpyData.GetTraveTasklD()
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, 0)
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, 0)
-                
-            # 重置游历奖励
-            for index in xrange(ipyMgr.GetActFeastTravelAwardCount()):
-                awardIpyData = ipyMgr.GetActFeastTravelAwardByIndex(index)
-                recordIndex = awardIpyData.GetRecordIndex()
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % recordIndex, 0)
-                
-            GameWorld.DebugAnswer(curPlayer, "重置OK!")
-            
-            PlayerFeastTravel.Sync_FeastTravelPlayerInfo(curPlayer)
-            
-        # 设置游历值
-        else:
-            travelPoint = paramList[0]
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, travelPoint)
-            GameWorld.DebugAnswer(curPlayer, "设置OK!")
-            PlayerFeastTravel.Sync_FeastTravelPlayerInfo(curPlayer, -1, -1)
-            
-    elif len(paramList) == 2:
-        taskID, addValue = paramList
-        if taskID not in ChConfig.FeastTravelTaskIDList:
-            GameWorld.DebugAnswer(curPlayer, "游历任务ID不存在,请查看节日游历任务表!")
-            return
-        
-        if PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, taskID, addValue):
-            GameWorld.DebugAnswer(curPlayer, "成功!")
-        else:
-            GameWorld.DebugAnswer(curPlayer, "失败!请检查是否已达最大完成次数!")
-            
-    else:
-        __Help(curPlayer)
-        return
-    
-    return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
index 8cb4ac3..a61efa6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
@@ -22,6 +22,7 @@
 import GameFuncComm
 import ChConfig
 import ShareDefine
+import PlayerOnline
 
 ## GM命令执行入口
 #  @param curPlayer 当前玩家
@@ -43,7 +44,8 @@
         else:
             openFuncID = cmdList[1] if len(cmdList) > 1 else 0
             DoGMOpenFunc(curPlayer, openFuncID)
-            
+        PlayerOnline.GetOnlinePlayer(curPlayer).ReCalcAllAttr()
+        
     PrintFuncOpenState(curPlayer)
     return
 
@@ -121,7 +123,7 @@
             
     GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s" % needMissionIDList, curPlayer.GetPlayerID())
     #最后强制触发一次
-    GameFuncComm.DoFuncOpenLogic(curPlayer)
+    GameFuncComm.DoFuncOpenLogic(curPlayer, checkServerDay=False)
     return
 
 def __GetOpenFuncLimit(curPlayer, openFuncIDList):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
new file mode 100644
index 0000000..57cea70
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.ServerDay
+#
+# @todo:服务器天
+# @author hxp
+# @date 2025-11-25
+# @version 1.0
+#
+# 详细描述: 服务器天
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-11-25 19:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import ShareDefine
+import GameWorldEvent
+import PlayerSignDay
+import GameFuncComm
+import DBDataMgr
+import ChPlayer
+
+import time
+
+def OnExec(curPlayer, cmdList):
+    
+    if not cmdList:
+        GameWorld.DebugAnswer(curPlayer, "设置开服天: ServerDay 第几天")
+        GameWorld.DebugAnswer(curPlayer, "重置开服天: ServerDay 1")
+        __printServerDay(curPlayer)
+        return
+    
+    value = cmdList[0]
+    
+    if value <= 1:
+        __clearOpenServerDay(curPlayer)
+    elif value > 1:
+        __setOpenServerDay(curPlayer, value)
+        
+    GameFuncComm.DoFuncOpenLogic(curPlayer)
+    __printServerDay(curPlayer)
+    ChPlayer.Sync_OpenServerDay(curPlayer)
+    return True
+
+def __printServerDay(curPlayer):
+    ServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
+    IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
+    MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay) + 1
+    OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
+    GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s' % (OpenWeekday, ServerDay, IsMixServer, MixDay))
+    return
+
+def __clearOpenServerDay(curPlayer):
+    #重置开服天,设置非合服
+    GameWorld.DebugAnswer(curPlayer, "重置开服天")
+    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_ServerWeek, 0)
+    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_ServerDay, 0)
+    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_IsMixServer, 0)
+    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_MixServerDay, 0)
+    
+    curTime = int(time.time())
+    GameWorldEvent.SetInitOpenServerTime(curTime)
+    
+    PlayerSignDay.ResetDaySign(curPlayer)
+    return
+
+def __setOpenServerDay(curPlayer, serverDay):
+    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_ServerDay, serverDay - 1)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
index c164703..f9e8542 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -44,18 +44,22 @@
         PlayerTask.__giveNewTask(curPlayer, taskGroup)
         return
     
-    taskValue = paramList[1] if len(paramList) > 1 else 0
+    taskValue = paramList[1] if len(paramList) > 1 else None
     ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID)
     if not ipyData:
         GameWorld.DebugAnswer(curPlayer, "该任务ID不存在:%s" % taskID)
         return
     taskGroup = ipyData.GetTaskGroup()
+    taskType = ipyData.GetTaskType()
     needValue = ipyData.GetNeedValue()
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, taskID)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, taskValue)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, ChConfig.TaskState_Doing)
-    PlayerTask.SetTaskValue(curPlayer, ipyData, taskValue)
-    
+    if taskValue == None:
+        PlayerTask.UpdTaskValue(curPlayer, taskType)
+    else:
+        PlayerTask.SetTaskValue(curPlayer, ipyData, taskValue)
+        
     curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
     GameWorld.DebugAnswer(curPlayer, "设置任务ID:%s  进度:%s/%s" % (taskID, curValue, needValue))
     return
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/GameWorldLogic/FBProcess/GameLogic_Arena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py
index fb0c287..e0ec257 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py
@@ -25,9 +25,11 @@
 import PlayerBillboard
 import PlayerZhanling
 import ItemControler
+import PlayerBeauty
 import PlayerArena
 import PlayerGubao
 import PyGameData
+import PlayerTask
 import FBCommon
 import ChConfig
 
@@ -66,6 +68,8 @@
     
     if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket, 1):
         return
+    
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ArenaBattle)
     
     return True, funcLineID
 
@@ -125,7 +129,13 @@
         GameWorld.DebugLog("scoreIndex=%s,winScoreInfo=%s" % (scoreIndex, winScoreInfo), playerID)
         
     # 无论胜负,只要挑战都给固定奖励
-    awardItemList = IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 4)
+    awardItemList = []
+    awardItemList += IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 4)
+    exItemRate, exItemID = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_ArenaItemEx) # 概率额外获得1个物品
+    if exItemRate and exItemID:
+        if GameWorld.CanHappen(exItemRate):
+            awardItemList.append([exItemID, 1])
+            GameWorld.DebugLog("红颜概率额外获得1个物品: exItemRate=%s, exItemID=%s, awardItemList=%s" % (exItemRate, exItemID, awardItemList))
     overMsg.update({"tagPlayerID":tagPlayerID, "atkAddScore":atkAddScore, "defDecScore":defDecScore,
                     FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList)})
     
@@ -142,6 +152,11 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore)
     GameWorld.DebugLog("score=%s,atkAddScore=%s,updScore=%s" % (score, atkAddScore, updScore), playerID)
     
+    if isWin:
+        winCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaWinCnt)
+        updWinCnt = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaWinCnt, winCnt + 1)
+        GameWorld.DebugLog("updWinCnt=%s" % (updWinCnt), playerID)
+        
     tagViewCache = turnFight.tagViewCache
     gameRecMgr = DBDataMgr.GetGameRecMgr()
     atkRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_ArenaRecord, playerID)
@@ -208,7 +223,7 @@
         return
     
     tagPlayerID, isWin, atkAddScore, defDecScore, awardItemList = awardData
-    
+    GameWorld.DebugLog("竞技场结算奖励: tagPlayerID=%s,isWin=%s,atkAddScore=%s,defDecScore=%s,awardItemList=%s" % (tagPlayerID, isWin, atkAddScore, defDecScore, awardItemList))
     if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket, 1):
         return
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
index 3829f22..1d50672 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
@@ -26,6 +26,7 @@
 import ItemControler
 import IPY_GameWorld
 import NetPackCommon
+import PlayerBeauty
 import PlayerArena
 import PlayerLLMJ
 import ItemCommon
@@ -121,12 +122,18 @@
     # 其他战利品掉落
     bootyDropNeedDict = IpyGameDataPY.GetFuncEvalCfg("MainBootyDrop", 1, {})
     bootyDropCntDict = IpyGameDataPY.GetFuncEvalCfg("MainBootyDrop", 2, {})
-    for itemID, dropUpper in DailyBootyUpperList:
+    for itemID, baseUpper in DailyBootyUpperList:
         if spaceCount <= 0:
             GameWorld.DebugLog("掉落背包已满!", playerID)
             break
-        if dropUpper <= 0:
+        if baseUpper <= 0:
             continue
+        dropUpper = baseUpper
+        addPer = 0
+        addPer += PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_BootyPer)[0] # 战利品上限提高百分比
+        if addPer:
+            dropUpper = int(baseUpper * (100 + addPer) / 100.0)
+            GameWorld.DebugLog("红颜提高战利品掉落上限: itemID=%s,baseUpper=%s,addPer=%s,dropUpper=%s" % (itemID, baseUpper, addPer, dropUpper))
         todyDropCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BootyDropToday % itemID)
         if todyDropCnt >= dropUpper:
             GameWorld.DebugLog("战利品已达今日掉落上限! itemID=%s,todyDropCnt=%s >= %s" % (itemID, todyDropCnt, dropUpper), playerID)
@@ -152,6 +159,7 @@
                 curMoney = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket)
                 storeMax = PlayerArena.GetArenaTicketStoreMax(curPlayer)
                 if curMoney >= storeMax:
+                    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntBooty % itemID, 0)
                     GameWorld.DebugLog("挑战券已达存储上限! itemID=%s,curMoney=%s >= %s" % (itemID, curMoney, storeMax), playerID)
                     continue
                 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevelBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevelBoss.py
index 91b8967..52ba12f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevelBoss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevelBoss.py
@@ -19,8 +19,9 @@
 import IpyGameDataPY
 import PlayerControl
 import ItemControler
-
+import PlayerTask
 import FBCommon
+import ChConfig
 
 def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
     ## 回合战斗请求 
@@ -59,6 +60,10 @@
         GameWorld.DebugLog("最后一波未通过,无法挑战本关boss! passWave=%s < %s" % (wave, waveMax))
         return
     
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChallengeLVID, levelID)
+    
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MainLevelChallenge)
+    
     return True, levelID
 
 def GetFBNPCLineupInfo(curPlayer, mapID, funcLineID):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py
index f5d9a48..1cdb7fb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py
@@ -25,6 +25,7 @@
 import NetPackCommon
 import IpyGameDataPY
 import ShareDefine
+import PlayerTask
 import PlayerMail
 import DBDataMgr
 import TurnSkill
@@ -81,6 +82,7 @@
         GameWorld.DebugLog("非今日天子考验! mapID=%s,funcLineID=%s != %s,bossID=%s" % (mapID, funcLineID, lineID, bossID))
         return
     
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBTianzi)
     return True, funcLineID
 
 def GetFBNPCInitAttr(curPlayer, turnFight, npcObj):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py
index 542529b..b88a642 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py
@@ -17,7 +17,10 @@
 
 import GameWorld
 import ItemControler
+import PlayerBeauty
 import FBCommon
+import PlayerTask
+import ChConfig
 
 def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
     ## 回合战斗请求 
@@ -64,6 +67,8 @@
     FBCommon.AddEnterFBCount(curPlayer, mapID, isFree=True)
     FBCommon.SetFBPass(curPlayer, mapID, funcLineID)
     ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Zhanchui", False, {}], isNotifyAward=False)
+    
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBZhanchui)
     return
     
 def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, dataEx):
@@ -74,13 +79,35 @@
 def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, dataEx, askRet):
     ## 扫荡结果,次数消耗已在外层处理扣除
     
-    itemList = FBCommon.GetSweepAwardList(mapID, lineID, sweepCnt)
-    GameWorld.DebugLog("白骨盈野扫荡: mapID=%s,lineID=%s,sweepCnt=%s" % (mapID, lineID, sweepCnt))
+    itemList = []
+    itemList += FBCommon.GetSweepAwardList(mapID, lineID, sweepCnt)
+    GameWorld.DebugLog("白骨盈野扫荡: mapID=%s,lineID=%s,sweepCnt=%s,itemList=%s" % (mapID, lineID, sweepCnt, itemList))
     
+    addPer = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_FBZhanchuiAwardPer)[0] # 扫荡奖励百分比
+    if addPer:
+        GameWorld.DebugLog("红颜额外增加扫荡奖励百分比: %s, itemList=%s" % (addPer, itemList))
+        itemListEx = []
+        for itemInfo in itemList:
+            itemID = itemInfo[0]
+            itemCount = itemInfo[1]
+            addCount = int(itemCount * addPer / 100.0)
+            if addCount > 0:
+                itemListEx.append([itemID, addCount, 1]) # 标记是红颜效果额外获得的
+        itemList += itemListEx
+        GameWorld.DebugLog("itemListEx=%s,itemList=%s" % (itemListEx, itemList))
+        
     ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Zhanchui", False, {}], isNotifyAward=False)
     
     isPass = 1
-    overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), FBCommon.Over_isSweep:1}
+    jsonItemList = []
+    for itemInfo in itemList:
+        itemID = itemInfo[0]
+        itemCount = itemInfo[1]
+        itemDict = {"ItemID":itemInfo[0], "Count":itemInfo[1]}
+        if len(itemInfo) > 2:
+            itemDict['BeautyEx'] = itemInfo[2]
+        jsonItemList.append(itemDict)
+    overDict = {FBCommon.Over_itemInfo:jsonItemList, FBCommon.Over_isSweep:1}
     FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
     
     return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index c16c9d1..c408770 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -249,6 +249,8 @@
                         ("DWORD", "Quality", 1),
                         ("DWORD", "HeroLV", 1),
                         ("list", "UPCostItem", 0),
+                        ("list", "AttrIDList", 0),
+                        ("list", "AttrValueList", 0),
                         ),
 
                 "LineupRecommend":(
@@ -795,6 +797,59 @@
                         ("list", "LVUPNeedItemInfo", 0),
                         ),
 
+                "Beauty":(
+                        ("WORD", "BeautyID", 1),
+                        ("BYTE", "BeautyQuality", 0),
+                        ("BYTE", "UnlockWay", 0),
+                        ("DWORD", "UnlockValue", 0),
+                        ("BYTE", "UnlockNeedCnt", 0),
+                        ("list", "TalentAttrIDList", 0),
+                        ("list", "TalentAttrValueList", 0),
+                        ("list", "TalentPerLVAddList", 0),
+                        ("BYTE", "EffType", 0),
+                        ("BYTE", "EffTypeValue", 0),
+                        ("BYTE", "EffValue", 0),
+                        ("DWORD", "EffPerLVAdd", 0),
+                        ),
+
+                "BeautyQualityLV":(
+                        ("BYTE", "BeautyQuality", 1),
+                        ("WORD", "BeautyLV", 1),
+                        ("WORD", "LVNeedExp", 0),
+                        ("list", "AttrIDList", 0),
+                        ("list", "AttrValueList", 0),
+                        ("list", "AwardItemList", 0),
+                        ),
+
+                "BeautySkin":(
+                        ("WORD", "SkinID", 0),
+                        ("WORD", "BeautyID", 1),
+                        ("BYTE", "UnlockWay", 0),
+                        ("DWORD", "UnlockValue", 0),
+                        ("BYTE", "UnlockNeedCnt", 0),
+                        ("BYTE", "UpNeedCnt", 0),
+                        ("BYTE", "StarMax", 0),
+                        ("list", "AttrIDList", 0),
+                        ("list", "InitAttrValueList", 0),
+                        ("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),
@@ -1185,16 +1240,6 @@
                         ("dict", "Reward", 0),
                         ("BYTE", "VIPLimit", 0),
                         ("list", "VIPAward", 0),
-                        ),
-
-                "XBXZ":(
-                        ("DWORD", "ID", 1),
-                        ("BYTE", "Type", 0),
-                        ("DWORD", "NeedCnt", 0),
-                        ("list", "Condition", 0),
-                        ("WORD", "MWID", 0),
-                        ("list", "AwardItem", 0),
-                        ("list", "Money", 0),
                         ),
 
                 "TreasureSet":(
@@ -1884,30 +1929,6 @@
                         ("char", "WorldNotifyKey", 0),
                         ),
 
-                "ActFeastTravel":(
-                        ("DWORD", "CfgID", 1),
-                        ("char", "StartDate", 0),
-                        ("char", "EndDate", 0),
-                        ("WORD", "LVLimit", 0),
-                        ("BYTE", "ResetType", 0),
-                        ("dict", "TemplateIDInfo", 0),
-                        ),
-
-                "ActFeastTravelTask":(
-                        ("BYTE", "TraveTasklD", 1),
-                        ("WORD", "FinishNeedValue", 0),
-                        ("WORD", "FinishTimeMax", 0),
-                        ("BYTE", "AddTravelPoint", 0),
-                        ),
-
-                "ActFeastTravelAward":(
-                        ("BYTE", "TemplatelD", 1),
-                        ("BYTE", "RecordIndex", 0),
-                        ("WORD", "NeedTravelPoint", 0),
-                        ("BYTE", "AwardCountMax", 0),
-                        ("list", "TravelAwardInfo", 0),
-                        ),
-
                 "ActFeastWeekParty":(
                         ("DWORD", "CfgID", 1),
                         ("char", "StartDate", 0),
@@ -2118,12 +2139,6 @@
                         ("DWORD", "NeedExp", 0),
                         ("dict", "AttrInfo", 0),
                         ("BYTE", "SkinIndex", 0),
-                        ),
-
-                "AssistThanksGift":(
-                        ("DWORD", "GiftID", 1),
-                        ("list", "RequestPlayerAward", 0),
-                        ("list", "AssistPlayerAward", 0),
                         ),
 
                 "FuncSysPrivilege":(
@@ -2508,7 +2523,9 @@
         
     def GetQuality(self): return self.attrTuple[0] # 品质 DWORD
     def GetHeroLV(self): return self.attrTuple[1] # 武将等级 DWORD
-    def GetUPCostItem(self): return self.attrTuple[2] #  升级到下级消耗道具 list
+    def GetUPCostItem(self): return self.attrTuple[2] #  升级到下级消耗道具 list
+    def GetAttrIDList(self): return self.attrTuple[3] #  武将属性ID列表 list
+    def GetAttrValueList(self): return self.attrTuple[4] #  累计总属性值列表 list
 
 # 推荐阵容表
 class IPY_LineupRecommend():
@@ -3319,6 +3336,84 @@
     def GetLessEqualLV(self): return self.attrTuple[1] # 小于等于等级 BYTE
     def GetLVUPNeedItemInfo(self): return self.attrTuple[2] # 升级所需物品 [[物品ID,个数], ...] list
 
+# 红颜表
+class IPY_Beauty():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetBeautyID(self): return self.attrTuple[0] # 红颜ID WORD
+    def GetBeautyQuality(self): return self.attrTuple[1] # 品质 BYTE
+    def GetUnlockWay(self): return self.attrTuple[2] # 解锁方式 BYTE
+    def GetUnlockValue(self): return self.attrTuple[3] # 解锁方式值 DWORD
+    def GetUnlockNeedCnt(self): return self.attrTuple[4] # 解锁所需个数 BYTE
+    def GetTalentAttrIDList(self): return self.attrTuple[5] # 天赋属性ID列表 list
+    def GetTalentAttrValueList(self): return self.attrTuple[6] # 天赋属性初始值 list
+    def GetTalentPerLVAddList(self): return self.attrTuple[7] # 天赋属性每级成长 list
+    def GetEffType(self): return self.attrTuple[8] # 天赋效果类型 BYTE
+    def GetEffTypeValue(self): return self.attrTuple[9] # 效果类型值 BYTE
+    def GetEffValue(self): return self.attrTuple[10] # 效果初始值 BYTE
+    def GetEffPerLVAdd(self): return self.attrTuple[11] # 天赋效果每级成长 DWORD
+
+# 红颜品质升级表
+class IPY_BeautyQualityLV():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetBeautyQuality(self): return self.attrTuple[0] # BYTE
+    def GetBeautyLV(self): return self.attrTuple[1] # WORD
+    def GetLVNeedExp(self): return self.attrTuple[2] # 升到本级所需经验 WORD
+    def GetAttrIDList(self): return self.attrTuple[3] # 本级属性ID列表 list
+    def GetAttrValueList(self): return self.attrTuple[4] # 本级属性值列表 list
+    def GetAwardItemList(self): return self.attrTuple[5] # 本级奖励 list
+
+# 红颜时装表
+class IPY_BeautySkin():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetSkinID(self): return self.attrTuple[0] # 时装ID WORD
+    def GetBeautyID(self): return self.attrTuple[1] # WORD
+    def GetUnlockWay(self): return self.attrTuple[2] # 解锁方式 BYTE
+    def GetUnlockValue(self): return self.attrTuple[3] # 解锁方式值 DWORD
+    def GetUnlockNeedCnt(self): return self.attrTuple[4] # 解锁所需个数 BYTE
+    def GetUpNeedCnt(self): return self.attrTuple[5] # 升级所需个数 BYTE
+    def GetStarMax(self): return self.attrTuple[6] # 最高星级 BYTE
+    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():
     
@@ -3900,21 +3995,6 @@
     def GetReward(self): return self.attrTuple[3] # 奖励 {"职业":[[物品ID,个数],...], ...} dict
     def GetVIPLimit(self): return self.attrTuple[4] # 需要VIP几 BYTE
     def GetVIPAward(self): return self.attrTuple[5] # vip奖励[[物品ID,个数],...] list
-
-# 仙宝寻主表
-class IPY_XBXZ():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetID(self): return self.attrTuple[0] # ID DWORD
-    def GetType(self): return self.attrTuple[1] # 类型 BYTE
-    def GetNeedCnt(self): return self.attrTuple[2] # 需要数量 DWORD
-    def GetCondition(self): return self.attrTuple[3] # 条件 list
-    def GetMWID(self): return self.attrTuple[4] # 法宝ID WORD
-    def GetAwardItem(self): return self.attrTuple[5] # 奖励物品列表 list
-    def GetMoney(self): return self.attrTuple[6] # 金钱 list
 
 # 寻宝设定表
 class IPY_TreasureSet():
@@ -4973,45 +5053,6 @@
     def GetGoodItemIDList(self): return self.attrTuple[3] # 需要广播的物品ID列表 [物品ID, ...] list
     def GetWorldNotifyKey(self): return self.attrTuple[4] # 全服广播key,参数(玩家名, 物品ID, 物品数据, 个数,) char
 
-# 节日游历时间表
-class IPY_ActFeastTravel():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD
-    def GetStartDate(self): return self.attrTuple[1] # 开启日期 char
-    def GetEndDate(self): return self.attrTuple[2] # 结束日期 char
-    def GetLVLimit(self): return self.attrTuple[3] # 限制等级 WORD
-    def GetResetType(self): return self.attrTuple[4] # 重置类型,0-0点重置;1-5点重置 BYTE
-    def GetTemplateIDInfo(self): return self.attrTuple[5] # 模板信息 {(世界等级A,B):模板编号, ...} dict
-
-# 节日游历任务表
-class IPY_ActFeastTravelTask():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetTraveTasklD(self): return self.attrTuple[0] # 游历ID BYTE
-    def GetFinishNeedValue(self): return self.attrTuple[1] # 完成所需进度值 WORD
-    def GetFinishTimeMax(self): return self.attrTuple[2] # 总可完成次数,0不限 WORD
-    def GetAddTravelPoint(self): return self.attrTuple[3] # 完成次数获得游历值 BYTE
-
-# 节日游历奖励表
-class IPY_ActFeastTravelAward():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetTemplatelD(self): return self.attrTuple[0] # 奖励模板ID BYTE
-    def GetRecordIndex(self): return self.attrTuple[1] # 奖励记录索引 BYTE
-    def GetNeedTravelPoint(self): return self.attrTuple[2] # 领奖所需游历值 WORD
-    def GetAwardCountMax(self): return self.attrTuple[3] # 可领取次数,0代表不限 BYTE
-    def GetTravelAwardInfo(self): return self.attrTuple[4] # 游历奖励 [[物品ID,个数,是否拍品], ...] list
-
 # 节日巡礼活动时间表
 class IPY_ActFeastWeekParty():
     
@@ -5354,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():
     
@@ -5631,6 +5661,11 @@
         self.__LoadFileData("GubaoResonance", onlyCheck)
         self.__LoadFileData("GubaoStar", onlyCheck)
         self.__LoadFileData("GubaoLV", onlyCheck)
+        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)
@@ -5669,7 +5704,6 @@
         self.__LoadFileData("CTGSelectItem", onlyCheck)
         self.__LoadFileData("FirstCharge", onlyCheck)
         self.__LoadFileData("LVAward", onlyCheck)
-        self.__LoadFileData("XBXZ", onlyCheck)
         self.__LoadFileData("TreasureSet", onlyCheck)
         self.__LoadFileData("TreasureHouse", onlyCheck)
         self.__LoadFileData("TreasureItemLib", onlyCheck)
@@ -5744,9 +5778,6 @@
         self.__LoadFileData("ActFeastWish", onlyCheck)
         self.__LoadFileData("ActFeastWishBottle", onlyCheck)
         self.__LoadFileData("ActFeastWishPool", onlyCheck)
-        self.__LoadFileData("ActFeastTravel", onlyCheck)
-        self.__LoadFileData("ActFeastTravelTask", onlyCheck)
-        self.__LoadFileData("ActFeastTravelAward", onlyCheck)
         self.__LoadFileData("ActFeastWeekParty", onlyCheck)
         self.__LoadFileData("FeastWeekParty", onlyCheck)
         self.__LoadFileData("NewAllPeopleParty", onlyCheck)
@@ -5773,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)
@@ -6494,6 +6524,41 @@
         self.CheckLoadData("GubaoLV")
         return self.ipyGubaoLVCache[index]
 
+    def GetBeautyCount(self):
+        self.CheckLoadData("Beauty")
+        return self.ipyBeautyLen
+    def GetBeautyByIndex(self, index):
+        self.CheckLoadData("Beauty")
+        return self.ipyBeautyCache[index]
+
+    def GetBeautyQualityLVCount(self):
+        self.CheckLoadData("BeautyQualityLV")
+        return self.ipyBeautyQualityLVLen
+    def GetBeautyQualityLVByIndex(self, index):
+        self.CheckLoadData("BeautyQualityLV")
+        return self.ipyBeautyQualityLVCache[index]
+
+    def GetBeautySkinCount(self):
+        self.CheckLoadData("BeautySkin")
+        return self.ipyBeautySkinLen
+    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")
         return self.ipyPlayerLVLen
@@ -6759,13 +6824,6 @@
     def GetLVAwardByIndex(self, index):
         self.CheckLoadData("LVAward")
         return self.ipyLVAwardCache[index]
-
-    def GetXBXZCount(self):
-        self.CheckLoadData("XBXZ")
-        return self.ipyXBXZLen
-    def GetXBXZByIndex(self, index):
-        self.CheckLoadData("XBXZ")
-        return self.ipyXBXZCache[index]
 
     def GetTreasureSetCount(self):
         self.CheckLoadData("TreasureSet")
@@ -7285,27 +7343,6 @@
         self.CheckLoadData("ActFeastWishPool")
         return self.ipyActFeastWishPoolCache[index]
 
-    def GetActFeastTravelCount(self):
-        self.CheckLoadData("ActFeastTravel")
-        return self.ipyActFeastTravelLen
-    def GetActFeastTravelByIndex(self, index):
-        self.CheckLoadData("ActFeastTravel")
-        return self.ipyActFeastTravelCache[index]
-
-    def GetActFeastTravelTaskCount(self):
-        self.CheckLoadData("ActFeastTravelTask")
-        return self.ipyActFeastTravelTaskLen
-    def GetActFeastTravelTaskByIndex(self, index):
-        self.CheckLoadData("ActFeastTravelTask")
-        return self.ipyActFeastTravelTaskCache[index]
-
-    def GetActFeastTravelAwardCount(self):
-        self.CheckLoadData("ActFeastTravelAward")
-        return self.ipyActFeastTravelAwardLen
-    def GetActFeastTravelAwardByIndex(self, index):
-        self.CheckLoadData("ActFeastTravelAward")
-        return self.ipyActFeastTravelAwardCache[index]
-
     def GetActFeastWeekPartyCount(self):
         self.CheckLoadData("ActFeastWeekParty")
         return self.ipyActFeastWeekPartyLen
@@ -7487,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/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index 79539df..74383d5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -2005,11 +2005,11 @@
         return False
     
     if isAuctionItem:
-        ipyData = None #IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
-        if not ipyData:
-            GameWorld.ErrLog("非拍卖物品,默认转为非拍品! itemID=%s,itemCount=%s,isAuctionItem=%s" 
-                             % (itemID, itemCount, isAuctionItem), curPlayer.GetPlayerID())
-            isAuctionItem = 0
+        #ipyData = None #IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
+        #if not ipyData:
+        #    GameWorld.ErrLog("非拍卖物品,默认转为非拍品! itemID=%s,itemCount=%s,isAuctionItem=%s" 
+        #                     % (itemID, itemCount, isAuctionItem), curPlayer.GetPlayerID())
+        isAuctionItem = 0
     
     defaultPack = IPY_GameWorld.rptItem if not packIndexList else packIndexList[0]
     packIndex = ChConfig.GetItemPackType(curItemData, defaultPack)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 6add269..7cf92c1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -49,7 +49,6 @@
 import PlayerTongTianLing
 import CrossPlayerData
 import PlayerFeastWish
-import PlayerFeastTravel
 import PlayerWeekParty
 import NPCRealmRefresh
 import PlayerActLogin
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 cff0141..1107e1b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -56,7 +56,6 @@
 import PlayerBossReborn
 import PlayerWeekParty
 import PlayerFeastWeekParty
-import PlayerFeastTravel
 import PlayerFeastLogin
 import PlayerFeastWish
 import PlayerActLogin
@@ -131,6 +130,8 @@
 import PlayerTalk
 import PlayerHero
 import PlayerOnline
+import PlayerBeauty
+import PlayerTravel
 import TurnAttack
 import PlayerHJG
 import ObjPool
@@ -636,8 +637,6 @@
     PlayerFeastLogin.OnPlayerLogin(curPlayer)
     # 节日祝福活动
     PlayerFeastWish.OnPlayerLogin(curPlayer)
-    # 节日游历活动
-    PlayerFeastTravel.OnPlayerLogin(curPlayer)
     # 登录奖励活动
     PlayerActLogin.OnLogin(curPlayer)
     # 炼器活动
@@ -732,6 +731,8 @@
         UpdatePlayerName.OnPlayerLogin(curPlayer)
         PlayerActivity.OnPlayerLogin(curPlayer)
         PlayerLLMJ.OnPlayerLogin(curPlayer)
+        PlayerBeauty.OnPlayerLogin(curPlayer)
+        PlayerTravel.OnPlayerLogin(curPlayer)
         
         # 上线查询一次充值订单
         curPlayer.SendDBQueryRecharge()
@@ -3113,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)
@@ -3233,6 +3186,9 @@
     # 功能开启奖励
     elif rewardType == ChConfig.Def_RewardType_OpenFunc:
         GameFuncComm.GetFuncOpenAward(curPlayer, dataEx)
+    # 红颜等级奖励
+    elif rewardType == ChConfig.Def_RewardType_BeautyLVAward:
+        PlayerBeauty.GetBeautyLVAward(curPlayer, dataEx)
         
         
     # 每日免费直购礼包
@@ -3283,9 +3239,6 @@
     # 领取节日登录奖励
     elif rewardType == ChConfig.Def_RewardType_FeastLogin:
         PlayerFeastLogin.GetFeastLoginAward(curPlayer, dataEx)
-    # 领取节日游历奖励
-    elif rewardType == ChConfig.Def_RewardType_FeastTravel:
-        PlayerFeastTravel.GetFeastTravelAward(curPlayer, dataEx)
     # 领取登录活动奖励
     elif rewardType == ChConfig.Def_RewardType_ActLoginAwardNew:
         PlayerActLoginNew.OnGetActLoginAward(curPlayer, dataEx, dataExStr)
@@ -3400,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..e88407c 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,11 +44,12 @@
                      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)
 
-def DoFuncOpenLogic(curPlayer):
+def DoFuncOpenLogic(curPlayer, checkServerDay=True):
     '''执行触发功能开启逻辑
     @param finishMissionIDList: 完成的任务ID列表
     '''
@@ -87,7 +87,7 @@
             continue
         
         limitOpenDay = ipyData.GetLimitOpenDay()
-        if limitOpenDay and serverDay < limitOpenDay:
+        if limitOpenDay and serverDay < limitOpenDay and checkServerDay:
             continue
         
         # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
index 76ecda7..92bd1af 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
@@ -373,5 +373,6 @@
 def Sync_ArenaInfo(curPlayer):
     clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCArenaPlayerInfo)
     clientPack.Score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore)
+    clientPack.WinCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaWinCnt)
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
new file mode 100644
index 0000000..7c358e6
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
@@ -0,0 +1,626 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerBeauty
+#
+# @todo:红颜
+# @author hxp
+# @date 2025-11-21
+# @version 1.0
+#
+# 详细描述: 红颜
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-11-21 17:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameWorld
+import ItemCommon
+import PlayerOnline
+import PlayerControl
+import IpyGameDataPY
+import ChPyNetSendPack
+import PlayerGoldRush
+import NetPackCommon
+import ItemControler
+import PyGameData
+import PlayerTask
+import FBCommon
+import ObjPool
+
+# 红颜解锁方式
+(
+UnlockWay_Item, # 物品解锁 1
+UnlockWay_TaskID, # 完成主线任务ID 2
+UnlockWay_ArenaWinCnt, # 演武场胜利次数 3
+UnlockWay_GoldRushWorker, # 拥有监工数量 4
+UnlockWay_FBZhanchui, # 白骨盈野过关 5
+UnlockWay_OfficialRank, # 官职达到 6
+UnlockWay_TravelCnt, # 游历次数 7
+) = range(1, 1 + 7)
+
+# 皮肤解锁方式
+UnlockWaySkin_Default = 1 # 默认解锁 1
+UnlockWaySkin_Item = 2 # 物品解锁 2
+
+# 红颜效果类型
+(
+EffType_BootyPer, # 1. 主线战利品上限提高百分比(对所有主线战利品生效)  Value:百分比
+EffType_ArenaItemEx, # 2. 演武场挑战胜利,概率额外获得1个物品的概率    TypeValue:物品ID  Value:概率
+EffType_TravelEnergy, # 3.游历体力上限增加     Value:增加上限
+EffType_FBZhanchuiAwardPer, # 4.白骨盈野扫荡奖励增加百分比     Value:百分比
+) = range(1, 1 + 4)
+
+def OnPlayerLogin(curPlayer):
+    SyncBeautyInfo(curPlayer)
+    return
+
+## Def_PDict_BeautyLVInfo 经验*10000+等级*10+是否已激活
+def GetBeautyState(curPlayer, beautyID):
+    ## 红颜激活状态
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautyLVInfo % beautyID) % 10
+def SetBeautyState(curPlayer, beautyID, state):
+    ## 设置红颜激活状态
+    lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautyLVInfo % beautyID)
+    lvInfo = lvInfo / 10 * 10 + min(1, state)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautyLVInfo % beautyID, lvInfo)
+    return lvInfo
+def GetBeautyLVInfo(curPlayer, beautyID):
+    ## 获取红颜等级经验
+    lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautyLVInfo % beautyID)
+    exp = lvInfo / 10000
+    lv = lvInfo % 10000 / 10
+    return lv, exp
+def SetBeautyLVInfo(curPlayer, beautyID, lv, exp):
+    lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautyLVInfo % beautyID)
+    lvInfo = min(exp, 200000) * 10000 + min(lv, 999) * 10 + lvInfo % 10
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautyLVInfo % beautyID, lvInfo)
+    return lvInfo
+
+## Def_PDict_BeautySkinInfo 星级*100+是否使用+是否已激活
+def GetBeautySkinState(curPlayer, skinID):
+    ## 红颜时装激活状态
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautySkinInfo % skinID) % 10
+def SetBeautySkinState(curPlayer, skinID, state):
+    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautySkinInfo % skinID)
+    info = info / 10 * 10 + min(1, state)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautySkinInfo % skinID, info)
+    return info
+def GetBeautySkinUsed(curPlayer, skinID):
+    ## 是否使用中
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautySkinInfo % skinID) % 100 / 10
+def SetBeautySkinUsed(curPlayer, skinID, isUsed):
+    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautySkinInfo % skinID)
+    info = info / 100 * 100 + min(1, isUsed) * 10 + info % 10
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautySkinInfo % skinID, info)
+    return info
+def GetBeautySkinStar(curPlayer, skinID):
+    ## 红颜时装星级
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautySkinInfo % skinID) / 100
+def SetBeautySkinStar(curPlayer, skinID, star):
+    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautySkinInfo % skinID)
+    info = star * 100 + info % 100
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautySkinInfo % skinID, info)
+    return info
+
+def IsBeautySkinCanUse(curPlayer, beautyID, skinID, ipyData=None):
+    ## 红颜时装是否可用
+    if GetBeautySkinState(curPlayer, skinID):
+        return True
+    
+    if not ipyData:
+        ipyData = GetBeautySkinIpyData(curPlayer, beautyID, skinID)
+    if ipyData:
+        unlockWay = ipyData.GetUnlockWay()
+        if unlockWay == UnlockWaySkin_Default: # 默认激活的
+            return True
+        
+    return False
+
+#// B2 19 红颜激活 #tagCSBeautyActivate
+#
+#struct    tagCSBeautyActivate
+#{
+#    tagHead         Head;
+#    WORD        BeautyID;    //红颜ID
+#};
+def OnBeautyActivate(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    beautyID = curPackData.BeautyID
+    
+    if GetBeautyState(curPlayer, beautyID):
+        GameWorld.DebugLog("红颜已经激活过! beautyID=%s" % beautyID, playerID)
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("Beauty", beautyID)
+    if not ipyData:
+        return
+    
+    unlockWay = ipyData.GetUnlockWay()
+    unlockValue = ipyData.GetUnlockValue()
+    unlockNeedCnt = ipyData.GetUnlockNeedCnt()
+    
+    if unlockWay == UnlockWay_Item:
+        needItemID = unlockValue
+        needItemCnt = unlockNeedCnt
+        itemCount = ItemControler.GetItemCountByID(curPlayer, needItemID)
+        if itemCount < needItemCnt:
+            GameWorld.DebugLog("激活红颜物品不足! beautyID=%s,needItemID=%s,itemCount=%s < %s" % (beautyID, needItemID, itemCount, needItemCnt), playerID)
+            return
+        ItemControler.DelItemCountByID(curPlayer, needItemID, needItemCnt)
+        
+    elif unlockWay == UnlockWay_TaskID:
+        taskID = unlockValue
+        if not PlayerTask.IsTaskFinish(curPlayer, taskID):
+            GameWorld.DebugLog("激活红颜所需任务未完成! beautyID=%s,taskID=%s" % (beautyID, taskID), playerID)
+            return
+        
+    elif unlockWay == UnlockWay_ArenaWinCnt:
+        needWinCnt = unlockNeedCnt
+        winCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaWinCnt)
+        if winCnt < needWinCnt:
+            GameWorld.DebugLog("激活红颜所需演武场胜利次数不足! beautyID=%s,winCnt=%s < %s" % (beautyID, winCnt, needWinCnt), playerID)
+            return
+        
+    elif unlockWay == UnlockWay_GoldRushWorker:
+        needWorkerCnt = unlockNeedCnt
+        workerTotal = PlayerGoldRush.GetWorkerTotal(curPlayer)
+        if workerTotal < needWorkerCnt:
+            GameWorld.DebugLog("激活红颜所需监工不足! beautyID=%s,workerTotal=%s < %s" % (beautyID, workerTotal, needWorkerCnt), playerID)
+            return
+        
+    elif unlockWay == UnlockWay_FBZhanchui:
+        mapID = ChConfig.Def_FBMapID_Zhanchui
+        funcLineID = unlockValue
+        isPass = FBCommon.IsFBPass(curPlayer, mapID, funcLineID)
+        if not isPass:
+            GameWorld.DebugLog("激活红颜所需副本未过关! beautyID=%s,mapID=%s,funcLineID=%s" % (beautyID, mapID, funcLineID), playerID)
+            return
+        
+    elif unlockWay == UnlockWay_OfficialRank:
+        realmLV = curPlayer.GetOfficialRank()
+        needRealmLV = unlockValue
+        if realmLV < needRealmLV:
+            GameWorld.DebugLog("激活红颜所需官职不足! beautyID=%s,realmLV=%s < %s" % (beautyID, realmLV, needRealmLV), playerID)
+            return
+        
+    elif unlockWay == UnlockWay_TravelCnt:
+        travelCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TravelCnt)
+        needTravelCnt = unlockNeedCnt
+        if travelCnt < needTravelCnt:
+            GameWorld.DebugLog("激活红颜所需游历次数不足! beautyID=%s,travelCnt=%s < %s" % (beautyID, travelCnt, needTravelCnt), playerID)
+            return
+        
+    else:
+        GameWorld.DebugLog("该红颜不支持激活! beautyID=%s,unlockWay=%s" % (beautyID, unlockWay), playerID)
+        return
+    
+    DoBeautyActivate(curPlayer, beautyID)
+    return
+
+def DoBeautyActivate(curPlayer, beautyID):
+    ## 执行激活红颜逻辑
+    if GetBeautyState(curPlayer, beautyID):
+        return
+    lv, exp = 0, 0
+    SetBeautyState(curPlayer, beautyID, 1)
+    SetBeautyLVInfo(curPlayer, beautyID, lv, exp)
+    GameWorld.DebugLog("红颜激活成功! beautyID=%s" % beautyID, curPlayer.GetPlayerID())
+    RefreshBeautyAttr(curPlayer)
+    SyncBeautyInfo(curPlayer, [beautyID])
+    return
+
+#// B2 20 红颜好感度升级 #tagCSBeautyLVUP
+#
+#struct    tagCSBeautyLVUP
+#{
+#    tagHead         Head;
+#    WORD        BeautyID;    //红颜ID
+#    DWORD        ItemID;        //使用物品ID
+#    BYTE        IsQuick;        // 是否快速升级,0-只消耗1个道具;1-消耗升1级的道具
+#};
+def OnBeautyLVUP(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    beautyID = curPackData.BeautyID
+    itemID = curPackData.ItemID
+    isQuick = curPackData.IsQuick
+    
+    if not GetBeautyState(curPlayer, beautyID):
+        GameWorld.DebugLog("红颜未激活! beautyID=%s" % beautyID, playerID)
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("Beauty", beautyID)
+    if not ipyData:
+        return
+    quality = ipyData.GetBeautyQuality()
+    curLV, curExp = GetBeautyLVInfo(curPlayer, beautyID)
+    
+    isCommItem = True # 是否使用的常规通用物品
+    commItemIDList = IpyGameDataPY.GetFuncEvalCfg("BeautyLVUP", 1)
+    commExpList = IpyGameDataPY.GetFuncEvalCfg("BeautyLVUP", 2)
+    if itemID in commItemIDList:
+        index = commItemIDList.index(itemID)
+        perExp = commExpList[index] if len(commExpList) > index else 0
+    else:
+        isCommItem = False
+        unlockWay = ipyData.GetUnlockWay()
+        unlockValue = ipyData.GetUnlockValue()
+        if unlockWay != UnlockWay_Item:
+            GameWorld.DebugLog("非道具激活的不支持专属信物ID升级! beautyID=%s,unlockWay=%s" % (beautyID, unlockWay), playerID)
+            return
+        if itemID != unlockValue:
+            GameWorld.DebugLog("非该红颜专属信物ID! beautyID=%s,itemID=%s != %s" % (beautyID, itemID, unlockValue), playerID)
+            return
+        perExp = IpyGameDataPY.GetFuncCfg("BeautyLVUP", 3)
+        
+    if perExp <= 0:
+        return
+    
+    nextLV = curLV + 1
+    nextLVIpyData = IpyGameDataPY.GetIpyGameData("BeautyQualityLV", quality, nextLV)
+    if not nextLVIpyData:
+        GameWorld.DebugLog("红颜已满级! beautyID=%s,quality=%s,curLV=%s" % (beautyID, quality, curLV), playerID)
+        return
+    lvNeedExp = nextLVIpyData.GetLVNeedExp()
+    
+    costItemCount = 0
+    needExp = lvNeedExp - curExp # 升级还需经验
+    if needExp > 0:
+        if isQuick:
+            costItemCount = needExp / perExp
+            if needExp % perExp > 0:
+                costItemCount += 1
+        else:
+            costItemCount = 1
+            
+        if costItemCount < 1:
+            return
+        
+        if isCommItem:
+            costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, itemID, costItemCount)
+            lackCnt = costItemCount - bindCnt - unBindCnt
+            if lackCnt > 0:
+                costItemCount -= lackCnt
+                GameWorld.DebugLog("消耗道具不足,有多少消耗多少! itemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s" 
+                                   % (itemID, costItemCount, bindCnt, unBindCnt, lackCnt))
+            # 扣除消耗
+            if costItemCount > 0:
+                ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, "Beauty")
+        else:
+            itemCount = ItemControler.GetItemCountByID(curPlayer, itemID)
+            if itemCount < costItemCount:
+                costItemCount = itemCount
+                
+            if costItemCount > 0:
+                ItemControler.SetItemCountByID(curPlayer, itemID, itemCount - costItemCount)
+                
+    addExp = costItemCount * perExp
+    updExp = curExp + addExp
+    GameWorld.DebugLog("红颜加经验: beautyID=%s,quality=%s,curLV=%s,curExp=%s,addExp=%s,updExp=%s/%s,itemID=%s,costItemCount=%s,perExp=%s" 
+                       % (beautyID, quality, curLV, curExp, addExp, updExp, lvNeedExp, itemID, costItemCount, perExp))
+    
+    updLV = curLV
+    if updExp >= lvNeedExp:
+        updExp -= lvNeedExp
+        updLV += 1
+        GameWorld.DebugLog("    升级: updLV=%s,updExp=%s" % (updLV, updExp))
+        
+    SetBeautyLVInfo(curPlayer, beautyID, updLV, updExp)
+    
+    SyncBeautyInfo(curPlayer, [beautyID])
+    
+    # 有升级额外处理
+    if updLV > updLV:
+        RefreshBeautyAttr(curPlayer)
+        
+    return
+
+def GetBeautyLVAward(curPlayer, beautyID):
+    ## 领取红颜等级奖励
+    if not GetBeautyState(curPlayer, beautyID):
+        GameWorld.DebugLog("红颜未激活! beautyID=%s" % beautyID)
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("Beauty", beautyID)
+    if not ipyData:
+        return
+    quality = ipyData.GetBeautyQuality()
+    
+    curLV = GetBeautyLVInfo(curPlayer, beautyID)[0]
+    awardLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautyAwardLV % beautyID)
+    if awardLV >= curLV:
+        GameWorld.DebugLog("当前没有红颜等级奖励可领取! beautyID=%s,quality=%s,awardLV=%s >= curLV=%s" % (beautyID, quality, awardLV, curLV))
+        return
+    GameWorld.DebugLog("领取红颜等级奖励: beautyID=%s,quality=%s,curLV=%s,awardLV=%s" % (beautyID, quality, curLV, awardLV))
+    
+    updAwardLV = awardLV
+    itemDict = {}
+    for getLV in range(awardLV + 1, curLV + 1):
+        lvIpyData = IpyGameDataPY.GetIpyGameData("BeautyQualityLV", quality, getLV)
+        if not lvIpyData:
+            break
+        itemList = lvIpyData.GetAwardItemList()
+        for itemInfo in itemList:
+            itemID = itemInfo[0]
+            itemCount = itemInfo[1]
+            itemDict[itemID] = itemDict.get(itemID, 0) + itemCount
+        updAwardLV = getLV
+        
+    if not itemDict:
+        return
+    awardItemList = [[itemID, itemCount] for itemID, itemCount in itemDict.items()]
+    GameWorld.DebugLog("    updAwardLV=%s,awardItemList=%s" % (updAwardLV, awardItemList))
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BeautyAwardLV % beautyID, updAwardLV)
+    SyncBeautyInfo(curPlayer, [beautyID])
+    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["BeautyLVAward", False, {}])
+    return
+
+#// B2 21 红颜时装操作 #tagCSBeautySkinOP
+#
+#struct    tagCSBeautySkinOP
+#{
+#    tagHead         Head;
+#    WORD        BeautyID;    //红颜ID
+#    WORD        SkinID;        //时装ID
+#    BYTE        OPType;        //操作 1-激活;2-佩戴;3-升星
+#};
+def OnBeautySkinOP(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    beautyID = curPackData.BeautyID
+    skinID = curPackData.SkinID
+    opType = curPackData.OPType
+    
+    if not GetBeautyState(curPlayer, beautyID):
+        GameWorld.DebugLog("红颜未激活! beautyID=%s" % beautyID, playerID)
+        return
+    
+    if opType == 1:
+        OnBeautySkinActivate(curPlayer, beautyID, skinID)
+    elif opType == 2:
+        OnUseBeautySkin(curPlayer, beautyID, skinID)
+    elif opType == 3:
+        OnBeautySkinStarUP(curPlayer, beautyID, skinID)
+    return
+
+def GetBeautySkinIpyData(curPlayer, beautyID, skinID):
+    ipyDataList = IpyGameDataPY.GetIpyGameDataList("BeautySkin", beautyID)
+    if not ipyDataList:
+        return
+    for ipyData in ipyDataList:
+        if ipyData.GetSkinID() == skinID:
+            return ipyData
+    return
+
+def OnBeautySkinActivate(curPlayer, beautyID, skinID):
+    ## 红颜时装激活
+    if GetBeautySkinState(curPlayer, skinID):
+        GameWorld.DebugLog("红颜皮肤已激活! beautyID=%s,skinID=%s" % (beautyID, skinID))
+        return
+    
+    ipyData = GetBeautySkinIpyData(curPlayer, beautyID, skinID)
+    if not ipyData:
+        return
+    unlockWay = ipyData.GetUnlockWay()
+    unlockValue = ipyData.GetUnlockValue()
+    unlockNeedCnt = ipyData.GetUnlockNeedCnt()
+    
+    if unlockWay == UnlockWaySkin_Item:
+        needItemID = unlockValue
+        needItemCnt = unlockNeedCnt
+        itemCount = ItemControler.GetItemCountByID(curPlayer, needItemID)
+        if itemCount < needItemCnt:
+            GameWorld.DebugLog("激活红颜时装物品不足! beautyID=%s,needItemID=%s,itemCount=%s < %s" % (beautyID, needItemID, itemCount, needItemCnt))
+            return
+        ItemControler.DelItemCountByID(curPlayer, needItemID, needItemCnt)
+        
+    else:
+        GameWorld.DebugLog("红颜皮肤不需要激活! beautyID=%s,skinID=%s" % (beautyID, skinID))
+        return
+    
+    SetBeautySkinState(curPlayer, skinID, 1)
+    GameWorld.DebugLog("红颜皮肤激活: beautyID=%s,skinID=%s" % (beautyID, skinID))
+    RefreshBeautyAttr(curPlayer)
+    SyncBeautyInfo(curPlayer, [beautyID], [skinID])
+    return
+
+def OnUseBeautySkin(curPlayer, beautyID, skinID):
+    playerID = curPlayer.GetPlayerID()
+    if not IsBeautySkinCanUse(curPlayer, beautyID, skinID):
+        GameWorld.DebugLog("该红颜时装不可用! beautyID=%s,skinID=%s" % (beautyID, skinID), playerID)
+        return
+    GameWorld.DebugLog("穿戴 红颜时装! beautyID=%s,skinID=%s" % (beautyID, skinID), playerID)
+    ipyDataList = IpyGameDataPY.GetIpyGameDataList("BeautySkin", beautyID)
+    if not ipyDataList:
+        return
+    skinIDList = []
+    for ipyData in ipyDataList:
+        ipySkinID = ipyData.GetSkinID()
+        if ipySkinID == skinID:
+            SetBeautySkinUsed(curPlayer, skinID, 1)
+        elif GetBeautySkinUsed(curPlayer, ipySkinID):
+            SetBeautySkinUsed(curPlayer, ipySkinID, 0)
+        else:
+            continue
+        skinIDList.append(ipySkinID)
+    SyncBeautyInfo(curPlayer, [beautyID], skinIDList)
+    return
+
+def OnBeautySkinStarUP(curPlayer, beautyID, skinID):
+    playerID = curPlayer.GetPlayerID()
+    if not IsBeautySkinCanUse(curPlayer, beautyID, skinID):
+        GameWorld.DebugLog("该红颜时装不可用! beautyID=%s,skinID=%s" % (beautyID, skinID), playerID)
+        return
+    ipyData = GetBeautySkinIpyData(curPlayer, beautyID, skinID)
+    if not ipyData:
+        return
+    starMax = ipyData.GetStarMax()
+    curStar = GetBeautySkinStar(curPlayer, skinID)
+    if curStar >= starMax:
+        GameWorld.DebugLog("红颜时装星级已满! skinID=%s,curStar=%s >= %s" % (skinID, curStar, starMax), playerID)
+        return
+    if ipyData.GetUnlockWay() != UnlockWaySkin_Item:
+        return
+    needItemID = ipyData.GetUnlockValue()
+    needItemCnt = ipyData.GetUpNeedCnt()
+    if not needItemID or not needItemCnt:
+        return
+    itemCount = ItemControler.GetItemCountByID(curPlayer, needItemID)
+    if itemCount < needItemCnt:
+        GameWorld.DebugLog("红颜时装升星物品不足! skinID=%s,needItemID=%s,itemCount=%s < %s" % (skinID, needItemID, itemCount, needItemCnt))
+        return
+    ItemControler.DelItemCountByID(curPlayer, needItemID, needItemCnt)
+    
+    nextStar = curStar + 1
+    GameWorld.DebugLog("红颜时装升星! skinID=%s,nextStar=%s" % (skinID, nextStar), playerID)
+    SetBeautySkinStar(curPlayer, skinID, nextStar)
+    RefreshBeautyAttr(curPlayer)
+    SyncBeautyInfo(curPlayer, [beautyID], [skinID])
+    return
+
+def RefreshBeautyAttr(curPlayer):
+    CalcBeautyAttr(curPlayer)
+    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
+    return
+
+def CalcBeautyAttr(curPlayer):
+    
+    playerID = curPlayer.GetPlayerID()
+    attrDict = {}
+    effTypeDict = {} # 特殊效果缓存
+    
+    talentLVUPPer = IpyGameDataPY.GetFuncCfg("BeautyLVUP", 4) # 每x级好感度提升一级天赋效果
+    
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in range(ipyDataMgr.GetBeautyCount()):
+        ipyData = ipyDataMgr.GetBeautyByIndex(index)
+        beautyID = ipyData.GetBeautyID()
+        if not GetBeautyState(curPlayer, beautyID):
+            continue
+        quality = ipyData.GetBeautyQuality()
+        beautyLV = GetBeautyLVInfo(curPlayer, beautyID)[0]
+        # 等级属性
+        for lv in range(beautyLV + 1):
+            lvIpyData = IpyGameDataPY.GetIpyGameData("BeautyQualityLV", quality, lv)
+            if not lvIpyData:
+                continue
+            lvAttrIDList = lvIpyData.GetAttrIDList()
+            lvAttrValueList = lvIpyData.GetAttrValueList()
+            for lvIndex, attrID in enumerate(lvAttrIDList):
+                attrValue = lvAttrValueList[lvIndex] if len(lvAttrValueList) > lvIndex else 0
+                attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
+        #GameWorld.DebugLog("红颜等级属性: beautyID=%s,quality=%s,beautyLV=%s,%s" % (beautyID, quality, beautyLV, attrDict), playerID)
+        
+        # 天赋属性
+        talentAttrIDList = ipyData.GetTalentAttrIDList()
+        talentAttrValueList = ipyData.GetTalentAttrValueList()
+        talentPerLVAddList = ipyData.GetTalentPerLVAddList()
+        talentLV = beautyLV / talentLVUPPer
+        for tIndex, attrID in enumerate(talentAttrIDList):
+            initValue = talentAttrValueList[tIndex] if len(talentAttrValueList) > tIndex else 0
+            perLVAdd = talentPerLVAddList[tIndex] if len(talentPerLVAddList) > tIndex else 0
+            attrValue = initValue + perLVAdd * talentLV
+            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
+        #GameWorld.DebugLog("红颜天赋属性: beautyID=%s,talentLV=%s,%s" % (beautyID, talentLV, attrDict), playerID)
+        
+        # 特殊效果
+        effType = ipyData.GetEffType()
+        effTypeValue = ipyData.GetEffTypeValue()
+        effValue = ipyData.GetEffValue()
+        effPerLVAdd = ipyData.GetEffPerLVAdd()
+        if effType:
+            effValue = effValue + effPerLVAdd * talentLV
+            effTypeDict[effType] = [effValue, effTypeValue]
+            #GameWorld.DebugLog("红颜特殊效果: beautyID=%s,effType=%s,talentLV=%s,%s" % (beautyID, effType, talentLV, effTypeDict), playerID)
+            
+        # 时装
+        ipyDataList = IpyGameDataPY.GetIpyGameDataList("BeautySkin", beautyID)
+        if not ipyDataList:
+            continue
+        for skinIpyData in ipyDataList:
+            skinID = skinIpyData.GetSkinID()
+            if not IsBeautySkinCanUse(curPlayer, beautyID, skinID, skinIpyData):
+                continue
+            
+            attrIDList = skinIpyData.GetAttrIDList()
+            initAttrValueList = skinIpyData.GetInitAttrValueList()
+            perStarAddList = skinIpyData.GetAttrPerStarAddList()
+            star = GetBeautySkinStar(curPlayer, skinID)
+            for sIndex, attrID in enumerate(attrIDList):
+                initValue = initAttrValueList[sIndex] if len(initAttrValueList) > sIndex else 0
+                perStarAdd = perStarAddList[sIndex] if len(perStarAddList) > sIndex else 0
+                attrValue = initValue + perStarAdd * star
+                attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
+            #GameWorld.DebugLog("红颜时装属性: beautyID=%s,skinID=%s,star=%s,%s" % (beautyID, skinID, star, attrDict), playerID)
+            
+    # 保存计算值
+    GameWorld.DebugLog("红颜属性: %s" % attrDict, playerID)
+    GameWorld.DebugLog("红颜效果: %s" % effTypeDict, playerID)
+    PyGameData.g_beautyEffTypeDict[playerID] = effTypeDict
+    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Beauty, attrDict)
+    return
+
+def GetBeautyEffInfo(curPlayer, effType):
+    ## 获取红颜特殊效果信息
+    # @return: effValue, effTypeValue
+    effTypeDict = PyGameData.g_beautyEffTypeDict.get(curPlayer.GetPlayerID(), {})
+    return effTypeDict.get(effType, [0, 0])
+
+def SyncBeautyInfo(curPlayer, beautyIDList=None, skinIDList=None):
+    if beautyIDList == None:
+        syncBeautyIDList = []
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for index in range(ipyDataMgr.GetBeautyCount()):
+            ipyData = ipyDataMgr.GetBeautyByIndex(index)
+            syncBeautyIDList.append(ipyData.GetBeautyID())
+    else:
+        syncBeautyIDList = beautyIDList
+        
+    beautyList = []
+    for beautyID in syncBeautyIDList:
+        state = GetBeautyState(curPlayer, beautyID)
+        if not state and beautyIDList == None:
+            continue
+        lv, exp = GetBeautyLVInfo(curPlayer, beautyID)
+        beauty = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCBeauty)
+        beauty.BeautyID = beautyID
+        beauty.State = state
+        beauty.LV = lv
+        beauty.Exp = exp
+        beauty.AwardLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautyAwardLV % beautyID)
+        
+        beauty.SkinList = []
+        ipyDataList = IpyGameDataPY.GetIpyGameDataList("BeautySkin", beautyID)
+        if ipyDataList:
+            for ipyData in ipyDataList:
+                skinID = ipyData.GetSkinID()
+                skinInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BeautySkinInfo % skinID)
+                if skinIDList != None:
+                    if skinID not in skinIDList:
+                        continue
+                else:
+                    if not skinInfo:
+                        continue
+                beautySkin = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCBeautySkin)
+                beautySkin.SkinID = skinID
+                beautySkin.State = 1 if IsBeautySkinCanUse(curPlayer, beautyID, skinID, ipyData) else 0
+                beautySkin.Used = GetBeautySkinUsed(curPlayer, skinID)
+                beautySkin.Star = GetBeautySkinStar(curPlayer, skinID)
+                beauty.SkinList.append(beautySkin)
+        beauty.SkinCnt = len(beauty.SkinList)
+        
+        beautyList.append(beauty)
+        
+    if not beautyList:
+        return
+    
+    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCBeautyInfo)
+    clientPack.BeautyList = beautyList
+    clientPack.Count = len(clientPack.BeautyList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py
index 5142697..92745ec 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py
@@ -206,7 +206,7 @@
     if ipyData.GetUnlockWay() != 2:
         return
     itemID = ipyData.GetUnlockValue()
-    itemCount = ipyData.GetUnlockNeedCnt()
+    itemCount = ipyData.GetUpNeedCnt()
     if not itemID or not itemCount:
         return
     needItemList = [[itemID, itemCount]]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
index 52239dd..394c127 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -53,7 +53,6 @@
 import CrossActCTGBillboard
 import CrossActAllRecharge
 import PlayerActGrowupBuy
-import PlayerFeastTravel
 import PlayerWeekParty
 import PlayerGoldInvest
 import PlayerActTurntable
@@ -791,7 +790,6 @@
     PlayerActSingleRecharge.UpdSingleRechargeValue(curPlayer, orderCoin, coinType) # 单笔累充
     PlayerActTurntable.OnPlayerRecharge(curPlayer, orderCoin, coinType) # 转盘
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Recharge, addVIPExp)
-    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_CTGExp, addVIPExp)
     #投资
     if ctgIpyData:
         ctgID = ctgIpyData.GetRecordID()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 3a2e2e4..9572b02 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -44,7 +44,6 @@
 import GameFuncComm
 import IpyGameDataPY
 import PyGameData
-import PlayerFeastTravel
 import PlayerActTurntable
 import PlayerCostRebate
 import PlayerActLunhuidian
@@ -2839,7 +2838,6 @@
     # 消费返利
     if costType not in ChConfig.CostRebate_DisableType:
         PlayerCostRebate.AddCostRebateGold(curPlayer, costType, price, infoDict)
-        PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_UseGold, price)
     else:
         GameWorld.DebugLog("不计入消费活动的消费类型!costType=%s" % costType, curPlayer.GetPlayerID())
         
@@ -2947,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/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index ae4a996..47b50b2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -59,7 +59,6 @@
 import PlayerBossReborn
 import PlayerWeekParty
 import PlayerFeastWeekParty
-import PlayerFeastTravel
 import PlayerFeastLogin
 import PlayerFeastWish
 import PlayerActTask
@@ -86,6 +85,7 @@
 import PlayerXiangong
 import PlayerBillboard
 import PlayerViewCache
+import GameFuncComm
 import PlayerMail
 import PlayerHero
 import PlayerTree
@@ -245,7 +245,7 @@
     
     # 常规过天
     if onEventType == ShareDefine.Def_OnEventType:
-        
+        GameFuncComm.DoFuncOpenLogic(curPlayer)
         #清空每日事件奖励
         curPlayer.SetDayProcessGameEventCount(0)
         
@@ -943,9 +943,6 @@
                 
             elif actionName == ShareDefine.OperationActionName_FeastWish:
                 PlayerFeastWish.RefreshFeastWishActionInfo()
-                
-            elif actionName == ShareDefine.OperationActionName_FeastTravel:
-                PlayerFeastTravel.RefreshFeastTravelActionInfo()
                 
             elif actionName == ShareDefine.OperationActionName_FeastWeekParty:
                 PlayerFeastWeekParty.RefreshOperationAction_FeastWeekParty()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFace.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFace.py
index e252abc..96b370e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFace.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFace.py
@@ -219,7 +219,7 @@
     if ipyData.GetUnlockWay() != 2:
         return
     itemID = ipyData.GetUnlockValue()
-    itemCount = ipyData.GetUnlockNeedCnt()
+    itemCount = ipyData.GetUpNeedCnt()
     if not itemID or not itemCount:
         return
     needItemList = [[itemID, itemCount]]
@@ -419,7 +419,7 @@
     if ipyData.GetUnlockWay() != 2:
         return
     itemID = ipyData.GetUnlockValue()
-    itemCount = ipyData.GetUnlockNeedCnt()
+    itemCount = ipyData.GetUpNeedCnt()
     if not itemID or not itemCount:
         return
     needItemList = [[itemID, itemCount]]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index 93c6f86..dceae35 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -30,6 +30,7 @@
 import IPY_GameWorld
 import ItemControler
 import GameFuncComm
+import PlayerTask
 import DBDataMgr
 import DirtyList
 import ObjPool
@@ -465,6 +466,7 @@
     familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
     Sync_RequestAddFamilyInfo(curPlayer)
     PlayerFamilyTaofa.OnPlayerEnterFamily(curPlayer)
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily)
     return
 
 def __OnLeaveFamily(curPlayer, isVoluntarily, tick):
@@ -661,6 +663,7 @@
     
     # 申请加入
     if requestType == 0:
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily, 1)
         if not tagFamilyID:
             AutoJoinFamily(curPlayer)
         else:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py
deleted file mode 100644
index bb6a562..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py
+++ /dev/null
@@ -1,312 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package Player.PlayerFeastTravel
-#
-# @todo:节日游历
-# @author hxp
-# @date 2021-02-01
-# @version 1.0
-#
-# 详细描述: 节日游历
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2021-02-01 15:00"""
-#-------------------------------------------------------------------------------
-
-import PyGameData
-import ShareDefine
-import PlayerControl
-import IpyGameDataPY
-import ItemControler
-import ChPyNetSendPack
-import IPY_GameWorld
-import NetPackCommon
-import GameWorld
-import ChConfig
-
-def OnPlayerLogin(curPlayer):
-    isReset = __CheckPlayerFeastTravelAction(curPlayer)
-    if not isReset:
-        actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
-        # 活动中同步活动信息
-        if actInfo.get(ShareDefine.ActKey_State):
-            Sync_FeastTravelActionInfo(curPlayer)
-            Sync_FeastTravelPlayerInfo(curPlayer)
-    return
-
-def RefreshFeastTravelActionInfo():
-    ## 收到GameServer同步的活动信息,刷新活动信息
-    playerManager = GameWorld.GetPlayerManager()
-    for index in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(index)
-        if not GameWorld.IsNormalPlayer(curPlayer):
-            continue
-        __CheckPlayerFeastTravelAction(curPlayer)
-    return
-
-def __CheckPlayerFeastTravelAction(curPlayer):
-    ## 检查玩家活动信息
-    
-    playerID = curPlayer.GetPlayerID()
-    
-    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
-    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
-    state = actInfo.get(ShareDefine.ActKey_State, 0)
-    
-    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelID) # 玩家身上的活动ID
-    # 活动ID 相同的话不处理
-    if actID == playerActID:
-        GameWorld.DebugLog("节日游历活动ID不变,不处理!", curPlayer.GetPlayerID())
-        return
-    GameWorld.DebugLog("节日游历活动重置! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID)
-    
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelID, actID)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, 0)
-    
-    if not state:
-        return
-    
-    templateID = __GetTravelTemplateID()
-    
-    ipyMgr = IpyGameDataPY.IPY_Data()
-    # 重置游历任务相关
-    for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
-        taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
-        taskID = taskIpyData.GetTraveTasklD()
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, 0)
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, 0)
-        
-    # 重置游历奖励
-    for index in xrange(ipyMgr.GetActFeastTravelAwardCount()):
-        awardIpyData = ipyMgr.GetActFeastTravelAwardByIndex(index)
-        if templateID != awardIpyData.GetTemplatelD():
-            continue
-        recordIndex = awardIpyData.GetRecordIndex()
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % recordIndex, 0)
-        
-    Sync_FeastTravelActionInfo(curPlayer)
-    Sync_FeastTravelPlayerInfo(curPlayer)
-    return True
-
-def __GetTravelTemplateID():
-    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
-    if not actInfo:
-        return
-    
-    if not actInfo.get(ShareDefine.ActKey_State):
-        return
-    
-    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
-    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravel", cfgID)
-    if not ipyData:
-        return
-    
-    worldLV = actInfo.get(ShareDefine.ActKey_WorldLV)
-    templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0)
-    return templateID
-
-def AddFeastTravelTaskValue(curPlayer, taskID, addValue=1):
-    ## 增加游历任务完成进度
-    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
-    if not actInfo:
-        return
-    if not actInfo.get(ShareDefine.ActKey_State):
-        return
-    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravelTask", taskID)
-    if not ipyData:
-        return
-    maxFinishCount = ipyData.GetFinishTimeMax()
-    curFinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelCount % taskID)
-    if maxFinishCount and curFinishCount >= maxFinishCount:
-        GameWorld.DebugLog("该游历任务已达到最大完成次数!taskID=%s,curFinishCount=%s" % (taskID, curFinishCount))
-        return
-    curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelValue % taskID)        
-    updValue = curValue + addValue
-    GameWorld.DebugLog("增加游历进度: taskID=%s,curValue=%s,addValue=%s,updValue=%s" % (taskID, curValue, addValue, updValue))
-    
-    if maxFinishCount:
-        maxValue = ipyData.GetFinishNeedValue() * maxFinishCount
-        if updValue > maxValue:
-            updValue = maxValue
-            GameWorld.DebugLog("    修正进度值不超过最大可完成次数的总进度值! maxFinishCount=%s,maxValue=%s,updValue=%s" 
-                               % (maxFinishCount, maxValue, updValue))
-            
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, updValue)
-    updFinishCount = updValue / ipyData.GetFinishNeedValue()
-    GameWorld.DebugLog("    curFinishCount=%s,updFinishCount=%s" % (curFinishCount, updFinishCount))
-    # 增加完成次数
-    if updFinishCount > curFinishCount:
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, updFinishCount)
-        addFinishCount = updFinishCount - curFinishCount
-        addTravelPointTotal = addFinishCount * ipyData.GetAddTravelPoint()
-        
-        curTravelPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint)
-        updTravelPoint = curTravelPoint + addTravelPointTotal
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, updTravelPoint)
-        GameWorld.DebugLog("    完成游历: addFinishCount=%s,addTravelPointTotal=%s,curTravelPoint=%s,updTravelPoint=%s" 
-                           % (addFinishCount, addTravelPointTotal, curTravelPoint, updTravelPoint))
-        
-    Sync_FeastTravelPlayerInfo(curPlayer, taskID, -1) # 不通知奖励
-    return True
-
-def GetFeastTravelAward(curPlayer, index):
-    ## 节日游历领奖
-    
-    templateID = __GetTravelTemplateID()
-    if not templateID:
-        return
-    
-    ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID)
-    if not ipyDataList:
-        return
-    
-    findIpyData = None
-    for ipyData in ipyDataList:
-        if index == ipyData.GetRecordIndex():
-            findIpyData = ipyData
-            break
-        
-    if not findIpyData:
-        return
-    
-    getCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelAwardCount % index)
-    getCountMax = findIpyData.GetAwardCountMax()
-    if getCountMax and getCount >= getCountMax:
-        GameWorld.DebugLog("    节日游历领奖已达最大领取次数! templateID=%s,index=%s,getCount=%s >= getCountMax=%s" 
-                           % (templateID, index, getCount, getCountMax))
-        return
-    
-    curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint)
-    singleNeedPoint = findIpyData.GetNeedTravelPoint()
-    canUsePoint = curPoint - getCount * singleNeedPoint
-    if canUsePoint < singleNeedPoint:
-        GameWorld.DebugLog("    节日游历领奖游历值不足! templateID=%s,index=%s,curPoint=%s,getCount=%s,canUsePoint=%s < singleNeedPoint=%s" 
-                           % (templateID, index, curPoint, getCount, canUsePoint, singleNeedPoint))
-        return
-    
-    awardList = findIpyData.GetTravelAwardInfo()
-    if not awardList:
-        return
-    
-    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardList):
-        return
-    
-    updGetCount = getCount + 1
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % index, updGetCount)
-    
-    GameWorld.DebugLog("    节日游历领奖! templateID=%s,index=%s,curPoint=%s,getCount=%s,canUsePoint=%s,singleNeedPoint=%s,updGetCount=%s" 
-                       % (templateID, index, curPoint, getCount, canUsePoint, singleNeedPoint, updGetCount))
-    
-    for itemID, itemCnt, isAuctionItem in awardList:
-        ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isAuctionItem, [IPY_GameWorld.rptItem], event=["FeastTravel", False, {}])
-        
-    Sync_FeastTravelPlayerInfo(curPlayer, -1, index) # 不通知任务
-    return
-
-def Sync_FeastTravelPlayerInfo(curPlayer, taskID=None, awardIndex=None):
-    ## 通知活动玩家信息
-    # @param taskID: None-通知全部;>=0-单个通知;-1-不通知
-    
-    syncTaskIDList = []
-    if taskID == None:
-        ipyMgr = IpyGameDataPY.IPY_Data()
-        for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
-            taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
-            syncTaskIDList.append(taskIpyData.GetTraveTasklD())
-    elif taskID >= 0:
-        syncTaskIDList = [taskID]
-        
-    syncAwardIndexList = []
-    if awardIndex == None:
-        templateID = __GetTravelTemplateID()
-        if templateID:
-            awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID)
-            if awardIpyDataList:
-                syncAwardIndexList = [awardIpyData.GetRecordIndex() for awardIpyData in awardIpyDataList]
-    elif awardIndex >= 0:
-        syncAwardIndexList = [awardIndex]
-        
-    playerPack = ChPyNetSendPack.tagMCFeastTravelPlayerInfo()
-    playerPack.TravelPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint)
-    playerPack.TravelPlayerTaskList = []
-    for taskID in syncTaskIDList:
-        taskInfo = ChPyNetSendPack.tagMCFeastTravelPlayerTask()
-        taskInfo.TravelTaskID = taskID
-        taskInfo.TravelValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelValue % taskID)
-        taskInfo.FinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelCount % taskID)
-        playerPack.TravelPlayerTaskList.append(taskInfo)
-    playerPack.TravelPlayerTaskCount = len(playerPack.TravelPlayerTaskList)
-    
-    playerPack.TravelPlayerAwardList = []
-    for awardIndex in syncAwardIndexList:
-        awardInfo = ChPyNetSendPack.tagMCFeastTravelPlayerAward()
-        awardInfo.AwardIndex = awardIndex
-        awardInfo.GetAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelAwardCount % awardIndex)
-        playerPack.TravelPlayerAwardList.append(awardInfo)
-    playerPack.TravelPlayerAwardCount = len(playerPack.TravelPlayerAwardList)
-    
-    NetPackCommon.SendFakePack(curPlayer, playerPack)
-    return
-
-def Sync_FeastTravelActionInfo(curPlayer):
-    ## 通知活动信息
-    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {})
-    if not actInfo:
-        return
-    
-    if not actInfo.get(ShareDefine.ActKey_State):
-        return
-    
-    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
-    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravel", cfgID)
-    if not ipyData:
-        return
-    
-    worldLV = actInfo.get(ShareDefine.ActKey_WorldLV)
-    templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0)
-    if not templateID:
-        return
-    
-    startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
-    actPack = ChPyNetSendPack.tagMCFeastTravelInfo()
-    actPack.Clear()
-    actPack.StartDate = startDateStr
-    actPack.EndtDate = endDateStr
-    actPack.LimitLV = ipyData.GetLVLimit()
-    actPack.ResetType = ipyData.GetResetType()
-    
-    actPack.TravelTaskList = []
-    ipyMgr = IpyGameDataPY.IPY_Data()
-    for index in xrange(ipyMgr.GetActFeastTravelTaskCount()):
-        taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index)
-        taskInfo = ChPyNetSendPack.tagMCFeastTravelTask()
-        taskInfo.TravelTaskID = taskIpyData.GetTraveTasklD()
-        taskInfo.FinishNeedValue = taskIpyData.GetFinishNeedValue()
-        taskInfo.FinishTimeMax = taskIpyData.GetFinishTimeMax()
-        taskInfo.AddTravelPoint = taskIpyData.GetAddTravelPoint()
-        actPack.TravelTaskList.append(taskInfo)
-    actPack.TravelTaskCount = len(actPack.TravelTaskList)
-    
-    awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID)
-    actPack.TravelAwardList = []
-    for awardIpyData in awardIpyDataList:
-        awardInfo = ChPyNetSendPack.tagMCFeastTravelAward()
-        awardInfo.AwardIndex = awardIpyData.GetRecordIndex()
-        awardInfo.NeedTravelPoint = awardIpyData.GetNeedTravelPoint()
-        awardInfo.AwardCountMax = awardIpyData.GetAwardCountMax()
-        awardInfo.AwardItemList = []
-        for itemID, itemCount, isAuctionItem in awardIpyData.GetTravelAwardInfo():
-            itemInfo = ChPyNetSendPack.tagMCFeastTravelAwardItem()
-            itemInfo.ItemID = itemID
-            itemInfo.ItemCount = itemCount
-            itemInfo.IsBind = isAuctionItem
-            awardInfo.AwardItemList.append(itemInfo)
-        awardInfo.AwardItemCount = len(awardInfo.AwardItemList)
-        actPack.TravelAwardList.append(awardInfo)
-    actPack.TravelAwardCount = len(actPack.TravelAwardList)
-    
-    NetPackCommon.SendFakePack(curPlayer, actPack)
-    return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py
index 0966036..556531d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py
@@ -26,6 +26,7 @@
 import GameFuncComm
 import PlayerGubao
 import ShareDefine
+import PlayerTask
 import ObjPool
 
 import time
@@ -269,13 +270,7 @@
             if campID != cID:
                 atWorkCnt += wCnt
             
-    workersTotal = 0 # 总工人数
-    workerState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GoldRushWorkerState)
-    for index in range(ipyDataMgr.GetGoldRushWorkerCount()):
-        ipyData = ipyDataMgr.GetGoldRushWorkerByIndex(index)
-        workerID = ipyData.GetWorkerID()
-        if workerState & pow(2, workerID):
-            workersTotal += 1
+    workersTotal = GetWorkerTotal(curPlayer) # 总工人数
     idleWorkers = workersTotal - atWorkCnt # 空闲工人数
     if idleWorkers <= 0:
         GameWorld.DebugLog("没有空闲工人,无法开始淘金! atWorkCnt=%s >= %s" % (atWorkCnt, workersTotal))
@@ -321,7 +316,21 @@
     campInfo = SetCampInfo(curPlayer, campID, refreshCnt, goldID, updWorkerCnt)
     GameWorld.DebugLog("    updWorkerCnt=%s,realNeedSeconds=%s,endTime=%s,campInfo=%s" 
                        % (updWorkerCnt, realNeedSeconds, GameWorld.ChangeTimeNumToStr(endTime), campInfo))
+    
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_GoldRush, 1)
     return
+
+def GetWorkerTotal(curPlayer):
+    ## 获取监工总数
+    workersTotal = 0 # 总工人数
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    workerState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GoldRushWorkerState)
+    for index in range(ipyDataMgr.GetGoldRushWorkerCount()):
+        ipyData = ipyDataMgr.GetGoldRushWorkerByIndex(index)
+        workerID = ipyData.GetWorkerID()
+        if workerState & pow(2, workerID):
+            workersTotal += 1
+    return workersTotal
 
 def __onGoldRushCancel(curPlayer, campID):
     ## 取消
@@ -404,6 +413,8 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GoldRushWorkerState, workerState)
     GameWorld.DebugLog("解锁淘金监工: workerID=%s,workerState=%s" % (workerID, workerState))
     SyncGoldRushInfo(curPlayer)
+    
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_GoldRushWorkers)
     return
 
 #// B0 38 淘金仓库领奖 #tagCSGoldRushWarehouseAward
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py
index bdf5c14..2275cca 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py
@@ -401,7 +401,7 @@
     if ipyData.GetUnlockWay() != 2:
         return
     itemID = ipyData.GetUnlockValue()
-    itemCount = ipyData.GetUnlockNeedCnt()
+    itemCount = ipyData.GetUpNeedCnt()
     if not itemID or not itemCount:
         return
     needItemList = [[itemID, itemCount]]
@@ -623,7 +623,7 @@
     if ipyData.GetUnlockWay() != 2:
         return
     itemID = ipyData.GetUnlockValue()
-    itemCount = ipyData.GetUnlockNeedCnt()
+    itemCount = ipyData.GetUpNeedCnt()
     if not itemID or not itemCount:
         return
     needItemList = [[itemID, itemCount]]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
index d429bc5..420847f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -25,6 +25,7 @@
 import NetPackCommon
 import PlayerControl
 import PlayerOnline
+import PlayerTask
 import GameWorld
 import ChConfig
 
@@ -353,6 +354,7 @@
     PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
     
     PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroLVUP, 1)
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroLVUP)
     return
 
 def GetHeroLVMax(heroItem):
@@ -472,6 +474,8 @@
     if addStar > 0:
         __DoHeroStarTalentUp(item, addStar)
         PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroStarUP, addStar)
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroStarUP, addStar)
+        
     if isSync:
         heroItem.Sync_Item()
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
index 85b2211..729cf68 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -25,6 +25,7 @@
 import IpyGameDataPY
 import GameFuncComm
 import PlayerOnline
+import PlayerTask
 import GameWorld
 import ObjPool
 
@@ -119,6 +120,8 @@
     # 有升级额外处理
     if updHorseLV > horseLV:
         RefreshHorseAttr(curPlayer)
+        
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HorseLVUP, costItemCount)
     return
 
 #// B2 02 坐骑进阶 #tagCSHorseClassUP
@@ -308,21 +311,25 @@
     ipyData = IpyGameDataPY.GetIpyGameData("HorseSkin", horseSkinID)
     if not ipyData:
         return
-    if ipyData.GetUnlockWay() != 2:
-        GameWorld.DebugLog("非道具激活的不用添加: horseSkinID=%s" % (horseSkinID), playerID)
-        return
     if not isFree:
-        itemID = ipyData.GetUnlockValue()
-        itemCount = ipyData.GetUnlockNeedCnt()
-        if not itemID or not itemCount:
-            return
-        needItemList = [[itemID, itemCount]]
-        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
-        if lackItemDict:
-            GameWorld.DebugLog("激活所需物品不足! horseSkinID=%s,lackItemDict=%s" % (horseSkinID, lackItemDict), playerID)
-            return
-        ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "AddHorseSkin")
+        unlockWay = ipyData.GetUnlockWay()
+        if unlockWay == 1:
+            classLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorseClassLV)
+            if classLV < ipyData.GetUnlockValue():
+                GameWorld.DebugLog("坐骑阶级不足无法解锁! classLV=%s < %s" % (classLV, ipyData.GetUnlockValue()), playerID)
+                return
+        elif unlockWay == 2:
+            itemID = ipyData.GetUnlockValue()
+            itemCount = ipyData.GetUnlockNeedCnt()
+            if not itemID or not itemCount:
+                return
+            needItemList = [[itemID, itemCount]]
+            itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+            lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
+            if lackItemDict:
+                GameWorld.DebugLog("激活所需物品不足! horseSkinID=%s,lackItemDict=%s" % (horseSkinID, lackItemDict), playerID)
+                return
+            ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "AddHorseSkin")
         
     ipyExpireSeconds = ipyData.GetExpireMinutes() * 60
     
@@ -388,6 +395,8 @@
     for index in range(ipyDataMgr.GetHorseSkinCount()):
         ipyData = ipyDataMgr.GetHorseSkinByIndex(index)
         horseSkinID = ipyData.GetSkinID()
+        if horseSkinID <= 0:
+            continue
         if ipyData.GetUnlockWay() != 1:
             continue
         if ipyData.GetUnlockValue() > 0:
@@ -407,9 +416,11 @@
     if ipyData:
         unlockWay = ipyData.GetUnlockWay()
         if unlockWay == 1:
-            classLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorseClassLV)
-            if classLV >= ipyData.GetUnlockValue():
+            if not ipyData.GetUnlockValue():
                 return True
+            #classLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorseClassLV)
+            #if classLV >= ipyData.GetUnlockValue():
+            #    return True
             
     return False
 
@@ -437,7 +448,7 @@
     if ipyData.GetUnlockWay() != 2:
         return
     itemID = ipyData.GetUnlockValue()
-    itemCount = ipyData.GetUnlockNeedCnt()
+    itemCount = ipyData.GetUpNeedCnt()
     if not itemID or not itemCount:
         return
     needItemList = [[itemID, itemCount]]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
index a2775f6..72f47e8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -24,6 +24,7 @@
 import IpyGameDataPY
 import FormulaControl
 import PlayerPrestigeSys
+import PlayerBeauty
 import PlayerFamily
 import PlayerHorse
 import PlayerGubao
@@ -422,6 +423,7 @@
     PlayerGubao.CalcGubaoAttr(curPlayer)
     PlayerHJG.CalcHJGAttr(curPlayer)
     PlayerHorse.CalcHorseAttr(curPlayer)
+    PlayerBeauty.CalcBeautyAttr(curPlayer)
     return
 
 def doRefreshLineupAttr(curPlayer, olPlayer, lineup):
@@ -451,6 +453,7 @@
     countryHeroInfo = {} # 国家武将统计 {country:[heroID, ...], ...}
     fetterHeroInfo = {} # 阵容羁绊武将统计信息 {fetterID:[heroID, ...], ...}
     heroSelfAttrInfo = {} # 武将自身属性 {heroID:{attrID:value, ...}, ...}
+    heroLVAttrInfo = {} # 武将等级属性 {heroID:{attrID:value, ...}, ...}
     heroStarTalentInfo = {} # 武将星级天赋属性 {heroID:{attrID:value, ...}, ...}
     heroBreakAttrInfo = {} # 武将突破潜能属性 {heroID:{attrID:value, ...}, ...}
     heroAwakeTalentInfo = {} # 武将觉醒天赋属性 {heroID:{attrID:value, ...}, ...}
@@ -517,6 +520,18 @@
         for k, v in heroIpyData.GetBatAttrDict().items():
             selfAttrDict[int(k)] = v
         heroSelfAttrInfo[heroID] = selfAttrDict
+        
+        # 等级属性
+        heroLVAttrDict = {}
+        heroLVIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, heroLV)
+        if heroLVIpyData:
+            attrIDList = heroLVIpyData.GetAttrIDList()
+            attrValueList = heroLVIpyData.GetAttrValueList()
+            for aIndex in range(min(len(attrIDList), len(attrValueList))):
+                attrID = attrIDList[aIndex]
+                attrValue = attrValueList[aIndex]
+                heroLVAttrDict[attrID] = heroLVAttrDict.get(attrID, 0) + attrValue
+        heroLVAttrInfo[heroID] = heroLVAttrDict
         
         # 突破潜能
         breakAttrDict = {}
@@ -647,10 +662,12 @@
     gubaoAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Gubao)
     hjgAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HJG)
     horseAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Horse)
+    beautyAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Beauty)
     
     GameWorld.DebugLog("    国家武将统计=%s" % countryHeroInfo, playerID)
     GameWorld.DebugLog("    羁绊武将统计=%s" % fetterHeroInfo, playerID)
     GameWorld.DebugLog("    武将自身属性=%s" % heroSelfAttrInfo, playerID)
+    GameWorld.DebugLog("    武将等级属性=%s" % heroLVAttrInfo, playerID)
     GameWorld.DebugLog("    武将吞噬属性=%s" % heroStarTalentInfo, playerID)
     GameWorld.DebugLog("    武将突破潜能=%s" % heroBreakAttrInfo, playerID)
     GameWorld.DebugLog("    武将觉醒天赋=%s" % heroAwakeTalentInfo, playerID)
@@ -665,6 +682,7 @@
     GameWorld.DebugLog("    主公古宝属性=%s" % gubaoAttrDict, playerID)
     GameWorld.DebugLog("    主幻境阁属性=%s" % hjgAttrDict, playerID)
     GameWorld.DebugLog("    主公坐骑属性=%s" % horseAttrDict, playerID)
+    GameWorld.DebugLog("    主公红颜属性=%s" % beautyAttrDict, playerID)
     
     PlayerLV = curPlayer.GetLV()
     OfficialLV = curPlayer.GetOfficialRank()
@@ -681,6 +699,7 @@
         lineupHero.heroBatAttrDict = {}
         lineupHero.fightPower = 0
         
+        heroLVAttrDict = heroLVAttrInfo.get(heroID, {})
         starTalentAttrDict = heroStarTalentInfo.get(heroID, {})
         breakAttrDict = heroBreakAttrInfo.get(heroID, {})
         awakeTalentAttrDict = heroAwakeTalentInfo.get(heroID, {})
@@ -708,6 +727,9 @@
             horseValue = horseAttrDict.get(attrID, 0)
             horsePer = horseAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
             
+            beautyValue = beautyAttrDict.get(attrID, 0)
+            beautyPer = beautyAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
+            
             lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = 0, 0, 0, 0
             if attrID in ChConfig.BaseAttrIDList:
                 lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = InitAddPer, LVAddPer, BreakLVAddPer, StarAddPer
@@ -721,6 +743,7 @@
                 
             lineupHaloValue, lineupHaloPer = lineupHaloAttrInfo.get(attrID, 0), 0
             fetterValue, fetterPer = fetterAttrDict.get(attrID, 0), 0
+            heroLVValue, heroLVPer = heroLVAttrDict.get(attrID, 0), 0
             starTalentValue, starTalentPer = starTalentAttrDict.get(attrID, 0), 0
             breakLVValue, breakLVPer = breakAttrDict.get(attrID, 0), 0
             awakeTalentValue, awakeTalentPer = awakeTalentAttrDict.get(attrID, 0), 0
@@ -728,15 +751,17 @@
                 heroSelfPer = selfAttrDict.get(attrPerID, 0) / 10000.0
                 lineupHaloPer = lineupHaloAttrInfo.get(attrPerID, 0) / 10000.0
                 fetterPer = fetterAttrDict.get(attrPerID, 0) / 10000.0
+                heroLVPer = heroLVAttrDict.get(attrPerID, 0) / 10000.0
                 starTalentPer = starTalentAttrDict.get(attrPerID, 0) / 10000.0
                 breakLVPer = breakAttrDict.get(attrPerID, 0) / 10000.0
                 awakeTalentPer = awakeTalentAttrDict.get(attrPerID, 0) / 10000.0
                 
             # 计算
             attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer, "realmValue":realmValue, "realmPer":realmPer, 
-                             "gubaoValue":gubaoValue, "gubaoPer":gubaoPer, "hjgValue":hjgValue, "hjgPer":hjgPer, "horseValue":horseValue, "horsePer":horsePer,
+                             "gubaoValue":gubaoValue, "gubaoPer":gubaoPer, "hjgValue":hjgValue, "hjgPer":hjgPer, "horseValue":horseValue, "horsePer":horsePer, 
+                             "beautyValue":beautyValue, "beautyPer":beautyPer,
                              "lineupInitAddPer":lineupInitAddPer, "lineupLVAddPer":lineupLVAddPer, "lineupBreakLVAddPer":lineupBreakLVAddPer, "lineupStarAddPer":lineupStarAddPer,
-                             "heroSelfValue":heroSelfValue, "heroSelfPer":heroSelfPer, "inheritPer":inheritPer,
+                             "heroSelfValue":heroSelfValue, "heroSelfPer":heroSelfPer, "inheritPer":inheritPer, "heroLVValue":heroLVValue, "heroLVPer":heroLVPer,
                              "lineupHaloValue":lineupHaloValue, "lineupHaloPer":lineupHaloPer, "fetterValue":fetterValue, "fetterPer":fetterPer,
                              "starTalentValue":starTalentValue, "starTalentPer":starTalentPer, "breakLVValue":breakLVValue, "breakLVPer":breakLVPer,
                              "awakeTalentValue":awakeTalentValue, "awakeTalentPer":awakeTalentPer,
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/PlayerTalk.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py
index c9c991f..ff8820f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py
@@ -39,9 +39,9 @@
     NotifyTalkCache(curPlayer)
     return
 
-#// B3 20 聊天 #tagCMTalk
+#// B3 20 聊天 #tagCSTalk
 #
-#struct    tagCMPyTalk
+#struct    tagCSTalk
 #{
 #    tagHead        Head;
 #    BYTE        ChannelType;    // 频道
@@ -93,6 +93,7 @@
     clientPack.RealmLV = curPlayer.GetOfficialRank()
     clientPack.Face = curPlayer.GetFace()
     clientPack.FacePic = curPlayer.GetFacePic()
+    clientPack.TitleID = PlayerControl.GetTitleID(curPlayer)
     clientPack.ServerID = GameWorld.GetPlayerServerID(curPlayer)
     
     if channelType == IPY_GameWorld.tcWorld:
@@ -218,6 +219,7 @@
             talkCache.RealmLV = viewCache.GetRealmLV()
             talkCache.Face = viewCache.GetFace()
             talkCache.FacePic = viewCache.GetFacePic()
+            talkCache.TitleID = viewCache.GetTitleID()
             talkCache.ServerID = viewCache.GetServerID()
             talkCache.TalkTime = talkTime
             packCacheList.append(talkCache)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
index 1ff3d57..2cf1796 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
@@ -19,6 +19,7 @@
 import IpyGameDataPY
 import PlayerControl
 import NetPackCommon
+import PlayerGoldRush
 import ChPyNetSendPack
 import ItemControler
 import IPY_GameWorld
@@ -151,6 +152,30 @@
         mapID = ChConfig.Def_FBMapID_Main
         lineID = conds[0]
         taskValue = 1 if FBCommon.IsFBPass(curPlayer, mapID, lineID) else 0
+        
+    # 挑战主线关
+    elif taskType == ChConfig.TaskType_MainLevelChallenge:
+        if not conds:
+            return 0
+        mapID = ChConfig.Def_FBMapID_Main
+        lvID = conds[0]
+        taskValue = 1 if PlayerControl.IsMainLevelPass(curPlayer, lvID) else 0
+        if not taskValue:
+            challengeLVID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChallengeLVID)
+            taskValue = 1 if challengeLVID >= lvID else 0
+            
+    elif taskType == ChConfig.TaskType_FBZhanchui:
+        if not conds:
+            return 0
+        mapID = ChConfig.Def_FBMapID_Zhanchui
+        lineID = conds[0]
+        taskValue = 1 if FBCommon.IsFBPass(curPlayer, mapID, lineID) else 0
+        
+    elif taskType == ChConfig.TaskType_GoldRushWorkers:
+        taskValue = PlayerGoldRush.GetWorkerTotal(curPlayer)
+        
+    elif taskType == ChConfig.TaskType_ReqOrJoinFamily:
+        taskValue = 1 if curPlayer.GetFamilyID() else 0
         
     elif taskType == ChConfig.TaskType_TreeLV:
         taskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
@@ -298,15 +323,25 @@
     if curState != ChConfig.TaskState_CanGet:
         GameWorld.DebugLog("任务未完成无法领奖: taskID=%s,curValue=%s/%s,curState=%s" % (taskID, curValue, needValue, curState), playerID)
         return
-    #if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
-    #    return
+    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
+        return
     
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast % taskGroup, taskID)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, 0)
     
-    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["Task", False, {}])
+    # 支持定制属性物品
+    isAuctionItem = 0
+    notifyAwardList = []
+    appointInfo = {}
+    for itemID, itemCount, appointID in awardItemList:
+        setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID} if appointID else {}
+        if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, event=["Task", False, {}], setAttrDict=setAttrDict):
+            continue
+        notifyAwardList.append([itemID, itemCount, isAuctionItem])
+        appointInfo[itemID] = appointID
+    ItemControler.NotifyGiveAwardInfo(curPlayer, notifyAwardList, "Task", dataEx={"appointInfo":appointInfo})
     
     if not __giveNewTask(curPlayer, taskGroup):
         SyncTaskInfo(curPlayer, [taskGroup])
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/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
index 8d271d6..2a80a9e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
@@ -440,20 +440,6 @@
         
     if treasureType in [TreasureType_HeroComm, TreasureType_HeroHigh, TreasureType_HeroScore]:
         PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroCall, treasureCount)
-    #if treasureType == TreasureType_Rune:
-    #    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount)
-    #    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount)
-    #    PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureRune, treasureCount)
-    #elif treasureType == TreasureType_Jipin:
-    #    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Treasure, treasureCount)
-    #    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_Treasure, treasureCount)
-    #    PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureJipin, treasureCount)
-    #elif treasureType == TreasureType_Jueshi:
-    #    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_JSTreasure, treasureCount)
-    #    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_JSTreasure, treasureCount)
-    #    PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureJueshi, treasureCount)
-    #elif treasureType == TreasureType_Gubao:
-    #    PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureGubao, treasureCount)
         
     PlayerActLunhuidian.AddLunhuidianValue(curPlayer, PlayerActLunhuidian.AwardType_Treasure, treasureType, treasureCount)
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py
index 6f3b7c5..40c5f19 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py
@@ -24,6 +24,7 @@
 import IpyGameDataPY
 import PlayerFamily
 import PyMongoMain
+import PlayerTask
 import DirtyList
 import ObjPool
 
@@ -92,6 +93,8 @@
     PlayerFamily.RefreshFamilyMember(curPlayer)
     PlayerBillboard.UpdatePlayerBillboardName(curPlayer)
     #社交名待更新
+    
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_Rename, 1)
     return
 
 def GetPlayerFullName(curPlayer, playerName):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 91e18f4..2247e69 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -37,6 +37,8 @@
 
 g_arenaPlayerMatchDict = {} # 本服竞技场玩家匹配记录缓存 {playerID:[tagPlayerID, ...], ...}
 
+g_beautyEffTypeDict = {} # 红颜特殊效果缓存 {playerID:{effType:[effValue, effTypeValue], ...}, ...}
+
 g_mapIDTxtInfo = {} # MapID.txt 加载的信息
 g_realmDiffPlayerDict = {} # 境界难度玩家信息 {realm:[playerID, ...], ...}
 g_realmDiffNPCRefresh = {} # {(lineID, realm):{refreshID:tagNPCRefresh, ...}}
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 010aabd..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"  # 伴侣信息
 
 #活动类型定义
@@ -273,7 +271,6 @@
 OperationActionName_GrowupBuy = "ActGrowupBuy" # 成长必买活动
 OperationActionName_FeastLogin = "ActFeastLogin" # 节日登录活动
 OperationActionName_FeastWish = "ActFeastWish" # 节日祝福活动
-OperationActionName_FeastTravel = "ActFeastTravel" # 节日游历活动
 OperationActionName_ManyDayRecharge = "ActManyDayRecharge" # 多日连充活动
 OperationActionName_SingleRecharge = "ActSingleRecharge" # 单笔累充活动
 OperationActionName_Turntable = "ActTurntable" # 转盘活动
@@ -289,7 +286,7 @@
 FeastOperationActionNameList = [OperationActionName_FeastWeekParty,
                                 OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
                                 OperationActionName_FeastLogin,
-                                OperationActionName_FeastWish, OperationActionName_FeastTravel,
+                                OperationActionName_FeastWish,
                                 OperationActionName_RechargePrize,
                                 ]
 #所有的运营活动列表,含节日活动
@@ -320,7 +317,7 @@
                                    OperationActionName_WeekParty, OperationActionName_Turntable,
                                    OperationActionName_CollectWords,
                                    OperationActionName_FeastLogin,
-                                   OperationActionName_FeastWish, OperationActionName_FeastTravel,
+                                   OperationActionName_FeastWish,
                                    OperationActionName_ManyDayRecharge, OperationActionName_SingleRecharge,
                                    OperationActionName_GodGift,
                                    ]
@@ -808,6 +805,7 @@
 GameFuncID_Shop = 16            # 商城,坊市
 GameFuncID_Arena = 27           # 竞技场
 GameFuncID_Horse = 37           # 坐骑
+GameFuncID_Travel = 44          # 游历
 
 # 以下为暂时无用的
 GameFuncID_Pet = -1             # 宠物,灵宠 6
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
index a1df592..d87d0f1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
@@ -22,7 +22,7 @@
     remainLayer = max(0, effBuff.GetLayer() - 1)
     effBuff.SetLayer(remainLayer)
     
-    TurnBuff.DoBuffProcess(turnFight, batObj, effBuff)
+    TurnBuff.DoBuffProcess(turnFight, batObj, effBuff, costLayer=1)
     
     if remainLayer <= 0:
         TurnBuff.DoBuffDel(turnFight, batObj, effBuff)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py
index 4178873..138239b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py
@@ -15,5 +15,17 @@
 #"""Version = 2025-09-25 18:00"""
 #-------------------------------------------------------------------------------
 
+import GameWorld
+
 def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, connSkill, **skillkwargs):
-    return curEffect.GetEffectValue(0)
\ No newline at end of file
+    onlyFirstUse = curEffect.GetEffectValue(1) # 是否仅首次释放技能有效
+    if onlyFirstUse:
+        skillID = connSkill.GetSkillID() if connSkill else skillkwargs.get("connSkillID", 0)
+        if not skillID:
+            #GameWorld.DebugLog("没有增加概率的技能ID! %s" % skillkwargs)
+            return
+        useCnt = attacker.GetSkillUseCnt(skillID)
+        if useCnt > 0:
+            GameWorld.DebugLog("技能非首次使用不增加额外概率! skillID=%s,useCnt=%s" % (skillID, useCnt))
+            return
+    return curEffect.GetEffectValue(0)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index c505673..5323c9b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -401,18 +401,12 @@
     # 灼烧/玄火目标优先
     elif tagAffect == ChConfig.SkillTagAffect_Burn:
         atkBackTagFrist = False
-        relativeObj = __GetRelativeObjDefault(batObjMgr, curBatObj, posNum, batLineup)
-        sortObjList = [] # 优先灼烧目标,再对位
-        for aimObj in aimObjList:
-            sortValue = 0
-            buffMgr = aimObj.GetBuffManager()
-            if buffMgr.FindBuffListByState(ChConfig.BatObjState_Burn) or buffMgr.FindBuffListByState(ChConfig.BatObjState_BurnPlus):
-                sortValue = 2
-            elif relativeObj and relativeObj.GetID() == aimObj.GetID():
-                sortValue = 1
-            sortObjList.append([sortValue, aimObj])
-        sortObjList.sort(reverse=True)
-        aimObjList = [s[1] for s in sortObjList]
+        aimObjList = __getBuffStateFirst(batObjMgr, curBatObj, posNum, batLineup, aimObjList, [ChConfig.BatObjState_Burn, ChConfig.BatObjState_BurnPlus])
+        
+    # 承伤盾目标优先
+    elif tagAffect == ChConfig.SkillTagAffect_DamShield:
+        atkBackTagFrist = False
+        aimObjList = __getBuffStateFirst(batObjMgr, curBatObj, posNum, batLineup, aimObjList, [ChConfig.BatObjState_DamShield])
         
     # 仅焚血(毒奶)目标
     elif tagAffect == ChConfig.SkillTagAffect_PoisonCure:
@@ -447,6 +441,20 @@
         aimObjList = aimObjList[:tagCount]
         
     return aimObjList
+
+def __getBuffStateFirst(batObjMgr, curBatObj, posNum, batLineup, aimObjList, checkStateList):
+    ## 获取处于xxbuff状态优先,然后再对位目标
+    relativeObj = __GetRelativeObjDefault(batObjMgr, curBatObj, posNum, batLineup)
+    sortObjList = [] # 优先灼烧目标,再对位
+    for aimObj in aimObjList:
+        sortValue = 0
+        if aimObj.CheckInState(checkStateList):
+            sortValue = 2
+        elif relativeObj and relativeObj.GetID() == aimObj.GetID():
+            sortValue = 1
+        sortObjList.append([sortValue, aimObj])
+    sortObjList.sort(reverse=True)
+    return [s[1] for s in sortObjList]
 
 def CheckChangeTagEff(turnFight, curBatObj, useSkill):
     ## 技能自身设定强制修改目标,目前暂定优先级最高,无视软控
@@ -624,6 +632,7 @@
     atkType = useSkill.GetAtkType()
     GameWorld.DebugLog("__doUseSkill: curID=%s,skillID=%s,atkType=%s" % (curBatObj.GetID(), useSkill.GetSkillID(), atkType))
     
+    __doStealBuff(turnFight, curBatObj, useSkill)
     __doHarmSelf(turnFight, curBatObj, useSkill)
     
     # 通用攻击
@@ -654,6 +663,38 @@
     elif atkType == 9:
         SkillModule_9(turnFight, curBatObj, useSkill)
         
+    return
+
+def __doStealBuff(turnFight, curBatObj, useSkill):
+    ## 施法前偷取buff
+    stealEff = useSkill.GetEffectByID(ChConfig.SkillEff_UseSkillStealBuff)
+    if not stealEff:
+        return
+    buffState = stealEff.GetEffectValue(0) # buff状态
+    stealCnt = stealEff.GetEffectValue(1) # 偷取个数 0-全部;>0-个数
+    isAll = True if stealCnt == 0 else False
+    
+    for tagObj in useSkill.GetTagObjList():
+        if not isAll and stealCnt <= 0:
+            break
+        tagBuffList = tagObj.GetBuffManager().FindBuffListByState(buffState)
+        if not tagBuffList:
+            continue
+        
+        if not isAll and len(tagBuffList) > stealCnt:
+            random.shuffle(tagBuffList) # 随机
+            
+        for tagBuff in tagBuffList:
+            skillID = tagBuff.GetSkillID()
+            buffOwner = curBatObj
+            GameWorld.DebugLog("使用技能前偷取buff: tagID=%s,tagBuffID=%s,buffSkillID=%s" % (tagObj.GetID(), tagBuff.GetBuffID(), skillID))
+            addBuff = TurnBuff.DoAddBuffBySkillID(turnFight, curBatObj, skillID, buffOwner, useSkill, isSync=False)
+            if not addBuff:
+                continue
+            stealCnt -= 1
+            TurnBuff.CopyBuff(turnFight, curBatObj, addBuff, tagBuff, useSkill, True, refreshTimeLayer=False)
+            TurnBuff.DoBuffDel(turnFight, tagObj, tagBuff, relatedSkill=useSkill)
+            
     return
 
 def __doHarmSelf(turnFight, curBatObj, useSkill):
@@ -926,7 +967,7 @@
         
     Sync_UseSkill(turnFight, atkObj, useSkill)
     
-    DoBeAttackResult(turnFight, atkObj, useSkill)
+    DoBeAttackResult(turnFight, atkObj, useSkill, curBuff)
     
     # 通知结束标签
     Sync_TurnFightTag(turnFight, useTag, 1)
@@ -1024,7 +1065,7 @@
     __doCostZhanchui(turnFight, curBatObj, useSkill)
     __doSkillUserAnger(turnFight, curBatObj, useSkill)
     
-    DoBeAttackResult(turnFight, curBatObj, useSkill, True)
+    DoBeAttackResult(turnFight, curBatObj, useSkill)
     return
 
 def DoCombo(turnFight, atkObj, useSkill):
@@ -1149,13 +1190,13 @@
             return useSkill
     return
 
-def DoBeAttackResult(turnFight, curObj, useSkill, isUseSkill=False):
+def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
     '''被攻击结果
     @param curObj: 施法方或buff归属方
-    @param isUseSkill: 是否是直接使用技能的攻击结果,否则视为持续性的
     '''
     
     #curID = curObj.GetID()
+    isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
     isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
     isAngerSkill = SkillCommon.isAngerSkill(useSkill)
     
@@ -1524,7 +1565,8 @@
     enhanceSkillID = curEffect.GetEffectValue(0)
     checkInStateList = curEffect.GetEffectValue(1)
     checkHeroJob = curEffect.GetEffectValue(2)
-    GameWorld.DebugLog("额外触发的技能: enhanceSkillID=%s,checkInStateList=%s,checkHeroJob=%s" % (enhanceSkillID, checkInStateList, checkHeroJob))
+    checkHeroSex = curEffect.GetEffectValue(3)
+    GameWorld.DebugLog("额外触发的技能: enhanceSkillID=%s,checkInStateList=%s,checkHeroJob=%s,checkHeroSex=%s" % (enhanceSkillID, checkInStateList, checkHeroJob, checkHeroSex))
     tagObjList = useSkill.GetTagObjList()
     
     enhanceSkillData = IpyGameDataPY.GetIpyGameData("Skill", enhanceSkillID)
@@ -1544,7 +1586,7 @@
         GameWorld.DebugLog("继承主技能目标! enhanceSkillID=%s" % enhanceSkillID)
         # 额外触发的技能直接在外层检查概率,如果都没有触发则不需要再处理
         enhanceRate = enhanceSkillData.GetHappenRate()
-        enhanceRate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, connSkillTypeID=enhanceSkillData.GetSkillTypeID())
+        enhanceRate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, connSkillTypeID=enhanceSkillData.GetSkillTypeID(), connSkillID=enhanceSkillID)
         enchanceTagObjList = []
         for tagObj in tagObjList:
             tagID = tagObj.GetID()
@@ -1561,6 +1603,9 @@
             if checkHeroJob and checkHeroJob != tagObj.GetJob():
                 GameWorld.DebugLog("    非目标职业不触发: tagID=%s,job=%s != %s" % (tagID, tagObj.GetJob(), checkHeroJob))
                 continue
+            if checkHeroSex and checkHeroSex != tagObj.GetSex():
+                GameWorld.DebugLog("    非目标性别不触发: tagID=%s,sex=%s != %s" % (tagID, tagObj.GetSex(), checkHeroSex))
+                continue
             if enhanceRate and enhanceRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(enhanceRate, ChConfig.Def_MaxRateValue):
                 GameWorld.DebugLog("    概率不触发: tagID=%s,enhanceRate=%s" % (tagID, enhanceRate))
                 continue
@@ -1574,8 +1619,8 @@
     
     # 只执行一次,防止群攻时额外触发多次
     GameWorld.DebugLog("重新锁定目标! enhanceSkillID=%s" % enhanceSkillID)
-    if checkInStateList or checkHeroJob:
-        inState, haveJob = False, False
+    if checkInStateList or checkHeroJob or checkHeroSex:
+        inState, haveJob, haveSex = False, False, False
         for tagObj in tagObjList:
             tagID = tagObj.GetID()
             if tagID in effIgnoreObjIDList:
@@ -1584,11 +1629,16 @@
                 inState = True
             if not haveJob and checkHeroJob and checkHeroJob == tagObj.GetJob():
                 haveJob = True
+            if not haveSex and checkHeroSex and checkHeroSex == tagObj.GetSex():
+                haveSex = True
         if checkInStateList and not inState:
             GameWorld.DebugLog("    没有命中目标在状态下不触发: tagObj not in state:%s" % str(checkInStateList))
             return
         if checkHeroJob and not haveJob:
             GameWorld.DebugLog("    没有命中目标为目标职业不触发: checkHeroJob=%s" % checkHeroJob)
+            return
+        if checkHeroSex and not haveSex:
+            GameWorld.DebugLog("    没有命中目标为目标性别不触发: checkHeroSex=%s" % checkHeroSex)
             return
     OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
     return
@@ -2534,10 +2584,15 @@
     dMaxHP = defObj.GetMaxHP()
     GameWorld.DebugLog("结算dot: atkID=%s,defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s/%s" 
                        % (atkID, defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP, dMaxHP))
+    costLayer = kwargs.get("costLayer")
     layer = curBuff.GetLayer()
-    if layer > 0:
-        hurtValue *= layer
-        GameWorld.DebugLog("    多层buff伤害: hurtValue=%s,layer=%s" % (hurtValue, layer))
+    if costLayer > 0:
+        hurtValue *= min(costLayer, max(1, layer))
+        GameWorld.DebugLog("    消耗buff层伤害: hurtValue=%s,costLayer=%s,layer=%s" % (hurtValue, costLayer, layer))
+    else:
+        if layer > 0:
+            hurtValue *= layer
+            GameWorld.DebugLog("    多层buff伤害: hurtValue=%s,layer=%s" % (hurtValue, layer))
     if "FinalDamPer" in kwargs:
         FinalDamPer = kwargs["FinalDamPer"]
         hurtValue *= (10000 + FinalDamPer) / 10000.0
@@ -2554,7 +2609,7 @@
     
     Sync_UseSkill(turnFight, atkObj, useSkill)
     
-    DoBeAttackResult(turnFight, atkObj, useSkill)
+    DoBeAttackResult(turnFight, atkObj, useSkill, curBuff)
     
     # 通知结束标签
     Sync_TurnFightTag(turnFight, useTag, 1)

--
Gitblit v1.8.0