10019 【砍树】回合战斗(与NPC基础回合战斗)
| | |
| | | eval RewardInfo; //奖励信息
|
| | | };
|
| | |
|
| | | //副本回合制表
|
| | |
|
| | | struct tagFBTurn
|
| | | {
|
| | | DWORD _DataMapID; //数据地图ID
|
| | | WORD _LineID; //功能线路ID
|
| | | DWORD NPCID; //NPCID
|
| | | };
|
| | |
|
| | | //副本助战表
|
| | |
|
| | | struct tagFBHelpBattle
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 10 回合制战斗 #tagCMTurnFight
|
| | |
|
| | | class tagCMTurnFight(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("MapID", c_int), # 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | ("FuncLineID", c_ushort), |
| | | ("PlayerID", c_int), # 对应玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | ]
|
| | |
|
| | | 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.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMTurnFight)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B4 10 回合制战斗 //tagCMTurnFight:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMTurnFight=tagCMTurnFight()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTurnFight.Cmd,m_NAtagCMTurnFight.SubCmd))] = m_NAtagCMTurnFight
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B5 14 拍卖行竞价物品 #tagCMBiddingAuctionItem
|
| | |
|
| | | class tagCMBiddingAuctionItem(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 20 回合制战斗状态 #tagMCTurnFightState
|
| | |
|
| | | class tagMCTurnFightState(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("MapID", c_int), # 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | ("FuncLineID", c_ushort), |
| | | ("PlayerID", c_int), # 对应玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | ("State", c_ubyte), # 0-开始;1-进行中;2-结束
|
| | | ("TurnNum", c_ubyte), # 当前轮次
|
| | | ("TurnMax", c_ubyte), # 最大轮次
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB4
|
| | | 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 = 0xB4
|
| | | self.SubCmd = 0x20
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | self.State = 0
|
| | | self.TurnNum = 0
|
| | | self.TurnMax = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCTurnFightState)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B4 20 回合制战斗状态 //tagMCTurnFightState:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d,
|
| | | State:%d,
|
| | | TurnNum:%d,
|
| | | TurnMax:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID,
|
| | | self.State,
|
| | | self.TurnNum,
|
| | | self.TurnMax
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCTurnFightState=tagMCTurnFightState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Cmd,m_NAtagMCTurnFightState.SubCmd))] = m_NAtagMCTurnFightState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 09 跨服排位玩家信息 #tagMCChampionshipPlayerInfo
|
| | |
|
| | | class tagMCChampionshipPlayerInfo(Structure):
|
| | |
| | |
|
| | | PacketCMD_1=0xA5
|
| | | PacketSubCMD_1=0x26
|
| | | PacketCallFunc_1=OnVisitFairyDomain |
| | | PacketCallFunc_1=OnVisitFairyDomain
|
| | |
|
| | | ;缥缈仙域
|
| | | [TurnAttack]
|
| | | ScriptName = Attack\TurnAttack.py
|
| | | Writer = hxp
|
| | | Releaser = hxp
|
| | | RegType = 0
|
| | | RegisterPackCount = 1
|
| | |
|
| | | PacketCMD_1=0xB4
|
| | | PacketSubCMD_1=0x10
|
| | | PacketCallFunc_1=OnTurnFight
|
New file |
| | |
| | | #!/usr/bin/python |
| | | # -*- coding: GBK -*- |
| | | #------------------------------------------------------------------------------- |
| | | # |
| | | ##@package TurnAttack |
| | | # |
| | | # @todo:回合制攻击逻辑 |
| | | # @author hxp |
| | | # @date 2023-11-30 |
| | | # @version 1.0 |
| | | # |
| | | # 详细描述: 回合制攻击逻辑 |
| | | # |
| | | #------------------------------------------------------------------------------- |
| | | #"""Version = 2023-11-30 15:30""" |
| | | #------------------------------------------------------------------------------- |
| | | |
| | | import ChConfig |
| | | import AICommon |
| | | import BaseAttack |
| | | import PlayerState |
| | | import IpyGameDataPY |
| | | import IPY_GameWorld |
| | | import ChPyNetSendPack |
| | | import NetPackCommon |
| | | import PlayerControl |
| | | import SkillCommon |
| | | import NPCCommon |
| | | import GameWorld |
| | | import GameObj |
| | | |
| | | ( |
| | | FightState_Start, |
| | | FightState_Fighting, |
| | | FightState_Win, |
| | | FightState_Fail, |
| | | FightState_Over, |
| | | ) = range(5) |
| | | |
| | | #// B4 10 回合制战斗 #tagCMTurnFight |
| | | # |
| | | #struct tagCMTurnFight |
| | | #{ |
| | | # tagHead Head; |
| | | # DWORD MapID; // 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等) |
| | | # WORD FuncLineID; |
| | | # DWORD PlayerID; // 对应玩家ID,可为0,某些功能可能有用,如竞技场 |
| | | #}; |
| | | def OnTurnFight(index, clientData, tick): |
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) |
| | | mapID = clientData.MapID |
| | | funcLineID = clientData.FuncLineID |
| | | tagPlayerID = clientData.PlayerID |
| | | |
| | | if curPlayer.GetSightLevel() != curPlayer.GetID(): |
| | | PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start) |
| | | |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick): |
| | | playerID = curPlayer.GetPlayerID() |
| | | tagObj = None |
| | | if tagPlayerID: |
| | | pass |
| | | |
| | | else: |
| | | ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID) |
| | | if not ipyData: |
| | | return |
| | | npcID = ipyData.GetNPCID() |
| | | if not npcID: |
| | | return |
| | | tagObj = NPCCommon.SummonMapNpc(npcID, curPlayer.GetPosX(), curPlayer.GetPosY(), sightLevel=playerID) |
| | | |
| | | if not tagObj: |
| | | return |
| | | |
| | | turnMax = IpyGameDataPY.GetFuncCfg("TurnFight", 1) |
| | | curPet = curPlayer.GetPetMgr().GetFightPet() |
| | | tagPet = None |
| | | |
| | | GameWorld.DebugLog("执行回合制战斗: mapID=%s,funcLineID=%s,tagPlayerID=%s,tagObjID=%s" |
| | | % (mapID, funcLineID, tagPlayerID, tagObj.GetID()), playerID) |
| | | GameWorld.DebugLog("curPlayer.GetSightLevel=%s,tagObj.GetSightLevel=%s" |
| | | % (curPlayer.GetSightLevel(), tagObj.GetSightLevel()), playerID) |
| | | |
| | | #一个回合攻击顺序 |
| | | #1. 快方宠物攻击,不存在跳过 |
| | | #2. 慢方宠物攻击,不存在跳过 |
| | | #3. 快方主体攻击 |
| | | #4. 慢方主体攻击 |
| | | |
| | | # 战斗前初始化 |
| | | factionObjMax = 0 # 某个阵营的最大战斗实例数 |
| | | factionObjDict = {1:[curPet, curPlayer], 2:[tagPet, tagObj]} |
| | | for objList in factionObjDict.values(): |
| | | if factionObjMax < len(objList): |
| | | factionObjMax = len(objList) |
| | | for gameObj in objList: |
| | | TurnFightObjStartInit(gameObj) |
| | | |
| | | curSpeed = 0 |
| | | tagSpeed = 0 |
| | | orderList = [1, 2] if curSpeed >= tagSpeed else [2, 1] |
| | | GameWorld.DebugLog("playerHP=%s,tagHP=%s,curSpeed=%s,tagSpeed=%s" |
| | | % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj), curSpeed, tagSpeed), playerID) |
| | | |
| | | isWin = None |
| | | for turnNum in range(1, turnMax + 1): |
| | | GameWorld.DebugLog("回合制战斗轮次: %s" % turnNum, playerID) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Fighting, turnNum, turnMax) |
| | | for index in range(factionObjMax): |
| | | for faction in orderList: |
| | | objList = factionObjDict[faction] |
| | | if index >= len(objList): |
| | | continue |
| | | gameObj = objList[index] |
| | | if not gameObj: |
| | | continue |
| | | gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, turnNum) |
| | | tagGameObj = tagObj if faction == 1 else curPlayer |
| | | objType = gameObj.GetGameObjType() |
| | | objID = gameObj.GetID() |
| | | tagObjType = tagGameObj.GetGameObjType() |
| | | tagObjID = tagGameObj.GetID() |
| | | |
| | | GameWorld.DebugLog(" 行动: turnNum=%s,index=%s,faction=%s,objType=%s,objID=%s,tagObjType=%s,tagObjID=%s" |
| | | % (turnNum, index, faction, objType, objID, tagObjType, tagObjID), playerID) |
| | | if objType == IPY_GameWorld.gotPlayer: |
| | | PlayerAttack(gameObj, tagGameObj, tick) |
| | | else: |
| | | NPCAttack(gameObj, tagGameObj, tick) |
| | | |
| | | if tagGameObj and GameObj.GetHP(tagGameObj) > 0: |
| | | GameWorld.DebugLog(" playerHP=%s,tagHP=%s" % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj)), playerID) |
| | | continue |
| | | |
| | | isWin = faction == 1 |
| | | GameWorld.DebugLog(" tagObjType=%s,tagObjID=%s,被击杀,结束战斗: isWin=%s" % (tagObjType, tagObjID, isWin), playerID) |
| | | break |
| | | |
| | | if isWin != None: |
| | | break |
| | | |
| | | if isWin != None: |
| | | break |
| | | |
| | | overState = FightState_Win if isWin else FightState_Fail |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax) |
| | | |
| | | for objList in factionObjDict.values(): |
| | | for gameObj in objList: |
| | | TurnFightObjOverReset(gameObj) |
| | | |
| | | GameWorld.DebugLog("回合制战斗结束: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s" |
| | | % (mapID, funcLineID, tagPlayerID, isWin, overState), playerID) |
| | | return |
| | | |
| | | def TurnFightObjStartInit(gameObj): |
| | | ## 回合制战斗实例初始化 |
| | | if not gameObj: |
| | | return |
| | | |
| | | gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 1) |
| | | GameObj.SetHPFull(gameObj) |
| | | gameObj.RefreshView() |
| | | |
| | | objType = gameObj.GetGameObjType() |
| | | # 重置技能CD、战斗buff |
| | | if objType == IPY_GameWorld.gotPlayer: |
| | | skillManager = gameObj.GetSkillManager() |
| | | for i in range(skillManager.GetSkillCount()): |
| | | skill = skillManager.GetSkillByIndex(i) |
| | | skill.SetRemainTime(0) |
| | | |
| | | elif objType == IPY_GameWorld.gotNPC: |
| | | pass |
| | | return |
| | | |
| | | def TurnFightObjOverReset(gameObj): |
| | | ## 回合制战斗实例结束重置 |
| | | if not gameObj: |
| | | return |
| | | gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 0) |
| | | |
| | | objType = gameObj.GetGameObjType() |
| | | if objType == IPY_GameWorld.gotPlayer: |
| | | pass |
| | | |
| | | elif objType == IPY_GameWorld.gotNPC: |
| | | npcObjType = gameObj.GetGameNPCObjType() |
| | | if npcObjType != IPY_GameWorld.gnotPet and GameObj.GetHP(gameObj): |
| | | NPCCommon.SetDeadEx(gameObj) |
| | | |
| | | return |
| | | |
| | | def NPCAttack(curObj, tagObj, tick): |
| | | ## NPC攻击 |
| | | if not curObj: |
| | | return |
| | | tagDist = 0 |
| | | #---优先释放技能--- |
| | | if not AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick): |
| | | #普通攻击 |
| | | isOK = BaseAttack.Attack(curObj, tagObj, None, tick) |
| | | GameWorld.DebugLog(" NPC普通攻击: curID=%s,tagID=%s,isOK=%s" % (curObj.GetID(), tagObj.GetID(), isOK)) |
| | | return |
| | | |
| | | def PlayerAttack(curPlayer, tagObj, tick): |
| | | ## 玩家攻击, 参考技能使用 #def UseSkillEx(index, clientData, tick): |
| | | playerID = curPlayer.GetPlayerID() |
| | | job = curPlayer.GetJob() |
| | | jobAutoUseSkillDict = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {}) |
| | | if job not in jobAutoUseSkillDict: |
| | | return |
| | | skillList = jobAutoUseSkillDict[job] |
| | | |
| | | posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY() |
| | | tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID() |
| | | |
| | | curPlayer.ClearUseSkillRec() |
| | | curPlayer.SetAttackTargetPos(posX, posY) |
| | | curPlayer.SetUseSkillPosX(tagPosX) |
| | | curPlayer.SetUseSkillPosY(tagPosY) |
| | | curPlayer.SetUseSkillTagType(tagObjType) |
| | | curPlayer.SetUseSkillTagID(tagObjID) |
| | | |
| | | #PlayerControl.SetIsNeedProcess(curPlayer, True) |
| | | #PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack) |
| | | |
| | | skillMgr = curPlayer.GetSkillManager() |
| | | for skillID in skillList: |
| | | curSkill = skillMgr.FindSkillBySkillID(skillID) |
| | | if not curSkill: |
| | | continue |
| | | |
| | | #CheckSkillCondition |
| | | #被动技能无法使用 |
| | | if SkillCommon.isPassiveSkill(curSkill): |
| | | continue |
| | | #还在冷却时间内无法释放 |
| | | if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0: |
| | | continue |
| | | |
| | | curPlayer.SetUseSkill(curSkill.GetSkillData()) |
| | | useSkillData = curPlayer.GetUseSkill() |
| | | if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick): |
| | | GameWorld.DebugLog(" 技能攻击失败%s" % skillID, playerID) |
| | | continue |
| | | GameWorld.DebugLog(" 技能攻击成功%s" % skillID, playerID) |
| | | |
| | | break |
| | | |
| | | curPlayer.ClearUseSkillRec() |
| | | return |
| | | |
| | | def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0): |
| | | clientPack = ChPyNetSendPack.tagMCTurnFightState() |
| | | clientPack.Clear() |
| | | clientPack.MapID = mapID |
| | | clientPack.FuncLineID = funcLineID |
| | | clientPack.PlayerID = tagPlayerID |
| | | clientPack.State = state |
| | | clientPack.TurnNum = turnNum |
| | | clientPack.TurnMax = turnMax |
| | | NetPackCommon.SendFakePack(curPlayer, clientPack) |
| | | return |
| | | |
| | | |
| | | |
| | |
| | | Def_ShopType_LongSale, #远程贩售
|
| | | ) = range(1, 2+1)
|
| | |
|
| | | #---Obj字典-------
|
| | | Def_Obj_Dict_TurnFightNum = 'TurnFightNum' # 回合制战斗当前轮次
|
| | |
|
| | | #---NPC字典-------
|
| | | #每道龙卷风最终坐标
|
| | | Def_NPC_Dict_CycloneTagPosX = 'CycloneTagPosX'
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 10 回合制战斗 #tagCMTurnFight
|
| | |
|
| | | class tagCMTurnFight(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("MapID", c_int), # 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | ("FuncLineID", c_ushort), |
| | | ("PlayerID", c_int), # 对应玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | ]
|
| | |
|
| | | 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.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMTurnFight)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B4 10 回合制战斗 //tagCMTurnFight:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMTurnFight=tagCMTurnFight()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTurnFight.Cmd,m_NAtagCMTurnFight.SubCmd))] = m_NAtagCMTurnFight
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B5 14 拍卖行竞价物品 #tagCMBiddingAuctionItem
|
| | |
|
| | | class tagCMBiddingAuctionItem(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 20 回合制战斗状态 #tagMCTurnFightState
|
| | |
|
| | | class tagMCTurnFightState(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("MapID", c_int), # 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | ("FuncLineID", c_ushort), |
| | | ("PlayerID", c_int), # 对应玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | ("State", c_ubyte), # 0-开始;1-进行中;2-结束
|
| | | ("TurnNum", c_ubyte), # 当前轮次
|
| | | ("TurnMax", c_ubyte), # 最大轮次
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB4
|
| | | 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 = 0xB4
|
| | | self.SubCmd = 0x20
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | self.State = 0
|
| | | self.TurnNum = 0
|
| | | self.TurnMax = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCTurnFightState)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B4 20 回合制战斗状态 //tagMCTurnFightState:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d,
|
| | | State:%d,
|
| | | TurnNum:%d,
|
| | | TurnMax:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID,
|
| | | self.State,
|
| | | self.TurnNum,
|
| | | self.TurnMax
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCTurnFightState=tagMCTurnFightState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Cmd,m_NAtagMCTurnFightState.SubCmd))] = m_NAtagMCTurnFightState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 09 跨服排位玩家信息 #tagMCChampionshipPlayerInfo
|
| | |
|
| | | class tagMCChampionshipPlayerInfo(Structure):
|
| | |
| | | ("eval", "RewardInfo", 0),
|
| | | ),
|
| | |
|
| | | "FBTurn":(
|
| | | ("DWORD", "DataMapID", 1),
|
| | | ("WORD", "LineID", 1),
|
| | | ("DWORD", "NPCID", 0),
|
| | | ),
|
| | |
|
| | | "FBHelpBattle":(
|
| | | ("DWORD", "DataMapID", 1),
|
| | | ("BYTE", "LineID", 1),
|
| | |
| | | def GetRefreshNPC(self): return self.RefreshNPC # 标试点刷怪配置
|
| | | def GetGradeInfo(self): return self.GradeInfo # 评级规则
|
| | | def GetRewardInfo(self): return self.RewardInfo # 奖励信息 |
| | | |
| | | # 副本回合制表 |
| | | class IPY_FBTurn(): |
| | | |
| | | def __init__(self): |
| | | self.DataMapID = 0
|
| | | self.LineID = 0
|
| | | self.NPCID = 0 |
| | | return |
| | | |
| | | def GetDataMapID(self): return self.DataMapID # 数据地图ID
|
| | | def GetLineID(self): return self.LineID # 功能线路ID
|
| | | def GetNPCID(self): return self.NPCID # NPCID |
| | | |
| | | # 副本助战表 |
| | | class IPY_FBHelpBattle(): |
| | |
| | | self.ipyFBFuncLen = len(self.ipyFBFuncCache)
|
| | | self.ipyFBLineCache = self.__LoadFileData("FBLine", IPY_FBLine)
|
| | | self.ipyFBLineLen = len(self.ipyFBLineCache)
|
| | | self.ipyFBTurnCache = self.__LoadFileData("FBTurn", IPY_FBTurn)
|
| | | self.ipyFBTurnLen = len(self.ipyFBTurnCache)
|
| | | self.ipyFBHelpBattleCache = self.__LoadFileData("FBHelpBattle", IPY_FBHelpBattle)
|
| | | self.ipyFBHelpBattleLen = len(self.ipyFBHelpBattleCache)
|
| | | self.ipyNPCCustomRefreshCache = self.__LoadFileData("NPCCustomRefresh", IPY_NPCCustomRefresh)
|
| | |
| | | def GetFBFuncByIndex(self, index): return self.ipyFBFuncCache[index]
|
| | | def GetFBLineCount(self): return self.ipyFBLineLen
|
| | | def GetFBLineByIndex(self, index): return self.ipyFBLineCache[index]
|
| | | def GetFBTurnCount(self): return self.ipyFBTurnLen
|
| | | def GetFBTurnByIndex(self, index): return self.ipyFBTurnCache[index]
|
| | | def GetFBHelpBattleCount(self): return self.ipyFBHelpBattleLen
|
| | | def GetFBHelpBattleByIndex(self, index): return self.ipyFBHelpBattleCache[index]
|
| | | def GetNPCCustomRefreshCount(self): return self.ipyNPCCustomRefreshLen
|
| | |
| | | def DoAutoUseSkill(curNPC, curTag, tagDist, tick):
|
| | | #攻击僵持中
|
| | | if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():
|
| | | if not PetControl.IsPet(curNPC):
|
| | | if not (PetControl.IsPet(curNPC) or curNPC.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightNum)):
|
| | | #GameWorld.Log('攻击僵持中')
|
| | | return False
|
| | |
|