hch
2025-11-26 ac36bdcfa7db1557790a5b912c3248b22625841f
Merge branch 'master' of http://mobile.secondworld.net.cn:10010/r/Project_SG_ServerCode
40个文件已修改
2个文件已删除
6个文件已添加
5651 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 633 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 2177 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Arena.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Beauty.py 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FBPass.py 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Travel.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevelBoss.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 320 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py 626 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFace.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py 312 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTravel.py 504 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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|个数
};
//功能特权奖励表
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
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 = (
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
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
                                )
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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Beauty.py
New file
@@ -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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FBPass.py
New file
@@ -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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FeastTravel.py
File was deleted
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,6 +44,7 @@
        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):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
New file
@@ -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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -44,16 +44,20 @@
        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)
    if taskValue == None:
        PlayerTask.UpdTaskValue(curPlayer, taskType)
    else:
    PlayerTask.SetTaskValue(curPlayer, ipyData, taskValue)
    
    curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Travel.py
New file
@@ -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
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)})
    
@@ -141,6 +151,11 @@
    updScore = max(0, score + atkAddScore)
    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()
@@ -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
    
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
                
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):
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):
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
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":(
@@ -2509,6 +2524,8 @@
    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 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")
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -2005,10 +2005,10 @@
        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())
        #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]
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
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):
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
        
        # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
New file
@@ -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
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]]
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()
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:
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()
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]]
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:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastTravel.py
File was deleted
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
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]]
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()
    
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,10 +311,14 @@
    ipyData = IpyGameDataPY.GetIpyGameData("HorseSkin", horseSkinID)
    if not ipyData:
        return
    if ipyData.GetUnlockWay() != 2:
        GameWorld.DebugLog("非道具激活的不用添加: horseSkinID=%s" % (horseSkinID), playerID)
        return
    if not isFree:
        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:
@@ -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]]
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,6 +751,7 @@
                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
@@ -735,8 +759,9 @@
            # 计算
            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,
                             "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,
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):
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)
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])
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTravel.py
New file
@@ -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
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)
    
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):
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, ...}}
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
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)
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):
    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)
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)
    
    # 通用攻击
@@ -653,6 +662,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
@@ -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,7 +2584,12 @@
    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 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))
@@ -2554,7 +2609,7 @@
    
    Sync_UseSkill(turnFight, atkObj, useSkill)
    
    DoBeAttackResult(turnFight, atkObj, useSkill)
    DoBeAttackResult(turnFight, atkObj, useSkill, curBuff)
    
    # 通知结束标签
    Sync_TurnFightTag(turnFight, useTag, 1)