16 卡牌服务端(功能开启删除不需要字段;支持任务开启功能;)
| | |
| | | {
|
| | | DWORD _FuncId; //功能标识
|
| | | DWORD LimitLV; //开启等级
|
| | | DWORD LimitMagicWeapon; //需要解锁法宝ID
|
| | | WORD LimiRealmLV; //需要境界等级
|
| | | DWORD LimitMissionID; //需要完成的任务ID
|
| | | BYTE LimitVIPLV; //需要VIP等级
|
| | | char MailKey; //邮件
|
| | | };
|
| | |
|
| | |
| | | Def_PDict_GFPassiveIndex = "GFP_%s_%s" # 被动功法 页数-索引
|
| | | Def_PDict_GFPassivePage = "GFPPage" # 被动功法选中页数
|
| | |
|
| | | # 挂机收益
|
| | | Def_PDict_GuajiCalcTime = "GuajiCalcTime" # 上次统计收益时间戳
|
| | | Def_PDict_GuajiAwardSeconds = "GuajiAwardSeconds" # 已累计收益时长,秒
|
| | | Def_PDict_GuajiQuickCount = "GuajiQuickCount" # 今日已快速收益次数
|
| | | Def_PDict_GuajiExp = "GuajiExp" # 经验
|
| | | Def_PDict_GuajiExpPoint = "GuajiExpPoint" # 经验超过E部分
|
| | | Def_PDict_GuajiMoneyType = "GuajiMoneyType_%s" # 获得货币类型,参数(索引)
|
| | | Def_PDict_GuajiMoneyValue = "GuajiMoneyValue_%s" # 获得货币值,参数(索引)
|
| | | Def_PDict_GuajiMoneyUnSeconds = "GuajiMoneyUnSeconds_%s" # 计算获得货币值时未处理收益的累计时长,秒,参数(货币类型)
|
| | | Def_PDict_GuajiItemUnSeconds = "GuajiItemUnSeconds" # 计算获得物品次数时未处理收益的累计时长,秒
|
| | | Def_PDict_GuajiItemID = "GuajiItemID_%s" # 获得物品ID,参数(索引)
|
| | | Def_PDict_GuajiItemCount = "GuajiItemCount_%s" # 获得物品个数,参数(索引)
|
| | |
|
| | | #套装
|
| | | Def_PDict_EquipPartSuiteLV = "EQPartSuiteLV_%s_%s" #部位套装等级 参数 部位、套装类型
|
| | | Def_PDict_EquipPartSuiteActivate = "EQPartSuiteActivate_%s" #套装激活记录 参数 key编号
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B1 09 玩家挂机系统信息 #tagMCGuajiInfo
|
| | |
|
| | | class tagMCGuajiMoney(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("MoneyType", c_ubyte), |
| | | ("MoneyValue", 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.MoneyType = 0
|
| | | self.MoneyValue = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCGuajiMoney)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B1 09 玩家挂机系统信息 //tagMCGuajiInfo:
|
| | | MoneyType:%d,
|
| | | MoneyValue:%d
|
| | | '''\
|
| | | %(
|
| | | self.MoneyType,
|
| | | self.MoneyValue
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCGuajiItem(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("ItemID", c_int), |
| | | ("Count", 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.ItemID = 0
|
| | | self.Count = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCGuajiItem)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B1 09 玩家挂机系统信息 //tagMCGuajiInfo:
|
| | | ItemID:%d,
|
| | | Count:%d
|
| | | '''\
|
| | | %(
|
| | | self.ItemID,
|
| | | self.Count
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCGuajiInfo(Structure):
|
| | | Head = tagHead()
|
| | | QuickAwardCount = 0 #(BYTE QuickAwardCount)// 今日已快速挂机收益次数
|
| | | AwardType = 0 #(BYTE AwardType)// 收益类型: 0-已累计预览;1-领取结算结果(包含常规领取跟快速领取)
|
| | | AwardSeconds = 0 #(DWORD AwardSeconds)// 已累计收益时长,秒
|
| | | Exp = 0 #(DWORD Exp)// 已累计经验,求余亿部分
|
| | | ExpPoint = 0 #(DWORD ExpPoint)// 已累计经验,整除亿部分
|
| | | MoneyLen = 0 #(BYTE MoneyLen)
|
| | | MoneyList = list() #(vector<tagMCGuajiMoney> MoneyList)// 已累计货币
|
| | | ItemLen = 0 #(BYTE ItemLen)
|
| | | ItemList = list() #(vector<tagMCGuajiItem> ItemList)// 已累计物品
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB1
|
| | | self.Head.SubCmd = 0x09
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.QuickAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.AwardType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.AwardSeconds,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.Exp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ExpPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.MoneyLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.MoneyLen):
|
| | | temMoneyList = tagMCGuajiMoney()
|
| | | _pos = temMoneyList.ReadData(_lpData, _pos)
|
| | | self.MoneyList.append(temMoneyList)
|
| | | self.ItemLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.ItemLen):
|
| | | temItemList = tagMCGuajiItem()
|
| | | _pos = temItemList.ReadData(_lpData, _pos)
|
| | | self.ItemList.append(temItemList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB1
|
| | | self.Head.SubCmd = 0x09
|
| | | self.QuickAwardCount = 0
|
| | | self.AwardType = 0
|
| | | self.AwardSeconds = 0
|
| | | self.Exp = 0
|
| | | self.ExpPoint = 0
|
| | | self.MoneyLen = 0
|
| | | self.MoneyList = list()
|
| | | self.ItemLen = 0
|
| | | self.ItemList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 1
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | | length += 1
|
| | | for i in range(self.MoneyLen):
|
| | | length += self.MoneyList[i].GetLength()
|
| | | length += 1
|
| | | for i in range(self.ItemLen):
|
| | | length += self.ItemList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.QuickAwardCount)
|
| | | data = CommFunc.WriteBYTE(data, self.AwardType)
|
| | | data = CommFunc.WriteDWORD(data, self.AwardSeconds)
|
| | | data = CommFunc.WriteDWORD(data, self.Exp)
|
| | | data = CommFunc.WriteDWORD(data, self.ExpPoint)
|
| | | data = CommFunc.WriteBYTE(data, self.MoneyLen)
|
| | | for i in range(self.MoneyLen):
|
| | | data = CommFunc.WriteString(data, self.MoneyList[i].GetLength(), self.MoneyList[i].GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.ItemLen)
|
| | | for i in range(self.ItemLen):
|
| | | data = CommFunc.WriteString(data, self.ItemList[i].GetLength(), self.ItemList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | QuickAwardCount:%d,
|
| | | AwardType:%d,
|
| | | AwardSeconds:%d,
|
| | | Exp:%d,
|
| | | ExpPoint:%d,
|
| | | MoneyLen:%d,
|
| | | MoneyList:%s,
|
| | | ItemLen:%d,
|
| | | ItemList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.QuickAwardCount,
|
| | | self.AwardType,
|
| | | self.AwardSeconds,
|
| | | self.Exp,
|
| | | self.ExpPoint,
|
| | | self.MoneyLen,
|
| | | "...",
|
| | | self.ItemLen,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCGuajiInfo=tagMCGuajiInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGuajiInfo.Head.Cmd,m_NAtagMCGuajiInfo.Head.SubCmd))] = m_NAtagMCGuajiInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B1 22 武将信息 #tagSCHeroInfo
|
| | |
|
| | | class tagSCHero(Structure):
|
| | |
| | | "FuncOpenLV":(
|
| | | ("DWORD", "FuncId", 1),
|
| | | ("DWORD", "LimitLV", 0),
|
| | | ("DWORD", "LimitMagicWeapon", 0),
|
| | | ("WORD", "LimiRealmLV", 0),
|
| | | ("DWORD", "LimitMissionID", 0),
|
| | | ("BYTE", "LimitVIPLV", 0),
|
| | | ("char", "MailKey", 0),
|
| | | ),
|
| | |
|
| | |
| | | |
| | | def GetFuncId(self): return self.attrTuple[0] # 功能标识 DWORD
|
| | | def GetLimitLV(self): return self.attrTuple[1] # 开启等级 DWORD
|
| | | def GetLimitMagicWeapon(self): return self.attrTuple[2] # 需要解锁法宝ID DWORD
|
| | | def GetLimiRealmLV(self): return self.attrTuple[3] # 需要境界等级 WORD
|
| | | def GetLimitMissionID(self): return self.attrTuple[4] # 需要完成的任务ID DWORD
|
| | | def GetLimitVIPLV(self): return self.attrTuple[5] # 需要VIP等级 BYTE
|
| | | def GetMailKey(self): return self.attrTuple[6] # 邮件 char |
| | | def GetLimiRealmLV(self): return self.attrTuple[2] # 需要境界等级 WORD
|
| | | def GetLimitMissionID(self): return self.attrTuple[3] # 需要完成的任务ID DWORD
|
| | | def GetMailKey(self): return self.attrTuple[4] # 邮件 char |
| | | |
| | | # 合成表 |
| | | class IPY_ItemCompound(): |
| | |
| | | import PlayerLove
|
| | | import GameObj
|
| | | import PlayerChangeJob
|
| | | import PlayerGuaji
|
| | | import PlayerFace
|
| | | import PlayerChatBox
|
| | | import PlayerXiangong
|
| | |
| | | PlayerTask.OnPlayerLogin(curPlayer)
|
| | | PlayerTree.OnPlayerLogin(curPlayer)
|
| | | PlayerMineArea.OnPlayerLogin(curPlayer)
|
| | | PlayerGuaji.OnPlayerLogin(curPlayer)
|
| | | PlayerActFamilyGCZ.OnPlayerLogin(curPlayer)
|
| | | PlayerTalk.OnPlayerLogin(curPlayer)
|
| | |
|
| | |
| | | # 活跃放置奖励
|
| | | elif rewardType == ChConfig.Def_RewardType_ActivityPlace:
|
| | | PlayerActivity.GetActivityPlaceReward(curPlayer)
|
| | | # 挂机奖励
|
| | | elif rewardType == ChConfig.Def_RewardType_Guaji:
|
| | | PlayerGuaji.OnGetGuajiAward(curPlayer, dataEx)
|
| | | # 仙树免费减时
|
| | | elif rewardType == ChConfig.Def_RewardType_TreeFreeTime:
|
| | | PlayerTree.FreeReduceTreeLVTime(curPlayer)
|
| | |
| | | import ChPyNetSendPack
|
| | | import GameWorld
|
| | | import NetPackCommon
|
| | | import PlayerGodWeapon
|
| | | import PlayerHorse
|
| | | import PlayerPet
|
| | | #import PlayerGodWeapon
|
| | | #import PlayerHorse
|
| | | #import PlayerPet
|
| | | import ShareDefine
|
| | | import IpyGameDataPY
|
| | | import PlayerControl
|
| | |
| | | import PlayerBillboard
|
| | | import PlayerTreasure
|
| | | import PlayerSignDay
|
| | | import PlayerGoldGift
|
| | | import PlayerEquipDecompose
|
| | | import PlayerCrossChampionship
|
| | | import PlayerFreeGoods
|
| | | import FunctionNPCCommon
|
| | | #import PlayerGoldGift
|
| | | #import PlayerEquipDecompose
|
| | | #import PlayerCrossChampionship
|
| | | #import PlayerFreeGoods
|
| | | #import FunctionNPCCommon
|
| | | import PlayerActBuyCountGift
|
| | | import PlayerActLoginNew
|
| | | import PlayerActTask
|
| | | import IPY_GameWorld
|
| | | import ItemCommon
|
| | | import ItemControler
|
| | | import PlayerLianTi
|
| | | import PlayerArena
|
| | | import PlayerFaQi
|
| | | import PlayerGuaji
|
| | | #import PlayerLianTi
|
| | | #import PlayerFaQi
|
| | |
|
| | |
|
| | | # 功能开启需执行的函数{功能ID:执行函数, ...} 函数需返回是否激活成功, 功能开启有需要处理功能逻辑的这里增加函数调用配置即可
|
| | | FuncOpenLogicDict = {
|
| | | ShareDefine.GameFuncID_Horse:lambda curObj:PlayerHorse.DoHorseOpen(curObj),
|
| | | ShareDefine.GameFuncID_GodWeapon:lambda curObj:PlayerGodWeapon.DoGodWeaponOpen(curObj),
|
| | | ShareDefine.GameFuncID_Pet:lambda curObj:PlayerPet.DoPetOpen(curObj),
|
| | | ShareDefine.GameFuncID_Official:lambda curObj:PlayerPrestigeSys.DoOfficialOpen(curObj),
|
| | | ShareDefine.GameFuncID_Billboard:lambda curObj:PlayerBillboard.DoBillboardOpen(curObj),
|
| | | ShareDefine.GameFuncID_SignDay:lambda curObj:PlayerSignDay.DoSignDayOpen(curObj),
|
| | | ShareDefine.GameFuncID_Treasure:lambda curObj:PlayerTreasure.DoTreasureOpen(curObj),
|
| | | ShareDefine.GameFuncID_FirstGoldTip:lambda curObj:PlayerGoldGift.DoFirstGoldOpen(curObj),
|
| | | ShareDefine.GameFuncID_EquipDecompose:lambda curObj:PlayerEquipDecompose.DoEquipDecomposeOpen(curObj),
|
| | | ShareDefine.GameFuncID_FreeGoods:lambda curObj:PlayerFreeGoods.DoFreeGoodsOpen(curObj),
|
| | | ShareDefine.GameFuncID_OSSail:lambda curObj:FunctionNPCCommon.OSSaleOpenMail(curObj),
|
| | | ShareDefine.GameFuncID_AddPoint:lambda curObj:PlayerControl.DoAddPointOpen(curObj),
|
| | | ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj),
|
| | | ShareDefine.GameFuncID_FaQi:lambda curObj:PlayerFaQi.DoFaQiOpen(curObj),
|
| | | ShareDefine.GameFuncID_LianTi:lambda curObj:PlayerLianTi.DoLianTiOpen(curObj),
|
| | | ShareDefine.GameFuncID_Championship:lambda curObj:PlayerCrossChampionship.DoChampionshipOpen(curObj),
|
| | | ShareDefine.GameFuncID_Guaji:lambda curObj:PlayerGuaji.DoGuajiOpen(curObj),
|
| | | #ShareDefine.GameFuncID_RunDaily:lambda curObj:FBCommon.DoFuncOpen_RunDaily(curObj),
|
| | | #ShareDefine.GameFuncID_RunFamily:lambda curObj:FBCommon.DoFuncOpen_RunFamily(curObj),
|
| | |
|
| | | #ShareDefine.GameFuncID_Horse:lambda curObj:PlayerHorse.DoHorseOpen(curObj),
|
| | | #ShareDefine.GameFuncID_GodWeapon:lambda curObj:PlayerGodWeapon.DoGodWeaponOpen(curObj),
|
| | | #ShareDefine.GameFuncID_Pet:lambda curObj:PlayerPet.DoPetOpen(curObj),
|
| | | #ShareDefine.GameFuncID_FirstGoldTip:lambda curObj:PlayerGoldGift.DoFirstGoldOpen(curObj),
|
| | | #ShareDefine.GameFuncID_EquipDecompose:lambda curObj:PlayerEquipDecompose.DoEquipDecomposeOpen(curObj),
|
| | | #ShareDefine.GameFuncID_FreeGoods:lambda curObj:PlayerFreeGoods.DoFreeGoodsOpen(curObj),
|
| | | #ShareDefine.GameFuncID_OSSail:lambda curObj:FunctionNPCCommon.OSSaleOpenMail(curObj),
|
| | | #ShareDefine.GameFuncID_AddPoint:lambda curObj:PlayerControl.DoAddPointOpen(curObj),
|
| | | #ShareDefine.GameFuncID_FaQi:lambda curObj:PlayerFaQi.DoFaQiOpen(curObj),
|
| | | #ShareDefine.GameFuncID_LianTi:lambda curObj:PlayerLianTi.DoLianTiOpen(curObj),
|
| | | #ShareDefine.GameFuncID_Championship:lambda curObj:PlayerCrossChampionship.DoChampionshipOpen(curObj),
|
| | | }
|
| | |
|
| | | ## 注意:功能开启需执行的函数 及 功能开启后升级逻辑 只会执行其中一个
|
| | |
| | |
|
| | | limitMissionID = ipyData.GetLimitMissionID()
|
| | | if limitMissionID and not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID):
|
| | | continue
|
| | | |
| | | limitVIPLV = ipyData.GetLimitVIPLV()
|
| | | if limitVIPLV and curPlayer.GetVIPLv() < limitVIPLV:
|
| | | continue
|
| | |
|
| | | # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
|
| | |
| | | import IpyGameDataPY
|
| | | import PlayerArena
|
| | | import PyGameData
|
| | | import PlayerGuaji
|
| | | import PlayerXiangong
|
| | | import PlayerMineArea
|
| | | import PlayerBillboard
|
| | |
| | | PlayerArena.OnDayEx(curPlayer)
|
| | | #福地
|
| | | PlayerMineArea.PlayerOnDay(curPlayer)
|
| | | #挂机
|
| | | PlayerGuaji.PlayerOnDay(curPlayer)
|
| | | #特殊时间点过天的,一般是游戏功能,此时立即同步一次跨服玩家数据
|
| | | CrossPlayerData.SendMergePlayerDataNow(curPlayer)
|
| | |
|
| | |
| | | #副本相关时间处理
|
| | | #PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick)
|
| | |
|
| | | #挂机收益
|
| | | #PlayerGuaji.ProcessGuaji(curPlayer)
|
| | | |
| | | #恶意攻击时间处理
|
| | | #AttackCommon.ProcessMaliciousAttackPlayer(curPlayer, tick)
|
| | | #成就
|
| | |
| | | ) = range(1, 4)
|
| | |
|
| | | # 游戏功能ID定义,需确保唯一,与PyGameFuncControl.txt中FuncId一致
|
| | | GameFuncID_Official = 12 # 官爵,境界
|
| | | GameFuncID_Family = 15 # 战盟,仙盟
|
| | | GameFuncID_Billboard = 72 # 排行榜
|
| | | GameFuncID_SignDay = 81 # 签到
|
| | | GameFuncID_Treasure = 99 # 寻宝
|
| | | GameFuncID_Arena = 195 # 竞技场
|
| | |
|
| | | GameFuncID_Wing = 3 # 翅膀
|
| | | GameFuncID_Pet = 6 # 宠物,灵宠
|
| | | GameFuncID_MagicWeapon = 7 # 法宝
|
| | | GameFuncID_Horse = 8 # 坐骑
|
| | | GameFuncID_Official = 12 # 官爵,境界
|
| | | GameFuncID_Family = 15 # 战盟,仙盟
|
| | | GameFuncID_GodWeapon = 20 # 神器
|
| | | GameFuncID_Talent = 149 # 天赋
|
| | | GameFuncID_RefineExp = 60 # 经验炼制,祈愿
|
| | | GameFuncID_RefineMoney = 61 # 金币炼制,祈愿
|
| | | GameFuncID_WorldLV = 71 # 世界等级
|
| | | GameFuncID_Billboard = 72 # 排行榜
|
| | | GameFuncID_Friend = 73 # 好友
|
| | | GameFuncID_SignDay = 81 # 签到
|
| | | GameFuncID_RefineStove = 87 # 炼丹炉
|
| | | GameFuncID_EquipWash = 91 # 洗练
|
| | | GameFuncID_Treasure = 99 # 寻宝
|
| | | GameFuncID_FirstGoldTip = 128 # 首充优势提示
|
| | | GameFuncID_EquipDecompose = 123 # 装备分解
|
| | | GameFuncID_DailyQuest = 78 # 日常
|
| | |
| | | GameFuncID_CrossRealmPK = 157 # 跨服天梯
|
| | | GameFuncID_PenglaiBoss = 162 # 蓬莱仙境
|
| | | GameFuncID_ZhuXianBoss = 163 # 诛仙BOSS
|
| | | GameFuncID_Arena = 195 # 竞技场
|
| | | GameFuncID_FaQi = 199 # 法器
|
| | | GameFuncID_LianTi = 207 # 炼体
|
| | | GameFuncID_CrossBattlefield = 208 # 跨服古神战场
|