| | |
| | | PacketSubCMD_1=0x0C
|
| | | PacketCallFunc_1=OnDice
|
| | |
|
| | | ;玩家脱机挂
|
| | | [PlayerTJG]
|
| | | ScriptName = Player\PlayerTJG.py
|
| | | Writer = alee
|
| | | Releaser = alee
|
| | | RegType = 0
|
| | | RegisterPackCount = 5
|
| | |
|
| | | PacketCMD_1 = 0xB2
|
| | | PacketSubCMD_1 = 0x01
|
| | | PacketCallFunc_1 = OnTJGState
|
| | |
|
| | | PacketCMD_2 = 0xB2
|
| | | PacketSubCMD_2 = 0x02
|
| | | PacketCallFunc_2 = OnSightZoom
|
| | |
|
| | | PacketCMD_3 = 0xB2
|
| | | PacketSubCMD_3 = 0x03
|
| | | PacketCallFunc_3 = OnTJGNPC
|
| | |
|
| | | PacketCMD_4 = 0xB2
|
| | | PacketSubCMD_4 = 0x04
|
| | | PacketCallFunc_4 = OnTJGSystemSet
|
| | |
|
| | | PacketCMD_5 = 0xB4
|
| | | PacketSubCMD_5 = 0x0A
|
| | | PacketCallFunc_5 = TJGNotifyDead
|
| | |
|
| | |
|
| | | ;仙魔之争
|
| | | [GameLogic_XMZZ]
|
| | | ScriptName = GameWorldLogic\FBProcess\GameLogic_XMZZ.py
|
| | |
| | | import GameObj
|
| | | import NPCCommon
|
| | | import ChNPC
|
| | | import PlayerTJG
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | # @remarks 函数详细说明.
|
| | | def GetCanAttack(curNormalNPC, curTagPlayer, skill, tick):
|
| | | if not AttackCommon.CheckNPCCanAttackTag(curNormalNPC, curTagPlayer, skill):
|
| | | return False
|
| | | |
| | | if PlayerTJG.GetIsTJG(curTagPlayer):
|
| | | # 脱机挂玩家
|
| | | return False
|
| | |
|
| | | return True
|
| | |
| | | Def_Effect_UseItemGiveZhenQi = 205 #使用道具给予真气
|
| | | Def_Effect_ItemGiveFamilyActivity = 208 #使用道具给予仙盟活跃令
|
| | | Def_Effect_ItemGiveFamilyContribution = 209 #使用道具给予仙盟贡献
|
| | | Def_Effect_TJGAddTime = 210 #增加脱机挂时间
|
| | | Def_Effect_ItemAddExp = 213 #给经验道具
|
| | | Def_Effect_ItemAddLV = 214 #直接升级道具
|
| | | Def_Effect_ItemAddExpByLV = 215 #给经验道具 XX级前,所加经验随等级增加而增加,XX级后按XX级算
|
| | |
| | | Def_SkillID_ReviveTired = 20030 # 复活疲劳 SkillID
|
| | | Def_SkillID_SkillReBorn = -1 # 技能复活ID
|
| | | Def_SkillID_LimitSuperBuff = 10000 # 有限无敌BUFF SkillID
|
| | | Def_SkillID_TJGSuperBuff = 20039 # 脱机挂死亡复活保护
|
| | | Def_SkillID_Somersault = 190 # 翻滚快速闪避
|
| | | Def_SkillID_DoubleExp = -1 # 双倍经验系统中的双倍经验ID
|
| | | Def_SkillID_Justice = 11504 # 正义阵营
|
| | |
| | | # 切地图需清除的buff
|
| | | ClearBuffOnMapChangeList = [Def_SkillID_DropOwnerBuff, Def_SkillID_FamilyWar_CWinBuff,
|
| | | Def_SkillID_FamilyWar_JoinBuff, Def_SkillID_FamilyWar_RandBuffAttr]
|
| | | # 脱机挂状态下不刷新buff时间的
|
| | | TJGStateNotRefreshTimeBuff = [Def_SkillID_Red]
|
| | |
|
| | | #技能ID对应的区域类型
|
| | | Def_AreaType_SkillID_Safe = 20011 # 安全区
|
| | |
| | | Def_HurtType_FuhaoHit, # 富豪一击
|
| | | ) = range(21, 25)
|
| | |
|
| | | Def_EquipItemType_TJGAutoEat = xrange(Def_ItemType_retWeapon, Def_ItemType_retGlove + 1)
|
| | | #装备类型
|
| | | Def_EquipItemType = range(Def_ItemType_retWeapon, Def_ItemType_DogzEquipScute + 1)
|
| | |
|
| | |
| | | Def_PlayerKey_MoreHurtValue = "MoreHurtValue" # 额外的伤害值,一般用于不走公式
|
| | | Def_PlayerKey_BloodShiledHurt = "BSHurt" # 伤害值用于血盾抵消
|
| | | Def_PlayerKey_BloodShiledHurtEx = "BSHurtEx" # 伤害值用于血盾抵消
|
| | | Def_PlayerKey_TJGPackFullAfterEat = "TJGFullEat" # 脱机挂吞噬后背包依然满的情况
|
| | | Def_PlayerKey_TJGStartTime = "TJGStartTime" # 脱机挂结算时间起点
|
| | | Def_PlayerKey_EquipTime = "EquipTime" # 时效装备
|
| | | Def_PlayerKey_PowerPartTime = "PowerPartTime" # 蓄力每次消耗时间,因攻速改变
|
| | | Def_PlayerKey_PowerPartCount = "PowerPartCount" # 蓄力技能能量次数
|
| | |
| | | Def_QuDao_DoubleBillCount = "qddbCount" # 渠道返利的仙玉领取次数 日期+次数组合数字
|
| | | Def_PDict_GeTuiSet = "GetuiSet" # 推送提醒的设置
|
| | | Def_PDict_NoGeTuiTime = "NoGetuiTime" # 推送提醒免打扰时间,将字符串组合数字
|
| | | Def_PlayerKey_TJGNPC = "TJGNPC" # 脱机挂机NPC点
|
| | | Def_PDict_OnHour = "OnHour"
|
| | | Def_PDict_OnDay = "OnDay" # 0点过天
|
| | | Def_PDict_OnWeek = "OnWeek" # 0点过周
|
| | |
| | | Def_PDict_MoneyMinus = "MoneyMinus_%s" # 货币对应负值, 参数[货币类型]
|
| | | Def_PDict_Currency = "PlayerCurrency_%s" # 自定义货币类型, 参数[自定义货币类型]
|
| | | Def_PDict_UseMoneyTotal = "UseMoneyTotal_%s" # 累计消耗货币, 参数[货币类型]
|
| | | Def_PDict_TJGSet = "TJGSet" # 脱机挂系统设定
|
| | | Def_PDict_TJGDeadTime = "TJGDeadTime" # 脱机被杀时间
|
| | | Def_PDict_TJGDeadPayTime = "TJGDeadPayTime" # 脱机被杀后可补偿的时间
|
| | | Def_PDict_TJGDeadExp = "TJGDeadExp" # 脱机被杀经验
|
| | |
| | | # 我要太极
|
| | | Def_PDict_Dice_Result = "DiceResult" # 我要太极结果
|
| | | Def_PDict_Dice_FreeChangeCnt = "DiceFreeChangeCnt" # 我要太极免费改投次数
|
| | |
|
| | | # 脱机挂类型通知结果
|
| | | Def_PDictType_TJGNotify_Exp1 = "TJGNExp1" #经验
|
| | | Def_PDictType_TJGNotify_Exp2 = "TJGNExp2" #超过E部分
|
| | | Def_PDictType_TJGNotify_Time = "TJGNTime" #使用时间
|
| | | Def_PDictType_TJGNotify_EatPurple = "TJGNEatP" #吞噬的紫装数量
|
| | | Def_PDictType_TJGNotify_GiveCnt = "TJGNGiveCnt" #吞噬获得的炼丹材料数量
|
| | | Def_PDictType_TJGNotify_Purple = "TJGNPurple" #获得紫装数量
|
| | | Def_PDictType_TJGNotify_Orange = "TJGNOrg" #获得橙装数量
|
| | | Def_PDictType_TJGNotify_LV = "TJGLV" #脱机前的等级
|
| | | Def_PDictType_TJGNotify_ItemID = "TJGItemID_%s" #脱机挂指定物品掉落显示
|
| | |
|
| | | Def_PDictType_TJGOnDayEx = "TJGOnDayEx" #是否脱机挂中过天(5点)真实登录后重置
|
| | |
|
| | | # 挂机收益
|
| | | Def_PDict_GuajiCalcTime = "GuajiCalcTime" # 上次统计收益时间戳
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B2 01 脱机挂状态 # tagCMLoginState
|
| | |
|
| | | class tagCMLoginState(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("State", c_ubyte), # 0正常登录,1脱机登录,2脱机登录死亡
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x01
|
| | | 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 = 0x01
|
| | | self.State = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMLoginState)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B2 01 脱机挂状态 // tagCMLoginState:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | State:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.State
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMLoginState=tagCMLoginState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMLoginState.Cmd,m_NAtagCMLoginState.SubCmd))] = m_NAtagCMLoginState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B2 05 推送提醒设置 #tagCMPushNotificationsSetting
|
| | |
|
| | | class tagCMPushNotificationsSetting(Structure):
|
| | | Head = tagHead()
|
| | | OnoffBit = 0 #(DWORD OnoffBit)// 按位约定开关
|
| | | TimeLen = 0 #(BYTE TimeLen)
|
| | | TimeStr = "" #(String TimeStr)// 时间字符串 01:02-05:00
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x05
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.OnoffBit,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.TimeLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TimeStr,_pos = CommFunc.ReadString(_lpData, _pos,self.TimeLen)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x05
|
| | | self.OnoffBit = 0
|
| | | self.TimeLen = 0
|
| | | self.TimeStr = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 1
|
| | | length += len(self.TimeStr)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.OnoffBit)
|
| | | data = CommFunc.WriteBYTE(data, self.TimeLen)
|
| | | data = CommFunc.WriteString(data, self.TimeLen, self.TimeStr)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | OnoffBit:%d,
|
| | | TimeLen:%d,
|
| | | TimeStr:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.OnoffBit,
|
| | | self.TimeLen,
|
| | | self.TimeStr
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMPushNotificationsSetting=tagCMPushNotificationsSetting()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPushNotificationsSetting.Head.Cmd,m_NAtagCMPushNotificationsSetting.Head.SubCmd))] = m_NAtagCMPushNotificationsSetting
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B2 02 视野缩放 #tagCMSightZoom
|
| | |
|
| | | class tagCMSightZoom(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("Sight", c_ubyte), # 视野缩放,用于脱机挂不超过最大视野,空闲状态为0,被玩家攻击恢复视野
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x02
|
| | | 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 = 0x02
|
| | | self.Sight = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMSightZoom)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B2 02 视野缩放 //tagCMSightZoom:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | Sight:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.Sight
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMSightZoom=tagCMSightZoom()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSightZoom.Cmd,m_NAtagCMSightZoom.SubCmd))] = m_NAtagCMSightZoom
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B2 04 系统设置 #tagCMSystem
|
| | |
|
| | | class tagCMSystem(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("AutoEat", c_ubyte), # 自动吞噬
|
| | | ("AutoReborn", c_ubyte), #自动买活
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x04
|
| | | 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 = 0x04
|
| | | self.AutoEat = 0
|
| | | self.AutoReborn = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMSystem)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B2 04 系统设置 //tagCMSystem:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | AutoEat:%d,
|
| | | AutoReborn:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.AutoEat,
|
| | | self.AutoReborn
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMSystem=tagCMSystem()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSystem.Cmd,m_NAtagCMSystem.SubCmd))] = m_NAtagCMSystem
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B2 03 设置脱机挂NPC # tagCMTJGnpc
|
| | |
|
| | | class tagCMTJGnpc(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("NPCID", c_int), # 脱机挂点
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x03
|
| | | 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 = 0x03
|
| | | self.NPCID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMTJGnpc)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B2 03 设置脱机挂NPC // tagCMTJGnpc:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | NPCID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.NPCID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMTJGnpc=tagCMTJGnpc()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTJGnpc.Cmd,m_NAtagCMTJGnpc.SubCmd))] = m_NAtagCMTJGnpc
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B3 17 情戒解锁 #tagCMLoveRingUnlock
|
| | |
|
| | | class tagCMLoveRingUnlock(Structure):
|
| | |
| | |
|
| | | m_NAtagCMSuperAtk=tagCMSuperAtk()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSuperAtk.Head.Cmd,m_NAtagCMSuperAtk.Head.SubCmd))] = m_NAtagCMSuperAtk
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B4 0A 脱机挂死亡 # tagCMTJGDead
|
| | |
|
| | | class tagCMTJGDead(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB4
|
| | | self.SubCmd = 0x0A
|
| | | 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 = 0xB4
|
| | | self.SubCmd = 0x0A
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMTJGDead)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B4 0A 脱机挂死亡 // tagCMTJGDead:
|
| | | Cmd:%s,
|
| | | SubCmd:%s
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMTJGDead=tagCMTJGDead()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTJGDead.Cmd,m_NAtagCMTJGDead.SubCmd))] = m_NAtagCMTJGDead
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B4 10 脱机挂被杀后离线找回 # tagMCTJGDeadPay
|
| | |
|
| | | class tagMCTJGDeadPay(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("Times", c_int), # 可找回时间
|
| | | ("DeadTime", c_int), # 死亡时间
|
| | | ("Exp", c_int), # 经验
|
| | | ("Exp1", c_int), # 经验 亿
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB4
|
| | | self.SubCmd = 0x10
|
| | | 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 = 0xB4
|
| | | self.SubCmd = 0x10
|
| | | self.Times = 0
|
| | | self.DeadTime = 0
|
| | | self.Exp = 0
|
| | | self.Exp1 = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCTJGDeadPay)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B4 10 脱机挂被杀后离线找回 // tagMCTJGDeadPay:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | Times:%d,
|
| | | DeadTime:%d,
|
| | | Exp:%d,
|
| | | Exp1:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.Times,
|
| | | self.DeadTime,
|
| | | self.Exp,
|
| | | self.Exp1
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCTJGDeadPay=tagMCTJGDeadPay()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTJGDeadPay.Cmd,m_NAtagMCTJGDeadPay.SubCmd))] = m_NAtagMCTJGDeadPay
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B4 09 通知脱机挂结果 #tagMCTJGInfo
|
| | |
|
| | | class tagMCTJGItems(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(tagMCTJGItems)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B4 09 通知脱机挂结果 //tagMCTJGInfo:
|
| | | ItemID:%d,
|
| | | Count:%d
|
| | | '''\
|
| | | %(
|
| | | self.ItemID,
|
| | | self.Count
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCTJGInfo(Structure):
|
| | | Head = tagHead()
|
| | | Exp1 = 0 #(DWORD Exp1)// 经验
|
| | | Exp2 = 0 #(DWORD Exp2)// 超亿经验
|
| | | Times = 0 #(DWORD Times)// 使用时间秒
|
| | | PurpleEquip = 0 #(WORD PurpleEquip)// 产出紫装数量
|
| | | OrangeEquip = 0 #(WORD OrangeEquip)// 产出橙装数量
|
| | | EatPurpleEquip = 0 #(WORD EatPurpleEquip)// 吞噬紫装数量
|
| | | BeforeLV = 0 #(WORD BeforeLV)//脱机前记录的等级
|
| | | GiveCnt = 0 #(WORD GiveCnt)//获得炼丹材料数量
|
| | | Cnt = 0 #(BYTE Cnt)//物品类别数量
|
| | | Items = list() #(vector<tagMCTJGItems> Items)
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x09
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Exp1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.Exp2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.Times,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PurpleEquip,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.OrangeEquip,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.EatPurpleEquip,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.BeforeLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.GiveCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.Cnt):
|
| | | temItems = tagMCTJGItems()
|
| | | _pos = temItems.ReadData(_lpData, _pos)
|
| | | self.Items.append(temItems)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x09
|
| | | self.Exp1 = 0
|
| | | self.Exp2 = 0
|
| | | self.Times = 0
|
| | | self.PurpleEquip = 0
|
| | | self.OrangeEquip = 0
|
| | | self.EatPurpleEquip = 0
|
| | | self.BeforeLV = 0
|
| | | self.GiveCnt = 0
|
| | | self.Cnt = 0
|
| | | self.Items = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | | length += 2
|
| | | length += 2
|
| | | length += 2
|
| | | length += 2
|
| | | length += 2
|
| | | length += 1
|
| | | for i in range(self.Cnt):
|
| | | length += self.Items[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.Exp1)
|
| | | data = CommFunc.WriteDWORD(data, self.Exp2)
|
| | | data = CommFunc.WriteDWORD(data, self.Times)
|
| | | data = CommFunc.WriteWORD(data, self.PurpleEquip)
|
| | | data = CommFunc.WriteWORD(data, self.OrangeEquip)
|
| | | data = CommFunc.WriteWORD(data, self.EatPurpleEquip)
|
| | | data = CommFunc.WriteWORD(data, self.BeforeLV)
|
| | | data = CommFunc.WriteWORD(data, self.GiveCnt)
|
| | | data = CommFunc.WriteBYTE(data, self.Cnt)
|
| | | for i in range(self.Cnt):
|
| | | data = CommFunc.WriteString(data, self.Items[i].GetLength(), self.Items[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Exp1:%d,
|
| | | Exp2:%d,
|
| | | Times:%d,
|
| | | PurpleEquip:%d,
|
| | | OrangeEquip:%d,
|
| | | EatPurpleEquip:%d,
|
| | | BeforeLV:%d,
|
| | | GiveCnt:%d,
|
| | | Cnt:%d,
|
| | | Items:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Exp1,
|
| | | self.Exp2,
|
| | | self.Times,
|
| | | self.PurpleEquip,
|
| | | self.OrangeEquip,
|
| | | self.EatPurpleEquip,
|
| | | self.BeforeLV,
|
| | | self.GiveCnt,
|
| | | self.Cnt,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCTJGInfo=tagMCTJGInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTJGInfo.Head.Cmd,m_NAtagMCTJGInfo.Head.SubCmd))] = m_NAtagMCTJGInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 20 回合制战斗状态 #tagMCTurnFightState
|
| | |
|
| | | class tagMCTurnFightState(Structure):
|
| | |
| | | import GameWorld
|
| | | import ChConfig
|
| | | import CommFunc
|
| | | import PlayerTJG
|
| | |
|
| | | import datetime
|
| | | import random
|
| | |
| | | # 离线数据
|
| | | def WriteEvent_session(curPlayer):
|
| | | seconds = 0
|
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | return
|
| | | else:
|
| | | logoffTimeStr = curPlayer.GetLogoffTime().strip()
|
| | | loginTimeStr = curPlayer.GetLoginTime().strip()
|
| | | if logoffTimeStr and loginTimeStr:
|
| | | passTimes = GameWorld.GetDateTimeByStr(logoffTimeStr) - GameWorld.GetDateTimeByStr(loginTimeStr)
|
| | | seconds = passTimes.seconds
|
| | | logoffTimeStr = curPlayer.GetLogoffTime().strip()
|
| | | loginTimeStr = curPlayer.GetLoginTime().strip()
|
| | | if logoffTimeStr and loginTimeStr:
|
| | | passTimes = GameWorld.GetDateTimeByStr(logoffTimeStr) - GameWorld.GetDateTimeByStr(loginTimeStr)
|
| | | seconds = passTimes.seconds
|
| | | EventReport(ShareDefine.Def_UserAction_Session, "OnlineTime=%s&SessionID=%s"%(seconds, GameWorld.GetSessionID(curPlayer)), curPlayer)
|
| | | #===========================================================================
|
| | | # sessionEvent = session()
|
| | |
| | | import PlayerControl
|
| | | import ReadChConfig
|
| | | import traceback
|
| | | import PlayerTJG
|
| | | import FBLogic
|
| | | import GameObj
|
| | | #---------------------------------------------------------------------
|
| | |
| | | if value == None:
|
| | | GameWorld.DebugAnswer(curPlayer, "参数错误, 必须为纯数字!")
|
| | | return
|
| | | if callFunName == "SetHappyPoint":
|
| | | PlayerTJG.SetTJGTime(curPlayer, value)
|
| | | else:
|
| | | callObj(value)
|
| | | callObj(value)
|
| | | else:
|
| | | GameWorld.DebugAnswer(curPlayer, "不支持该命令!curPlayer.%s" % callFunName)
|
| | | return
|
| | |
| | | return False
|
| | | #if not curPlayer.GetInitOK():
|
| | | # return False
|
| | | #if IsTJGPlayer(curPlayer):
|
| | | # return False
|
| | | if IsMirrorPlayer(curPlayer):
|
| | | return False
|
| | | return True
|
| | |
| | | import SkillCommon
|
| | | import PyGameData
|
| | | import BuffSkill
|
| | | import PlayerTJG
|
| | | import NPCCommon
|
| | | import ChConfig
|
| | | import GameObj
|
| | |
| | | def __DoCheckHorsePetRobBossKillCntBuff(curPlayer, tick):
|
| | | familyID = curPlayer.GetFamilyID()
|
| | | if not familyID:
|
| | | return
|
| | | |
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | return
|
| | |
|
| | | killCount = PyGameData.g_familyKillHorsePetRobBossCntDict.get(familyID, 0)
|
| | |
| | | ChConfig.Def_Effect_Face:"Item_Face",
|
| | | ChConfig.Def_Effect_FacePic:"Item_Face",
|
| | | ChConfig.Def_Effect_ItemAddLV:"Item_AddLV", #升级道具
|
| | | ChConfig.Def_Effect_TJGAddTime:"Item_TJGAddTime", #增加脱机挂时间
|
| | | ChConfig.Def_Effect_GuajiAward:"Item_GuajiAward", #直接给挂机收益
|
| | | ChConfig.Def_Effect_CleanGuilt:"Item_CleanGuilt", # 洗红名
|
| | | ChConfig.Def_Effect_PrizeCoin:"Item_PrizeCoin", # 奖励充值点券
|
| | |
| | | return
|
| | | return ipyDrop
|
| | |
|
| | | def GetNPCDropInfoTJG(dropPlayer, mapID, npcID, killCount):
|
| | | '''脱机挂杀怪掉落专用函数
|
| | | 只算: 1.饼图装备掉落 + 2.指定物品ID掉落 + 3.金币掉落
|
| | | '''
|
| | | ipyDrop = GetNPCDropIpyData(npcID)
|
| | | if not ipyDrop:
|
| | | return
|
| | | |
| | | realmNPCIpyData = None
|
| | | realmMapIDList = IpyGameDataPY.GetFuncEvalCfg("RealmDifficulty", 1)
|
| | | realmDifficulty = PlayerControl.GetRealmDifficulty(dropPlayer)
|
| | | if mapID in realmMapIDList and realmDifficulty:
|
| | | realmLV = PlayerControl.GetDifficultyRealmLV(realmDifficulty)
|
| | | realmNPCIpyData = IpyGameDataPY.GetIpyGameDataNotLog("NPCRealmStrengthen", npcID, realmLV)
|
| | | #if realmNPCIpyData:
|
| | | # maxDropLV = realmNPCIpyData.GetMaxDrapLV()
|
| | | |
| | | #脱机暂不限制最大等级掉落
|
| | | #playerLV = dropPlayer.GetLV()
|
| | | #maxDropLV = ipyDrop.GetMaxDropLV()
|
| | | #if maxDropLV and playerLV > maxDropLV:
|
| | | # GameWorld.DebugLog("超过最大可掉落等级,不掉落物品!npcID=%s,playerLV(%s) > maxDropLV(%s)" % (npcID, playerLV, maxDropLV))
|
| | | # return
|
| | | |
| | | playerID = dropPlayer.GetPlayerID()
|
| | | npcData = GameWorld.GetGameData().FindNPCDataByID(npcID)
|
| | | if not npcData:
|
| | | return
|
| | | |
| | | dropIDList = [] # 掉落的ID列表
|
| | | itemJobList = [dropPlayer.GetJob()] if ipyDrop.GetIsDropJobSelf() else IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) # 掉落装备职业列表
|
| | | |
| | | equipDropRatePlus = PlayerControl.GetDropEquipPer(dropPlayer)
|
| | | equipDropDoCountPlus = PlayerControl.GetDropEquipDoCount(dropPlayer)
|
| | | |
| | | dropRatePlusValue = ipyDrop.GetCanDropRatePlus()
|
| | | if not dropRatePlusValue & pow(2, 0):
|
| | | equipDropRatePlus = 0
|
| | | |
| | | if not dropRatePlusValue & pow(2, 1):
|
| | | equipDropDoCountPlus = 0
|
| | | |
| | | doCountAdd = 0
|
| | | doCountRate = ChConfig.Def_MaxRateValue
|
| | | |
| | | GameWorld.DebugLog("脱机挂杀怪掉落: npcID=%s,killCount=%s,itemJobList=%s,dropRatePlusValue=%s,equipDropRatePlus=%s,equipDropDoCountPlus=%s" |
| | | % (npcID, killCount, itemJobList, dropRatePlusValue, equipDropRatePlus, equipDropDoCountPlus), playerID)
|
| | | |
| | | dropEquipInfoList = [] # [(阶,颜色, 件数), ...]
|
| | | # 1.装备只算饼图概率
|
| | | pieRateDoCnt = ipyDrop.GetPieRateDoCnt()
|
| | | if pieRateDoCnt and ipyDrop.GetPieRateDrop():
|
| | | pieRateDoCnt = __GetNPCDropDoCountChange(pieRateDoCnt, doCountRate + equipDropDoCountPlus, doCountAdd)
|
| | | pieRateDoCnt *= killCount
|
| | | pieRateDropList = ipyDrop.GetPieRateDrop() # [(概率,0),(概率,(阶,颜色)),...]
|
| | | if equipDropRatePlus:
|
| | | dropRateList = GameWorld.GetPlusPieList(pieRateDropList, equipDropRatePlus)
|
| | | GameWorld.DebugLog(" 装备配置饼图: %s,equipDropRatePlus=%s" % (pieRateDropList, equipDropRatePlus), playerID)
|
| | | else:
|
| | | dropRateList = pieRateDropList
|
| | | preRate = 0
|
| | | maxRate = dropRateList[-1][0]
|
| | | GameWorld.DebugLog(" 装备掉落饼图: %s,maxRate=%s" % (dropRateList, maxRate), playerID)
|
| | | for rateInfo in dropRateList:
|
| | | rate, equipInfo = rateInfo
|
| | | curRate = rate - preRate
|
| | | if not curRate:
|
| | | break
|
| | | preRate = rate
|
| | | if not equipInfo:
|
| | | continue
|
| | | classLV, color = equipInfo
|
| | | totalRate = curRate * pieRateDoCnt # 总概率
|
| | | dropCount = totalRate / maxRate # 可掉落件数
|
| | | rateEx = totalRate % maxRate # 剩余概率
|
| | | if GameWorld.CanHappen(rateEx, maxRate):
|
| | | dropCount += 1
|
| | | GameWorld.DebugLog(" 装备掉率: curRate=%s,totalRate=%s,rateEx=%s,dropCount=%s,classLV=%s,color=%s" |
| | | % (curRate, totalRate, rateEx, dropCount, classLV, color), playerID)
|
| | | if not dropCount:
|
| | | continue
|
| | | dropEquipInfoList.append([classLV, color, dropCount])
|
| | | GameWorld.DebugLog(" 装备掉落结果: killCount=%s,[阶,颜色,件数]=%s" % (killCount, dropEquipInfoList), playerID)
|
| | | |
| | | colorSuitRateDict = ipyDrop.GetEquipColorSuitInfo() # 装备颜色对应套装概率 {颜色:套装概率, ...}
|
| | | colorSuitPlaceKeyInfoDict = ipyDrop.GetEquipPartKeyRateInfo() # 装备部位集合信息 {(颜色,是否套装):部位集合key, ...}
|
| | | dropEquipIDDict = {}
|
| | | for classLV, color, dropCount in dropEquipInfoList:
|
| | | if realmNPCIpyData:
|
| | | classLV = realmNPCIpyData.GetEquipClassLV()
|
| | | GameWorld.DebugLog(" 脱机掉落对应难度境界装备: classLV=%s" % classLV, playerID)
|
| | | suitCountDict = {} # {套装:件数, ...}
|
| | | if color in colorSuitRateDict:
|
| | | suitRate = colorSuitRateDict[color]
|
| | | for _ in xrange(dropCount):
|
| | | isSuit = GameWorld.CanHappen(suitRate, maxRate=Def_NPCMaxDropRate)
|
| | | suitCountDict[isSuit] = suitCountDict.get(isSuit, 0) + 1
|
| | | else:
|
| | | suitCountDict[0] = dropCount
|
| | | |
| | | for isSuit, curDropCount in suitCountDict.items():
|
| | | colorSuitKey = (color, isSuit)
|
| | | if colorSuitKey not in colorSuitPlaceKeyInfoDict:
|
| | | GameWorld.ErrLog("未配置颜色是否套装对应部位集合key! npcID=%s,color=%s,isSuit=%s" % (npcID, color, isSuit))
|
| | | continue
|
| | | placeKey = colorSuitPlaceKeyInfoDict[colorSuitKey]
|
| | | placeList = GetEquipPlaceByPlaceKey(placeKey)
|
| | | if not placeList:
|
| | | GameWorld.ErrLog("部位集合key不存在!npcID=%s,placeKey=%s" % (npcID, placeKey))
|
| | | continue
|
| | | randEquipIDList = __GetEquipIDList(npcID, classLV, color, isSuit, placeList, itemJobList)
|
| | | if not randEquipIDList:
|
| | | continue
|
| | | for _ in xrange(curDropCount):
|
| | | randItemID = random.choice(randEquipIDList)
|
| | | dropIDList.append(randItemID)
|
| | | dropEquipIDDict[randItemID] = [color, placeKey]
|
| | | GameWorld.DebugLog(" 掉落装备: npcID=%s,itemID=%s,classLV=%s,color=%s,isSuit=%s,placeKey=%s,itemJobList=%s,randEquipIDList=%s" |
| | | % (npcID, randItemID, classLV, color, isSuit, placeKey, itemJobList, randEquipIDList), playerID)
|
| | | |
| | | # 2. 指定物品ID库
|
| | | itemIDDropRateDict = ipyDrop.GetItemIDDropRate() # {物品ID:概率, ...}
|
| | | itemIDDropMaxCntDict = ipyDrop.GetItemIDMaxDropCount() # {物品ID:最大掉落个数,...}
|
| | | for itemID, dropRate in itemIDDropRateDict.items():
|
| | | |
| | | if not dropRate:
|
| | | continue
|
| | | |
| | | doCnt = itemIDDropMaxCntDict.get(itemID, 1) # 默认1个
|
| | | doCnt = __GetNPCDropDoCountChange(doCnt, doCountRate, doCountAdd)
|
| | | doCnt *= killCount
|
| | | |
| | | totalRate = dropRate * doCnt
|
| | | dropCount = totalRate / Def_NPCMaxDropRate # 可掉落件数
|
| | | rateEx = totalRate % Def_NPCMaxDropRate # 剩余概率
|
| | | if GameWorld.CanHappen(rateEx, Def_NPCMaxDropRate):
|
| | | dropCount += 1
|
| | | dropIDList += [itemID] * dropCount
|
| | | GameWorld.DebugLog(" 指定物品掉落: itemID=%s,dropRate=%s,doCnt=%s,totalRate=%s,dropCount=%s" |
| | | % (itemID, dropRate, doCnt, totalRate, dropCount), playerID)
|
| | | |
| | | # 检查掉落互斥ID组
|
| | | dropIDList = __RemoveMutexDropID(dropIDList, IpyGameDataPY.GetFuncCfg("MutexDrop", 1))
|
| | | |
| | | # 掉落金币
|
| | | dropMoneyDoCnt = ipyDrop.GetDropMoneyDoCnt()
|
| | | dropMoneyRate = ipyDrop.GetDropMoneyRate()
|
| | | moneyTotalRate = dropMoneyRate * dropMoneyDoCnt * killCount
|
| | | dropMoneyCnt = moneyTotalRate / ChConfig.Def_NPCMapDropRate
|
| | | if GameWorld.CanHappen(moneyTotalRate % ChConfig.Def_NPCMapDropRate, ChConfig.Def_NPCMapDropRate):
|
| | | dropMoneyCnt += 1
|
| | | dropMoney = 0
|
| | | if dropMoneyCnt:
|
| | | dropMoney = __GetDropMoneyValue(dropPlayer, ipyDrop, realmNPCIpyData) * dropMoneyCnt
|
| | | GameWorld.DebugLog(" 金币掉率: dropMoneyRate=%s,moneyTotalRate=%s,dropMoneyCnt=%s,dropMoney=%s" |
| | | % (dropMoneyRate, moneyTotalRate, dropMoneyCnt, dropMoney), playerID)
|
| | | dropIDCountDict = {}
|
| | | for dropID in dropIDList:
|
| | | dropIDCountDict[dropID] = dropIDCountDict.get(dropID, 0) + 1
|
| | | |
| | | # 集字掉落
|
| | | dropWordsCountDict = PlayerActCollectWords.OnGetDropWordsItemDict(dropPlayer, npcData, killCount)
|
| | | for dropID, dropCount in dropWordsCountDict.items():
|
| | | dropIDCountDict[dropID] = dropIDCountDict.get(dropID, 0) + dropCount
|
| | | |
| | | # 垃圾分类
|
| | | giveGarbageItemList = PlayerActGarbageSorting.AddActGarbageTaskProgress(dropPlayer, ChConfig.Def_GarbageTask_KillNPC, killCount, isTJG=True)
|
| | | for dropID, dropCount, _ in giveGarbageItemList:
|
| | | dropIDCountDict[dropID] = dropIDCountDict.get(dropID, 0) + dropCount
|
| | | |
| | | auctionIDList = []
|
| | | if ipyDrop.GetAucionItemCanSell():
|
| | | for dropID in dropIDCountDict.keys():
|
| | | if IpyGameDataPY.GetIpyGameDataNotLog("AuctionItem", dropID):
|
| | | auctionIDList.append(dropID)
|
| | | |
| | | if dropIDCountDict:
|
| | | GameWorld.DebugLog(" 最终掉落: npcID=%s,killCount=%s,dropIDCountDict=%s,auctionIDList=%s,dropMoney=%s" |
| | | % (npcID, killCount, dropIDCountDict, auctionIDList, dropMoney), playerID)
|
| | | return dropIDCountDict, auctionIDList, dropMoney
|
| | |
|
| | | def GetNPCDropInfo(dropPlayer, mapID, npcID, ownerPlayerList=[], ipyDrop=None, isSingle=True, isKillCountDrop=True, curGrade=0):
|
| | | '''获取NPC掉落信息, 击杀及扫荡通用,调用该函数获得掉落信息,然后再看掉落地板上还是直接放入背包
|
| | | @param dropPlayer: 用于判断调用相关用的玩家示例,该玩家并不一定是击杀者,只是按一定规则设定的掉落判断依据的玩家
|
| | |
| | | import PassiveBuffEffMng
|
| | | import PlayerDiceEx
|
| | | import QuestCommon
|
| | | import PlayerTJG
|
| | | import GameLogic_XMZZ
|
| | | import PlayerFlashSale
|
| | | import PlayerFlashGiftbag
|
| | |
| | | PlayerEquipDecompose.PlayerLogin(curPlayer)
|
| | | #防沉迷
|
| | | PlayerGameWallow.DoLogic_CheckWallow(curPlayer, tick)
|
| | | # 通知脱机挂信息
|
| | | #PlayerTJG.NotifyTJGInfo(curPlayer)
|
| | | # 协助
|
| | | PlayerAssist.OnPlayerLogin(curPlayer)
|
| | | # 极品白拿
|
| | |
| | |
|
| | | curPlayer.SetState(0) # 脱机挂恢复为正常上线
|
| | | curPlayer.SetCountryLastWeekHornor(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
|
| | | #tjgTime = PlayerTJG.GetTJGTime(curPlayer)
|
| | | #if tjgTime:
|
| | | # PlayerControl.SendGameServerRefreshState(curPlayer, IPY_GameWorld.CDBPlayerRefresh_HappyPoint, tjgTime)
|
| | | |
| | | |
| | | PlayerControl.DoGMForbidenTalkOnLogin(curPlayer)
|
| | | DataRecordPack.DR_PlayerLogin(curPlayer) # 放最后,记录等级、经验等信息
|
| | | return
|
| | |
| | | #---等级限制---
|
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | | #PlayerTJG.TJGDeadOffline(curPlayer)
|
| | |
|
| | | #===============================================================================
|
| | | # #---等级限制---
|
| | |
| | |
|
| | | #下线召回宠物
|
| | | PetControl.ReCallFightPet(curPlayer)
|
| | | |
| | | #PlayerTJG.CalcPlayerTJG(curPlayer, tick)
|
| | |
|
| | | #离线session
|
| | | EventReport.WriteEvent_session(curPlayer)
|
| | |
| | |
|
| | | # 发送主服玩家数据给跨服
|
| | | def SendMergeData_Buff(curPlayer, buffID, plusValueList):
|
| | | if buffID in [ChConfig.Def_SkillID_LimitSuperBuff,
|
| | | ChConfig.Def_SkillID_TJGSuperBuff]:
|
| | | if buffID in [ChConfig.Def_SkillID_LimitSuperBuff]:
|
| | | # 不需要处理的buff
|
| | | return
|
| | | if curPlayer.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | |
| | | import PlayerArena
|
| | | import PlayerFaQi
|
| | | import PlayerGuaji
|
| | | import PlayerTJG
|
| | | import EventShell
|
| | |
|
| | |
|
| | |
| | | ShareDefine.GameFuncID_OSSail:lambda curObj:FunctionNPCCommon.OSSaleOpenMail(curObj),
|
| | | ShareDefine.GameFuncID_AddPoint:lambda curObj:PlayerControl.DoAddPointOpen(curObj),
|
| | | ShareDefine.GameFuncID_Talent:lambda curObj:PlayerGreatMaster.DoTalentOpen(curObj),
|
| | | #ShareDefine.GameFuncID_TJG:lambda curObj:PlayerTJG.DoTJGOpen(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),
|
| | |
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import PlayerTJG
|
| | | import ShareDefine
|
| | | import IpyGameDataPY
|
| | | import ChPyNetSendPack
|
| | |
| | | continue
|
| | | playerID = hurtObj.GetValueID()
|
| | | hurtPlayer = copyPlayerManager.FindPlayerByID(playerID)
|
| | | if not hurtPlayer or PlayerTJG.GetIsTJG(hurtPlayer):
|
| | | if not hurtPlayer:
|
| | | continue
|
| | | if curNPC and not hurtPlayer.CanSeeOther(curNPC):
|
| | | GameWorld.Log(" 伤血玩家不在boss视野内,无法获得奖励!playerPos(%s,%s), npcPos(%s,%s)"
|
| | |
| | | import PyGameData
|
| | | import GameFuncComm
|
| | | import EventShell
|
| | | import PlayerTJG
|
| | | import PlayerPet
|
| | | import PlayerVip
|
| | | import datetime
|
| | |
| | | import GameLogic_SealDemon
|
| | | import GameLogic_ZhuXianBoss
|
| | | import GameLogic_CrossDemonKing
|
| | | import PlayerTJG
|
| | | import PlayerVip
|
| | | import PlayerRefineStove
|
| | | import PlayerFamilyTech
|
| | |
| | | GameWorld.Log("玩家已经死亡, 无法进入副本!")
|
| | | return ShareDefine.EntFBAskRet_Dead
|
| | |
|
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | if isNotify:
|
| | | NotifyCode(curPlayer, "SingleEnterDefaul", [mapID])
|
| | | return ShareDefine.EntFBAskRet_TJG
|
| | | |
| | | ## 队伍检查的情况,队长不处理,只处理队员
|
| | | if isTeamAsk and curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader:
|
| | | # 后端只做boss状态下,被动进入副本限制,防止打boss中被拉进去副本
|
| | |
| | | 特殊boss分流:
|
| | | @param bossID: 分流bossID
|
| | | '''
|
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | GameWorld.DebugLog("脱机的玩家不处理分流!", curPlayer.GetPlayerID())
|
| | | return tagLineID
|
| | | if GameWorld.IsCrossServer():
|
| | | return tagLineID
|
| | | # 非常规地图之间的切换不处理
|
| | |
| | | ## 刷新红名对应PKValue
|
| | | curPKValue = curPlayer.GetPKValue()
|
| | | if not curPKValue:
|
| | | return
|
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | return
|
| | | redBuff = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_Red)[0]
|
| | | if not redBuff:
|
| | |
| | | #通知死亡
|
| | | DoPlayerDead(curPlayer)
|
| | |
|
| | | #PlayerTJG.PlayerTJGReborn(curPlayer, tick)
|
| | | GameObj.ClearPyPlayerState(curPlayer)
|
| | |
|
| | | MirrorAttack.OnPlayerDead(curPlayer)
|
| | |
| | | fightExpRate += PlayerGoldInvest.GetAddFightExpRate(curPlayer)
|
| | |
|
| | | actExpRateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ExpRate, {})# 多倍经验活动加成
|
| | | if not PlayerTJG.GetIsTJG(curPlayer) and actExpRateInfo.get(ShareDefine.ActKey_State):
|
| | | if actExpRateInfo.get(ShareDefine.ActKey_State):
|
| | | actExpIpyData = IpyGameDataPY.GetIpyGameData("ActExpRate", actExpRateInfo.get(ShareDefine.ActKey_CfgID))
|
| | | if actExpIpyData and curPlayer.GetLV() >= actExpIpyData.GetLVLimit():
|
| | | fightExpRate += actExpIpyData.GetAddExpRate()
|
| | |
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import IPY_GameWorld
|
| | | import ReadChConfig
|
| | | import PlayerControl
|
| | | import PlayerTJG
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | #------------------------------------------------------------------------------
|
| | |
| | | offMin = PlayerControl.GetPlayerLeaveServerMinute(curPlayer)
|
| | | noteOffMin = offMin + curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_Wallow_OfflineTime)
|
| | |
|
| | | #脱机挂时间,脱机挂时间清除必须在这之后
|
| | | tjgtime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_Time, 0, ChConfig.Def_PDictType_TJGNotify)/60
|
| | | noteOffMin += tjgtime
|
| | | |
| | | if noteOffMin < Def_Wallow_Offline_HealthTime:
|
| | | #未达到健康离线,记录时间,退出
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_Wallow_OfflineTime, noteOffMin)
|
| | |
| | | # @param tick 时间戳
|
| | | # @return none
|
| | | def DoLogic_WallowOnlineTime(curPlayer, tick):
|
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | return
|
| | |
|
| | | if not GetIsWallowRole(curPlayer):
|
| | | return
|
| | |
| | | import ShareDefine
|
| | | import DataRecordPack
|
| | | import ChPyNetSendPack
|
| | | import PlayerFamilyRedPacket
|
| | | import NetPackCommon
|
| | | import IpyGameDataPY
|
| | | import PlayerTJG
|
| | | import CommFunc
|
| | | import ChEquip
|
| | |
|
| | |
| | |
|
| | | def UpdateFirstGoldTime(curPlayer):
|
| | | #更新首充提示剩余时间
|
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | return
|
| | | remainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldRemainTime)
|
| | | if not remainTime:
|
| | | return
|
| | |
| | | import NetPackCommon
|
| | | import PlayerControl
|
| | | import IpyGameDataPY
|
| | | import PlayerTJG
|
| | |
|
| | | import time
|
| | |
|
| | |
| | | # @param notify 是否通知客户端
|
| | | # @return None
|
| | | def CalcOnlineTime(curPlayer):
|
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | return 0
|
| | | onlineTime = GetOnlineTime(curPlayer)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayOnlineTime, onlineTime)
|
| | | SetStartCalcOnlineTick(curPlayer, 0)
|
| | |
| | |
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayOnlineTime, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlinePrizeNote, 0) # 重置每日在线奖励
|
| | | |
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | return
|
| | | |
| | | SetStartCalcOnlineTick(curPlayer)
|
| | |
|
| | | SendOnlinePrizeInfo(curPlayer)
|
| | |
| | | import IpyGameDataPY
|
| | | import FBCommon
|
| | | import GameFuncComm
|
| | | import PlayerTJG
|
| | | import PlayerActivity
|
| | | import PlayerSuccess
|
| | | import PyGameData
|
| | |
| | | else:
|
| | | for itemID, itemCnt in totalItemDict.items():
|
| | | ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
|
| | | #if Def_TJGRecoverID in recoverCntDict:
|
| | | # #脱机挂经验找回后重置
|
| | | # PlayerTJG.ResetTJGDeadInfo(curPlayer)
|
| | | if Def_QueenRelics in recoverCntDict:
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_QueenRelicsEx, recoverCntDict[Def_QueenRelics])
|
| | | DataRecordPack.DR_PlayerRecover(curPlayer, recoverWay, recoverCntDict, totalExp, totalMoney, totalSP, totalItemDict)
|
| | |
| | | import PetControl
|
| | | import ItemControler
|
| | | import PlayerGuaji
|
| | | import PlayerTJG
|
| | | import AICommon
|
| | | import PlayerSuccess
|
| | | import CrossPlayerData
|
| | |
| | | import PlayerFlashSale
|
| | | import PlayerChatBox
|
| | | import PlayerFace
|
| | | import PlayerWing
|
| | | import ChEquip
|
| | | import PlayerYinji
|
| | | import PlayerActivity
|
| | | import PlayerBackup
|
| | |
| | | #副本相关时间处理
|
| | | PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick)
|
| | |
|
| | | #脱机计算
|
| | | #PlayerTJG.ProcessPlayerTJG(curPlayer, tick)
|
| | | #挂机收益
|
| | | PlayerGuaji.ProcessGuaji(curPlayer)
|
| | |
|
| | |
| | | lastUpdTick = curPlayer.GetDictByKey(Key_UpdViewCacheTick)
|
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | if lastUpdTick and tick - lastUpdTick < 60000:
|
| | | GameWorld.DebugLog("1分钟内只更新一次玩家缓存", playerID)
|
| | | #GameWorld.DebugLog("1分钟内只更新一次玩家缓存", playerID)
|
| | | return
|
| | | curPlayer.SetDict(Key_UpdViewCacheTick, tick)
|
| | | return UpdPlayerViewCache(curPlayer)
|
| | |
| | |
|
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | curPlayer.SetDict(Key_UpdViewCacheTick, tick)
|
| | | GameWorld.DebugLog("更新玩家查看缓存数据! isOffline=%s" % isOffline, playerID)
|
| | | #GameWorld.DebugLog("更新玩家查看缓存数据! isOffline=%s" % isOffline, playerID)
|
| | | curCache.SetAccID(curPlayer.GetAccID())
|
| | | curCache.SetPlayerName(curPlayer.GetPlayerName())
|
| | | curCache.SetLV(curPlayer.GetLV())
|
| | |
| | | def UpdPlayerViewCacheByDB(playerID):
|
| | | '''更新玩家查看缓存数据,直接从db数据更新,仅更新dbPlayer表有的属性,
|
| | | '''
|
| | | GameWorld.DebugLog("UpdPlayerViewCacheByDB", playerID)
|
| | | curCache = None
|
| | | dbPlayer = PyMongoMain.GetUserCtrlDB().findDBPlayer(playerID)
|
| | | if not dbPlayer:
|
| | | GameWorld.DebugLog("1111111111111111", playerID)
|
| | | GameWorld.ErrLog("UpdPlayerViewCacheByDB找不到玩家!", playerID)
|
| | | return curCache
|
| | | viewCacheMgr = DBDataMgr.GetPlayerViewCacheMgr()
|
| | | curCache = viewCacheMgr.GetPlayerViewCache(playerID)
|
| | |
| | | if resultSet and resultSet.count():
|
| | | for resultDict in resultSet:
|
| | | PyGameData.g_dbPlayerIDMap[resultDict["PlayerID"]] = resultDict["AccID"]
|
| | | GameWorld.Log("启动服务器加载DBPlayer玩家账号ID对应关系! %s, %s" % (len(PyGameData.g_dbPlayerIDMap), PyGameData.g_dbPlayerIDMap))
|
| | | GameWorld.Log("启动服务器加载DBPlayer玩家账号ID对应关系! %s" % (len(PyGameData.g_dbPlayerIDMap)))
|
| | | return
|
| | |
|
| | | def findDBPlayer(self, playerID):
|
| | |
| | |
|
| | | mylog.debug('insert role ok!accid = %s, PlayerName = %s'%(createPlayer.AccID, createPlayer.PlayerName))
|
| | | PyGameData.g_dbPlayerIDMap[newPlayerID] = createPlayer.AccID
|
| | | mylog.debug('PyGameData.g_dbPlayerIDMap = %s, %s'%(len(PyGameData.g_dbPlayerIDMap), PyGameData.g_dbPlayerIDMap))
|
| | | mylog.debug('PyGameData.g_dbPlayerIDMap = %s'%(len(PyGameData.g_dbPlayerIDMap)))
|
| | |
|
| | | #构造其他角色初始数据
|
| | | itemData = ''
|
| | |
| | | import SkillShell
|
| | | import PassiveBuffEffMng
|
| | | import ChNetSendPack
|
| | | import PlayerTJG
|
| | | import OperControlManager
|
| | | import GameObj
|
| | | import CrossPlayerData
|
| | |
| | | beforeHP = GameObj.GetHP(curObj)
|
| | |
|
| | | index = 0
|
| | | isPlayerTJG = (curObj.GetGameObjType() == IPY_GameWorld.gotPlayer and PlayerTJG.GetIsTJG(curObj))
|
| | |
|
| | | skillIDListInDelBuff = [] # buff消失中需要处理添加buff,外层处理避免错乱
|
| | |
|
| | |
| | | #填表,持续时间为0的Buff为永久Buff
|
| | | if not curSkill.GetLastTime() and not curBuffRemainTime:
|
| | | index += 1
|
| | | continue
|
| | | |
| | | if isPlayerTJG and curSkill.GetSkillTypeID() in ChConfig.TJGStateNotRefreshTimeBuff:
|
| | | curBuff.SetCalcStartTick( tick ) |
| | | index += 1
|
| | | #GameWorld.DebugLog("脱机挂状态下不刷新buff时间: skillTypeID=%s" % curSkill.GetSkillTypeID())
|
| | | continue
|
| | |
|
| | | remainTime = curBuffRemainTime - ( tick - curBuff.GetCalcStartTick() )
|