Merge branch 'master' of http://mobile.secondworld.net.cn:10010/r/Project_SG_ServerCode
| | |
| | | DWORD _Quality; //品质
|
| | | DWORD _HeroLV; //武将等级
|
| | | list UPCostItem; // 升级到下级消耗道具
|
| | | list AttrIDList; // 武将属性ID列表
|
| | | list AttrValueList; // 累计总属性值列表
|
| | | };
|
| | |
|
| | | //推荐阵容表
|
| | |
| | | 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
|
| | |
| | | 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; //金钱
|
| | | };
|
| | |
|
| | | //寻宝设定表
|
| | |
| | | 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
|
| | |
| | | DWORD NeedExp; //升级需要经验
|
| | | dict AttrInfo; //属性
|
| | | BYTE SkinIndex; //外观
|
| | | };
|
| | |
|
| | | //协助感谢礼盒表
|
| | |
|
| | | struct tagAssistThanksGift
|
| | | {
|
| | | DWORD _GiftID; //礼盒物品ID
|
| | | list RequestPlayerAward; // 发布奖励物品 物品ID|个数
|
| | | list AssistPlayerAward; // 协助奖励物品 物品ID|个数
|
| | | };
|
| | |
|
| | | //功能特权奖励表
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | | Def_CalcAttr_Gubao, # 古宝 4
|
| | | Def_CalcAttr_HJG, # 幻境阁 5
|
| | | Def_CalcAttr_Horse, # 坐骑 6
|
| | | ) = range(7)
|
| | | Def_CalcAttr_Beauty, # 红颜 7
|
| | | ) = range(8)
|
| | |
|
| | | CalcAttrName = {
|
| | | Def_CalcAttr_LV:"主公等级",
|
| | |
| | | Def_CalcAttr_Gubao:"古宝",
|
| | | Def_CalcAttr_HJG:"幻境阁",
|
| | | Def_CalcAttr_Horse:"坐骑",
|
| | | Def_CalcAttr_Beauty:"红颜",
|
| | | }
|
| | |
|
| | | ##-----------------------------------------------------------------------------------------------
|
| | |
| | | SkillTagAffect_AtkHighest, # 攻击力最高 5
|
| | | SkillTagAffect_Burn, # 灼烧/玄火目标优先 6
|
| | | SkillTagAffect_PoisonCure, # 仅焚血(毒奶)目标 7
|
| | | ) = range(8)
|
| | | SkillTagAffect_DamShield, # 承伤盾目标优先 8
|
| | | ) = range(9)
|
| | |
|
| | | #技能施法目标
|
| | | Def_UseSkillAim_Type = 3
|
| | |
| | | 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,用于补发上次活动用
|
| | |
| | | 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值,参数:(活动编号)
|
| | |
| | |
|
| | | #竞技场
|
| | | Def_PDict_ArenaScore = "ArenaScore" # 当前积分
|
| | | Def_PDict_ArenaWinCnt = "ArenaWinCnt" # 累计胜利次数
|
| | |
|
| | | #功能系统特权
|
| | | Def_PDict_FuncSysPrivilegeActTime = "FuncSysPrivilegeActTime_%s" # 系统功能特权激活时间戳,参数(系统功能ID)
|
| | |
| | | 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)
|
| | |
| | | SkillEff_AngerSkillNoXP = 7007 # 无论多少怒气均可释放该怒气技能
|
| | | SkillEff_UseSkillHarmSelf = 7008 # 释放技能时自残(先扣血)
|
| | | SkillEff_SkillUseCntLimit = 7009 # 限制技能最多触发次数
|
| | | SkillEff_UseSkillStealBuff = 7010 # 释放技能前偷取buff
|
| | |
|
| | | (
|
| | | TriggerType_BeSuperHit, # 被暴击触发技能 1
|
| | |
| | | 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 -废弃
|
| | |
| | | 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
|
| | |
| | | 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 = (
|
| | |
| | | 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 = (
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #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):
|
| | |
| | |
|
| | | 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
|
| | | '''\
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B3 20 聊天 #tagCMTalk
|
| | | # B3 20 聊天 #tagCSTalk
|
| | |
|
| | | class tagCMPyTalk(Structure):
|
| | | class tagCSTalk(Structure):
|
| | | Head = tagHead()
|
| | | ChannelType = 0 #(BYTE ChannelType)// 频道
|
| | | Len = 0 #(WORD Len)
|
| | |
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCSTalk=tagCSTalk()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSTalk.Head.Cmd,m_NAtagCSTalk.Head.SubCmd))] = m_NAtagCSTalk
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 12 战斗阵容保存 #tagCSHeroLineupSave
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("Score", c_int), #当前积分
|
| | | ("WinCnt", c_int), #累计胜利次数
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.Cmd = 0xA9
|
| | | self.SubCmd = 0x23
|
| | | self.Score = 0
|
| | | self.WinCnt = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | 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
|
| | |
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | | RealmLV = 0 #(BYTE RealmLV)//境界
|
| | | Face = 0 #(DWORD Face)//基本脸型
|
| | | FacePic = 0 #(DWORD FacePic)//头像框
|
| | | TitleID = 0 #(DWORD TitleID)//佩戴的称号
|
| | | ServerID = 0 #(DWORD ServerID)//所属区服ID
|
| | | data = None
|
| | |
|
| | |
| | | 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
|
| | |
|
| | |
| | | self.RealmLV = 0
|
| | | self.Face = 0
|
| | | self.FacePic = 0
|
| | | self.TitleID = 0
|
| | | self.ServerID = 0
|
| | | return
|
| | |
|
| | |
| | | length += 2
|
| | | length += 1
|
| | | length += 1
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | |
| | | 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
|
| | |
|
| | |
| | | RealmLV:%d,
|
| | | Face:%d,
|
| | | FacePic:%d,
|
| | | TitleID:%d,
|
| | | ServerID:%d
|
| | | '''\
|
| | | %(
|
| | |
| | | self.RealmLV,
|
| | | self.Face,
|
| | | self.FacePic,
|
| | | self.TitleID,
|
| | | self.ServerID
|
| | | )
|
| | | return DumpString
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | | self.RealmLV = 0
|
| | | self.Face = 0
|
| | | self.FacePic = 0
|
| | | self.TitleID = 0
|
| | | self.ServerID = 0
|
| | | self.TalkTime = 0
|
| | | return
|
| | |
| | | length += 2
|
| | | length += 1
|
| | | length += 1
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | |
| | | 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
|
| | |
| | | RealmLV:%d,
|
| | | Face:%d,
|
| | | FacePic:%d,
|
| | | TitleID:%d,
|
| | | ServerID:%d,
|
| | | TalkTime:%d
|
| | | '''\
|
| | |
| | | self.RealmLV,
|
| | | self.Face,
|
| | | self.FacePic,
|
| | | self.TitleID,
|
| | | self.ServerID,
|
| | | self.TalkTime
|
| | | )
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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
|
| | |
|
| New file |
| | |
| | | #!/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
|
| New file |
| | |
| | | #!/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
|
| | |
|
| | |
| | | import GameFuncComm
|
| | | import ChConfig
|
| | | import ShareDefine
|
| | | import PlayerOnline
|
| | |
|
| | | ## GM命令执行入口
|
| | | # @param curPlayer 当前玩家
|
| | |
| | | else:
|
| | | openFuncID = cmdList[1] if len(cmdList) > 1 else 0
|
| | | DoGMOpenFunc(curPlayer, openFuncID)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).ReCalcAllAttr()
|
| | |
|
| | | PrintFuncOpenState(curPlayer)
|
| | | return
|
| | |
| | |
|
| | | GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s" % needMissionIDList, curPlayer.GetPlayerID())
|
| | | #最后强制触发一次
|
| | | GameFuncComm.DoFuncOpenLogic(curPlayer)
|
| | | GameFuncComm.DoFuncOpenLogic(curPlayer, checkServerDay=False)
|
| | | return
|
| | |
|
| | | def __GetOpenFuncLimit(curPlayer, openFuncIDList):
|
| New file |
| | |
| | | #!/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
|
| | |
| | | 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)
|
| New file |
| | |
| | | #!/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
|
| | |
| | | import PlayerBillboard
|
| | | import PlayerZhanling
|
| | | import ItemControler
|
| | | import PlayerBeauty
|
| | | import PlayerArena
|
| | | import PlayerGubao
|
| | | import PyGameData
|
| | | import PlayerTask
|
| | | import FBCommon
|
| | | import ChConfig
|
| | |
|
| | |
| | |
|
| | | if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket, 1):
|
| | | return
|
| | | |
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ArenaBattle)
|
| | |
|
| | | return True, funcLineID
|
| | |
|
| | |
| | | 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)})
|
| | |
|
| | |
| | | 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()
|
| | |
| | | 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
|
| | |
|
| | |
| | | import ItemControler
|
| | | import IPY_GameWorld
|
| | | import NetPackCommon
|
| | | import PlayerBeauty
|
| | | import PlayerArena
|
| | | import PlayerLLMJ
|
| | | import ItemCommon
|
| | |
| | | # 其他战利品掉落
|
| | | 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)
|
| | |
| | | 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
|
| | |
|
| | |
| | | import IpyGameDataPY
|
| | | import PlayerControl
|
| | | import ItemControler
|
| | |
|
| | | import PlayerTask
|
| | | import FBCommon
|
| | | import ChConfig
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求
|
| | |
| | | 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):
|
| | |
| | | import NetPackCommon
|
| | | import IpyGameDataPY
|
| | | import ShareDefine
|
| | | import PlayerTask
|
| | | import PlayerMail
|
| | | import DBDataMgr
|
| | | import TurnSkill
|
| | |
| | | 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):
|
| | |
| | |
|
| | | import GameWorld
|
| | | import ItemControler
|
| | | import PlayerBeauty
|
| | | import FBCommon
|
| | | import PlayerTask
|
| | | import ChConfig
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
| | | ("DWORD", "Quality", 1),
|
| | | ("DWORD", "HeroLV", 1),
|
| | | ("list", "UPCostItem", 0),
|
| | | ("list", "AttrIDList", 0),
|
| | | ("list", "AttrValueList", 0),
|
| | | ),
|
| | |
|
| | | "LineupRecommend":(
|
| | |
| | | ("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),
|
| | |
| | | ("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":(
|
| | |
| | | ("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),
|
| | |
| | | ("DWORD", "NeedExp", 0),
|
| | | ("dict", "AttrInfo", 0),
|
| | | ("BYTE", "SkinIndex", 0),
|
| | | ),
|
| | |
|
| | | "AssistThanksGift":(
|
| | | ("DWORD", "GiftID", 1),
|
| | | ("list", "RequestPlayerAward", 0),
|
| | | ("list", "AssistPlayerAward", 0),
|
| | | ),
|
| | |
|
| | | "FuncSysPrivilege":(
|
| | |
| | | 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(): |
| | |
| | | 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(): |
| | | |
| | |
| | | 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(): |
| | |
| | | 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(): |
| | | |
| | |
| | | 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(): |
| | | |
| | |
| | | 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)
|
| | |
| | | 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)
|
| | |
| | | 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)
|
| | |
| | | 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)
|
| | |
| | | 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
|
| | |
| | | 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") |
| | |
| | | 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
|
| | |
| | | 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") |
| | |
| | | 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]
|
| | |
| | | import PlayerTongTianLing
|
| | | import CrossPlayerData
|
| | | import PlayerFeastWish
|
| | | import PlayerFeastTravel
|
| | | import PlayerWeekParty
|
| | | import NPCRealmRefresh
|
| | | import PlayerActLogin
|
| | |
| | | import PlayerBossReborn
|
| | | import PlayerWeekParty
|
| | | import PlayerFeastWeekParty
|
| | | import PlayerFeastTravel
|
| | | import PlayerFeastLogin
|
| | | import PlayerFeastWish
|
| | | import PlayerActLogin
|
| | |
| | | import PlayerTalk
|
| | | import PlayerHero
|
| | | import PlayerOnline
|
| | | import PlayerBeauty
|
| | | import PlayerTravel
|
| | | import TurnAttack
|
| | | import PlayerHJG
|
| | | import ObjPool
|
| | |
| | | PlayerFeastLogin.OnPlayerLogin(curPlayer)
|
| | | # 节日祝福活动
|
| | | PlayerFeastWish.OnPlayerLogin(curPlayer)
|
| | | # 节日游历活动
|
| | | PlayerFeastTravel.OnPlayerLogin(curPlayer)
|
| | | # 登录奖励活动
|
| | | PlayerActLogin.OnLogin(curPlayer)
|
| | | # 炼器活动
|
| | |
| | | UpdatePlayerName.OnPlayerLogin(curPlayer)
|
| | | PlayerActivity.OnPlayerLogin(curPlayer)
|
| | | PlayerLLMJ.OnPlayerLogin(curPlayer)
|
| | | PlayerBeauty.OnPlayerLogin(curPlayer)
|
| | | PlayerTravel.OnPlayerLogin(curPlayer)
|
| | |
|
| | | # 上线查询一次充值订单
|
| | | curPlayer.SendDBQueryRecharge()
|
| | |
| | | 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)
|
| | |
| | | # 功能开启奖励
|
| | | elif rewardType == ChConfig.Def_RewardType_OpenFunc:
|
| | | GameFuncComm.GetFuncOpenAward(curPlayer, dataEx)
|
| | | # 红颜等级奖励
|
| | | elif rewardType == ChConfig.Def_RewardType_BeautyLVAward:
|
| | | PlayerBeauty.GetBeautyLVAward(curPlayer, dataEx)
|
| | |
|
| | |
|
| | | # 每日免费直购礼包
|
| | |
| | | # 领取节日登录奖励
|
| | | 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)
|
| | |
| | | elif adAwardType == 3:
|
| | | treasureType = adAwardValue
|
| | | PlayerTreasure.DoTreasure(curPlayer, treasureType, PlayerTreasure.CostType_ADFree)
|
| | | # 游历体力
|
| | | elif adAwardType == 4:
|
| | | PlayerTravel.AddTravelEnergy(curPlayer, adAwardValue)
|
| | | return
|
| | |
|
| | | def ADCntOnDay(curPlayer):
|
| | |
| | | import PlayerActBuyCountGift
|
| | | import PlayerActLoginNew
|
| | | import PlayerActTask
|
| | | import IPY_GameWorld
|
| | | import ItemCommon
|
| | | import ItemControler
|
| | | import PlayerTravel
|
| | | import PlayerHorse
|
| | | import PlayerArena
|
| | | import PlayerTask
|
| | |
| | | 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列表
|
| | | '''
|
| | |
| | | continue
|
| | |
|
| | | limitOpenDay = ipyData.GetLimitOpenDay()
|
| | | if limitOpenDay and serverDay < limitOpenDay:
|
| | | if limitOpenDay and serverDay < limitOpenDay and checkServerDay:
|
| | | continue
|
| | |
|
| | | # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
|
| | |
| | | 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
|
| New file |
| | |
| | | #!/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
|
| | |
| | | if ipyData.GetUnlockWay() != 2:
|
| | | return
|
| | | itemID = ipyData.GetUnlockValue()
|
| | | itemCount = ipyData.GetUnlockNeedCnt()
|
| | | itemCount = ipyData.GetUpNeedCnt()
|
| | | if not itemID or not itemCount:
|
| | | return
|
| | | needItemList = [[itemID, itemCount]]
|
| | |
| | | import CrossActCTGBillboard
|
| | | import CrossActAllRecharge
|
| | | import PlayerActGrowupBuy
|
| | | import PlayerFeastTravel
|
| | | import PlayerWeekParty
|
| | | import PlayerGoldInvest
|
| | | import PlayerActTurntable
|
| | |
| | | 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()
|
| | |
| | | import GameFuncComm
|
| | | import IpyGameDataPY
|
| | | import PyGameData
|
| | | import PlayerFeastTravel
|
| | | import PlayerActTurntable
|
| | | import PlayerCostRebate
|
| | | import PlayerActLunhuidian
|
| | |
| | | # 消费返利
|
| | | 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())
|
| | |
|
| | |
| | | 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:
|
| | |
| | | import PlayerBossReborn
|
| | | import PlayerWeekParty
|
| | | import PlayerFeastWeekParty
|
| | | import PlayerFeastTravel
|
| | | import PlayerFeastLogin
|
| | | import PlayerFeastWish
|
| | | import PlayerActTask
|
| | |
| | | import PlayerXiangong
|
| | | import PlayerBillboard
|
| | | import PlayerViewCache
|
| | | import GameFuncComm
|
| | | import PlayerMail
|
| | | import PlayerHero
|
| | | import PlayerTree
|
| | |
| | |
|
| | | # 常规过天
|
| | | if onEventType == ShareDefine.Def_OnEventType:
|
| | | |
| | | GameFuncComm.DoFuncOpenLogic(curPlayer)
|
| | | #清空每日事件奖励
|
| | | curPlayer.SetDayProcessGameEventCount(0)
|
| | |
|
| | |
| | |
|
| | | elif actionName == ShareDefine.OperationActionName_FeastWish:
|
| | | PlayerFeastWish.RefreshFeastWishActionInfo()
|
| | | |
| | | elif actionName == ShareDefine.OperationActionName_FeastTravel:
|
| | | PlayerFeastTravel.RefreshFeastTravelActionInfo()
|
| | |
|
| | | elif actionName == ShareDefine.OperationActionName_FeastWeekParty:
|
| | | PlayerFeastWeekParty.RefreshOperationAction_FeastWeekParty()
|
| | |
| | | if ipyData.GetUnlockWay() != 2:
|
| | | return
|
| | | itemID = ipyData.GetUnlockValue()
|
| | | itemCount = ipyData.GetUnlockNeedCnt()
|
| | | itemCount = ipyData.GetUpNeedCnt()
|
| | | if not itemID or not itemCount:
|
| | | return
|
| | | needItemList = [[itemID, itemCount]]
|
| | |
| | | if ipyData.GetUnlockWay() != 2:
|
| | | return
|
| | | itemID = ipyData.GetUnlockValue()
|
| | | itemCount = ipyData.GetUnlockNeedCnt()
|
| | | itemCount = ipyData.GetUpNeedCnt()
|
| | | if not itemID or not itemCount:
|
| | | return
|
| | | needItemList = [[itemID, itemCount]]
|
| | |
| | | import IPY_GameWorld
|
| | | import ItemControler
|
| | | import GameFuncComm
|
| | | import PlayerTask
|
| | | import DBDataMgr
|
| | | import DirtyList
|
| | | import ObjPool
|
| | |
| | | familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
|
| | | Sync_RequestAddFamilyInfo(curPlayer)
|
| | | PlayerFamilyTaofa.OnPlayerEnterFamily(curPlayer)
|
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily)
|
| | | return
|
| | |
|
| | | def __OnLeaveFamily(curPlayer, isVoluntarily, tick):
|
| | |
| | |
|
| | | # 申请加入
|
| | | if requestType == 0:
|
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily, 1)
|
| | | if not tagFamilyID:
|
| | | AutoJoinFamily(curPlayer)
|
| | | else:
|
| | |
| | | import GameFuncComm
|
| | | import PlayerGubao
|
| | | import ShareDefine
|
| | | import PlayerTask
|
| | | import ObjPool
|
| | |
|
| | | import time
|
| | |
| | | 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))
|
| | |
| | | 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):
|
| | | ## 取消
|
| | |
| | | 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
|
| | |
| | | if ipyData.GetUnlockWay() != 2:
|
| | | return
|
| | | itemID = ipyData.GetUnlockValue()
|
| | | itemCount = ipyData.GetUnlockNeedCnt()
|
| | | itemCount = ipyData.GetUpNeedCnt()
|
| | | if not itemID or not itemCount:
|
| | | return
|
| | | needItemList = [[itemID, itemCount]]
|
| | |
| | | if ipyData.GetUnlockWay() != 2:
|
| | | return
|
| | | itemID = ipyData.GetUnlockValue()
|
| | | itemCount = ipyData.GetUnlockNeedCnt()
|
| | | itemCount = ipyData.GetUpNeedCnt()
|
| | | if not itemID or not itemCount:
|
| | | return
|
| | | needItemList = [[itemID, itemCount]]
|
| | |
| | | import NetPackCommon
|
| | | import PlayerControl
|
| | | import PlayerOnline
|
| | | import PlayerTask
|
| | | import GameWorld
|
| | | import ChConfig
|
| | |
|
| | |
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | |
|
| | | PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroLVUP, 1)
|
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroLVUP)
|
| | | return
|
| | |
|
| | | def GetHeroLVMax(heroItem):
|
| | |
| | | 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()
|
| | |
|
| | |
| | | import IpyGameDataPY
|
| | | import GameFuncComm
|
| | | import PlayerOnline
|
| | | import PlayerTask
|
| | | import GameWorld
|
| | | import ObjPool
|
| | |
|
| | |
| | | # 有升级额外处理
|
| | | if updHorseLV > horseLV:
|
| | | RefreshHorseAttr(curPlayer)
|
| | | |
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HorseLVUP, costItemCount)
|
| | | return
|
| | |
|
| | | #// B2 02 坐骑进阶 #tagCSHorseClassUP
|
| | |
| | | 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:
|
| | |
| | | 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:
|
| | |
| | | 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
|
| | |
|
| | |
| | | if ipyData.GetUnlockWay() != 2:
|
| | | return
|
| | | itemID = ipyData.GetUnlockValue()
|
| | | itemCount = ipyData.GetUnlockNeedCnt()
|
| | | itemCount = ipyData.GetUpNeedCnt()
|
| | | if not itemID or not itemCount:
|
| | | return
|
| | | needItemList = [[itemID, itemCount]]
|
| | |
| | | import IpyGameDataPY
|
| | | import FormulaControl
|
| | | import PlayerPrestigeSys
|
| | | import PlayerBeauty
|
| | | import PlayerFamily
|
| | | import PlayerHorse
|
| | | import PlayerGubao
|
| | |
| | | PlayerGubao.CalcGubaoAttr(curPlayer)
|
| | | PlayerHJG.CalcHJGAttr(curPlayer)
|
| | | PlayerHorse.CalcHorseAttr(curPlayer)
|
| | | PlayerBeauty.CalcBeautyAttr(curPlayer)
|
| | | return
|
| | |
|
| | | def doRefreshLineupAttr(curPlayer, olPlayer, lineup):
|
| | |
| | | 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, ...}, ...}
|
| | |
| | | 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 = {}
|
| | |
| | | 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)
|
| | |
| | | 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()
|
| | |
| | | lineupHero.heroBatAttrDict = {}
|
| | | lineupHero.fightPower = 0
|
| | |
|
| | | heroLVAttrDict = heroLVAttrInfo.get(heroID, {})
|
| | | starTalentAttrDict = heroStarTalentInfo.get(heroID, {})
|
| | | breakAttrDict = heroBreakAttrInfo.get(heroID, {})
|
| | | awakeTalentAttrDict = heroAwakeTalentInfo.get(heroID, {})
|
| | |
| | | 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
|
| | |
| | |
|
| | | 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
|
| | |
| | | heroSelfPer = selfAttrDict.get(attrPerID, 0) / 10000.0
|
| | | lineupHaloPer = lineupHaloAttrInfo.get(attrPerID, 0) / 10000.0
|
| | | fetterPer = fetterAttrDict.get(attrPerID, 0) / 10000.0
|
| | | heroLVPer = heroLVAttrDict.get(attrPerID, 0) / 10000.0
|
| | | starTalentPer = starTalentAttrDict.get(attrPerID, 0) / 10000.0
|
| | | breakLVPer = breakAttrDict.get(attrPerID, 0) / 10000.0
|
| | | awakeTalentPer = awakeTalentAttrDict.get(attrPerID, 0) / 10000.0
|
| | |
| | | # 计算
|
| | | attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer, "realmValue":realmValue, "realmPer":realmPer,
|
| | | "gubaoValue":gubaoValue, "gubaoPer":gubaoPer, "hjgValue":hjgValue, "hjgPer":hjgPer, "horseValue":horseValue, "horsePer":horsePer,
|
| | | "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,
|
| | |
| | | import PlayerBackup
|
| | | import PlayerOnline
|
| | | import PlayerGoldRush
|
| | | import PlayerTravel
|
| | | import PlayerHorse
|
| | | import PlayerHJG
|
| | |
|
| | |
| | | #PlayerFlashSale.ProcessFlashSaleMail(curPlayer, tick)
|
| | | #淘金
|
| | | PlayerGoldRush.OnProcess(curPlayer)
|
| | | #游历
|
| | | PlayerTravel.OnProcess(curPlayer)
|
| | | return
|
| | |
|
| | | def ProcessPlayerMinute(curPlayer, tick):
|
| | |
| | | NotifyTalkCache(curPlayer)
|
| | | return
|
| | |
|
| | | #// B3 20 聊天 #tagCMTalk
|
| | | #// B3 20 聊天 #tagCSTalk
|
| | | #
|
| | | #struct tagCMPyTalk
|
| | | #struct tagCSTalk
|
| | | #{
|
| | | # tagHead Head;
|
| | | # BYTE ChannelType; // 频道
|
| | |
| | | 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:
|
| | |
| | | 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)
|
| | |
| | | import IpyGameDataPY
|
| | | import PlayerControl
|
| | | import NetPackCommon
|
| | | import PlayerGoldRush
|
| | | import ChPyNetSendPack
|
| | | import ItemControler
|
| | | import IPY_GameWorld
|
| | |
| | | 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)
|
| | |
| | | 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])
|
| New file |
| | |
| | | #!/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
|
| | |
| | |
|
| | | 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)
|
| | |
|
| | |
| | | import IpyGameDataPY
|
| | | import PlayerFamily
|
| | | import PyMongoMain
|
| | | import PlayerTask
|
| | | import DirtyList
|
| | | import ObjPool
|
| | |
|
| | |
| | | PlayerFamily.RefreshFamilyMember(curPlayer)
|
| | | PlayerBillboard.UpdatePlayerBillboardName(curPlayer)
|
| | | #社交名待更新
|
| | | |
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_Rename, 1)
|
| | | return
|
| | |
|
| | | def GetPlayerFullName(curPlayer, playerName):
|
| | |
| | |
|
| | | g_arenaPlayerMatchDict = {} # 本服竞技场玩家匹配记录缓存 {playerID:[tagPlayerID, ...], ...}
|
| | |
|
| | | g_beautyEffTypeDict = {} # 红颜特殊效果缓存 {playerID:{effType:[effValue, effTypeValue], ...}, ...}
|
| | |
|
| | | g_mapIDTxtInfo = {} # MapID.txt 加载的信息
|
| | | g_realmDiffPlayerDict = {} # 境界难度玩家信息 {realm:[playerID, ...], ...}
|
| | | g_realmDiffNPCRefresh = {} # {(lineID, realm):{refreshID:tagNPCRefresh, ...}}
|
| | |
| | |
|
| | | Def_Notify_WorldKey_HurtLog = 'HurtLog' # 战斗伤害日志
|
| | |
|
| | | Def_Notify_WorldKey_AssistBoss = "AssistBoss" # 协助boss
|
| | |
|
| | | Def_Notify_WorldKey_CoupleInfo = "CoupleInfo" # 伴侣信息
|
| | |
|
| | | #活动类型定义
|
| | |
| | | OperationActionName_GrowupBuy = "ActGrowupBuy" # 成长必买活动
|
| | | OperationActionName_FeastLogin = "ActFeastLogin" # 节日登录活动
|
| | | OperationActionName_FeastWish = "ActFeastWish" # 节日祝福活动
|
| | | OperationActionName_FeastTravel = "ActFeastTravel" # 节日游历活动
|
| | | OperationActionName_ManyDayRecharge = "ActManyDayRecharge" # 多日连充活动
|
| | | OperationActionName_SingleRecharge = "ActSingleRecharge" # 单笔累充活动
|
| | | OperationActionName_Turntable = "ActTurntable" # 转盘活动
|
| | |
| | | FeastOperationActionNameList = [OperationActionName_FeastWeekParty,
|
| | | OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
|
| | | OperationActionName_FeastLogin,
|
| | | OperationActionName_FeastWish, OperationActionName_FeastTravel,
|
| | | OperationActionName_FeastWish,
|
| | | OperationActionName_RechargePrize,
|
| | | ]
|
| | | #所有的运营活动列表,含节日活动
|
| | |
| | | OperationActionName_WeekParty, OperationActionName_Turntable,
|
| | | OperationActionName_CollectWords,
|
| | | OperationActionName_FeastLogin,
|
| | | OperationActionName_FeastWish, OperationActionName_FeastTravel,
|
| | | OperationActionName_FeastWish,
|
| | | OperationActionName_ManyDayRecharge, OperationActionName_SingleRecharge,
|
| | | OperationActionName_GodGift,
|
| | | ]
|
| | |
| | | GameFuncID_Shop = 16 # 商城,坊市
|
| | | GameFuncID_Arena = 27 # 竞技场
|
| | | GameFuncID_Horse = 37 # 坐骑
|
| | | GameFuncID_Travel = 44 # 游历
|
| | |
|
| | | # 以下为暂时无用的
|
| | | GameFuncID_Pet = -1 # 宠物,灵宠 6
|
| | |
| | | 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)
|
| | |
| | | #"""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) |
| | |
| | | # 灼烧/玄火目标优先
|
| | | 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:
|
| | |
| | | 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):
|
| | | ## 技能自身设定强制修改目标,目前暂定优先级最高,无视软控
|
| | |
| | | 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)
|
| | |
|
| | | # 通用攻击
|
| | |
| | | # 弹射治疗
|
| | | 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
|
| | |
|
| | |
| | |
|
| | | Sync_UseSkill(turnFight, atkObj, useSkill)
|
| | |
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill)
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill, curBuff)
|
| | |
|
| | | # 通知结束标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
| | | __doCostZhanchui(turnFight, curBatObj, useSkill)
|
| | | __doSkillUserAnger(turnFight, curBatObj, useSkill)
|
| | |
|
| | | DoBeAttackResult(turnFight, curBatObj, useSkill, True)
|
| | | DoBeAttackResult(turnFight, curBatObj, useSkill)
|
| | | return
|
| | |
|
| | | def DoCombo(turnFight, atkObj, useSkill):
|
| | |
| | | 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)
|
| | |
|
| | |
| | | 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)
|
| | |
| | | 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()
|
| | |
| | | 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
|
| | |
| | |
|
| | | # 只执行一次,防止群攻时额外触发多次
|
| | | 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:
|
| | |
| | | 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
|
| | |
| | | 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))
|
| | |
| | |
|
| | | Sync_UseSkill(turnFight, atkObj, useSkill)
|
| | |
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill)
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill, curBuff)
|
| | |
|
| | | # 通知结束标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|