10130 【后端】福地争夺资源功能(增加摇人功能、支持自己驱赶;优化刷福地物品相关GM命令;)
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 10 回合制战斗 #tagCMTurnFight
|
| | |
|
| | | class tagCMTurnFight(Structure):
|
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | ValueCount = 0 #(BYTE ValueCount)
|
| | | ValueList = list() #(vector<DWORD> ValueList)// 附加值列表,可选,具体含义由MapID决定
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x10
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.ValueCount):
|
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | | self.ValueList.append(value)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x10
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.ValueCount = 0
|
| | | self.ValueList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 4 * self.ValueCount
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.ValueCount)
|
| | | for i in range(self.ValueCount):
|
| | | data = CommFunc.WriteDWORD(data, self.ValueList[i])
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | ValueCount:%d,
|
| | | ValueList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.ValueCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMTurnFight=tagCMTurnFight()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTurnFight.Head.Cmd,m_NAtagCMTurnFight.Head.SubCmd))] = m_NAtagCMTurnFight
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B5 14 拍卖行竞价物品 #tagCMBiddingAuctionItem
|
| | |
|
| | | class tagCMBiddingAuctionItem(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 20 回合制战斗状态 #tagMCTurnFightState
|
| | |
|
| | | class tagMCTurnFightState(Structure):
|
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | State = 0 #(BYTE State)// 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
|
| | | TurnNum = 0 #(BYTE TurnNum)// 当前轮次
|
| | | TurnMax = 0 #(BYTE TurnMax)// 最大轮次
|
| | | Len = 0 #(WORD Len)
|
| | | Msg = "" #(String Msg)//size = Len
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x20
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Msg,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x20
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.State = 0
|
| | | self.TurnNum = 0
|
| | | self.TurnMax = 0
|
| | | self.Len = 0
|
| | | self.Msg = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 2
|
| | | length += len(self.Msg)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.State)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnNum)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnMax)
|
| | | data = CommFunc.WriteWORD(data, self.Len)
|
| | | data = CommFunc.WriteString(data, self.Len, self.Msg)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | State:%d,
|
| | | TurnNum:%d,
|
| | | TurnMax:%d,
|
| | | Len:%d,
|
| | | Msg:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.State,
|
| | | self.TurnNum,
|
| | | self.TurnMax,
|
| | | self.Len,
|
| | | self.Msg
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCTurnFightState=tagMCTurnFightState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Head.Cmd,m_NAtagMCTurnFightState.Head.SubCmd))] = m_NAtagMCTurnFightState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 09 跨服排位玩家信息 #tagMCChampionshipPlayerInfo
|
| | |
|
| | | class tagMCChampionshipPlayerInfo(Structure):
|
| | |
| | | def OnExec(curPlayer, msgList):
|
| | | if not msgList:
|
| | | GameWorld.DebugAnswer(curPlayer, "以下是GameServer命令")
|
| | | GameWorld.DebugAnswer(curPlayer, "随机重新刷新: MineArea item [是否超级 坐标 索引]")
|
| | | GameWorld.DebugAnswer(curPlayer, "刷新指定等级: MineArea lv 等级 [坐标 索引]")
|
| | | GameWorld.DebugAnswer(curPlayer, "刷新指定物品: MineArea id 矿物ID [坐标 索引]")
|
| | | GameWorld.DebugAnswer(curPlayer, "随机重新刷新: MineArea item [是否超级 坐标 索引 福地玩家ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "刷新指定等级: MineArea lv 等级 [坐标 索引 福地玩家ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "刷新指定物品: MineArea id 矿物ID [坐标 索引 福地玩家ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "派工人拉物品: MineArea pull 索引 人数 状态")
|
| | | GameWorld.DebugAnswer(curPlayer, "[工人玩家ID 福地玩家ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "输出在拉物品: MineArea pulling [玩家ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "输出福地物品: MineArea area [福地玩家ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "清除福地物品: MineArea clear [福地玩家ID,isPop]")
|
| | | GameWorld.DebugAnswer(curPlayer, "输出功能数据: MineArea info")
|
| | | GameWorld.DebugAnswer(curPlayer, "坐标: 0~100; []内为可选参数")
|
| | | GameWorld.DebugAnswer(curPlayer, "玩家ID可以是假人ID: 1~%s" % GameWorldMineArea.Def_FakeAreaCount)
|
| | | GameWorld.DebugAnswer(curPlayer, "[]内为可选参数; ")
|
| | | GameWorld.DebugAnswer(curPlayer, "坐标: 0~100;-1时随机坐标 ")
|
| | | GameWorld.DebugAnswer(curPlayer, "索引: 0~5; -1时为全部索引")
|
| | | GameWorld.DebugAnswer(curPlayer, "玩家ID可以是假人ID: 1~%s, 没填则默认自己" % GameWorldMineArea.Def_FakeAreaCount)
|
| | | return
|
| | |
|
| | | playerID = curPlayer.GetPlayerID()
|
| | |
| | | if value1 == "item":
|
| | | isSuper = msgList[1] if len(msgList) > 1 else 0
|
| | | position = msgList[2] if len(msgList) > 2 else None
|
| | | refreshIndexList = [msgList[3]] if len(msgList) > 3 else None
|
| | | refreshDict = GameWorldMineArea.__DoMineItemRefresh(playerID, curPlayer, isSuper=isSuper, refreshIndexList=refreshIndexList, setPosition=position)
|
| | | if position == -1:
|
| | | position = None
|
| | | refreshIndex = msgList[3] if len(msgList) > 3 else -1
|
| | | refreshIndexList = [refreshIndex] if refreshIndex >=0 else None
|
| | | areaPlayerID = msgList[4] if len(msgList) > 4 else playerID
|
| | | areaPlayer = curPlayer if areaPlayerID == playerID else GameWorld.GetPlayerManager().FindPlayerByID(areaPlayerID)
|
| | | refreshDict = GameWorldMineArea.__DoMineItemRefresh(areaPlayerID, areaPlayer, isSuper=isSuper, refreshIndexList=refreshIndexList, setPosition=position)
|
| | | __PrintRefreshDict(curPlayer, refreshDict, "超级" if isSuper else "普通")
|
| | |
|
| | | # 刷新指定等级
|
| | | elif value1 == "lv":
|
| | | itemLV = msgList[1] if len(msgList) > 1 else 1
|
| | | position = msgList[2] if len(msgList) > 2 else None
|
| | | refreshIndexList = [msgList[3]] if len(msgList) > 3 else None
|
| | | refreshDict = GameWorldMineArea.__DoMineItemRefresh(playerID, curPlayer, refreshIndexList=refreshIndexList, setPosition=position, setItemLV=itemLV)
|
| | | if position == -1:
|
| | | position = None
|
| | | refreshIndex = msgList[3] if len(msgList) > 3 else -1
|
| | | refreshIndexList = [refreshIndex] if refreshIndex >=0 else None
|
| | | areaPlayerID = msgList[4] if len(msgList) > 4 else playerID
|
| | | areaPlayer = curPlayer if areaPlayerID == playerID else GameWorld.GetPlayerManager().FindPlayerByID(areaPlayerID)
|
| | | refreshDict = GameWorldMineArea.__DoMineItemRefresh(areaPlayerID, areaPlayer, refreshIndexList=refreshIndexList, setPosition=position, setItemLV=itemLV)
|
| | | __PrintRefreshDict(curPlayer, refreshDict, "指定等级:%s" % itemLV)
|
| | |
|
| | | # 刷新指定物品
|
| | | elif value1 == "id":
|
| | | mineID = msgList[1] if len(msgList) > 1 else 1
|
| | | position = msgList[2] if len(msgList) > 2 else None
|
| | | refreshIndexList = [msgList[3]] if len(msgList) > 3 else None
|
| | | refreshDict = GameWorldMineArea.__DoMineItemRefresh(playerID, curPlayer, refreshIndexList=refreshIndexList, setPosition=position, setMineID=mineID)
|
| | | if position == -1:
|
| | | position = None
|
| | | refreshIndex = msgList[3] if len(msgList) > 3 else -1
|
| | | refreshIndexList = [refreshIndex] if refreshIndex >=0 else None
|
| | | areaPlayerID = msgList[4] if len(msgList) > 4 else playerID
|
| | | areaPlayer = curPlayer if areaPlayerID == playerID else GameWorld.GetPlayerManager().FindPlayerByID(areaPlayerID)
|
| | | refreshDict = GameWorldMineArea.__DoMineItemRefresh(areaPlayerID, areaPlayer, refreshIndexList=refreshIndexList, setPosition=position, setMineID=mineID)
|
| | | __PrintRefreshDict(curPlayer, refreshDict, "指定ID:%s" % mineID)
|
| | |
|
| | | # 派工人拉物品
|
| | |
| | | GameWorld.DebugLog(" MoveSpeed=%s,remainSeconds=%s(%s),EndTime=%s"
|
| | | % (MoveSpeed, remainSeconds, remainHms, endTimeStr), areaPlayerID)
|
| | |
|
| | | GameWorld.DebugAnswer(curPlayer, "%s,ID(%s-%s),拉(%s-%s-%s),抢(%s-%s-%s),%s" |
| | | % (index, MineID, MineType, WorkerCount, WorkerState, areaPlayerID, RobWorkerCount, RobWorkerState, RobPlayerID, remainHms))
|
| | | Position = int(float(Position)) if Position else 0
|
| | | GameWorld.DebugAnswer(curPlayer, "%s,ID(%s-%s-%s),拉(%s-%s),抢(%s-%s-%s),%s" |
| | | % (index, MineID, Position, MineType, WorkerCount, WorkerState, RobWorkerCount, RobWorkerState, RobPlayerID, remainHms))
|
| | | return
|
| | |
|
| | | def __ClearAreaData(curPlayer, areaPlayerID, isPop):
|
| | |
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
|
| | |
|
| | | # 摇人帮助请求
|
| | | if funcLineID == 0:
|
| | | # 摇人帮助请求、自己驱赶请求
|
| | | if funcLineID == 0 or funcLineID == 1:
|
| | | return __OnMineHelpRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList)
|
| | |
|
| | | return
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList):
|
| | |
|
| | | # 摇人帮助结果
|
| | | if funcLineID == 0:
|
| | | # 摇人帮助结果、自己驱赶结果
|
| | | if funcLineID == 0 or funcLineID == 1:
|
| | | return __OnMineHelpOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList)
|
| | |
|
| | | return
|
| | |
|
| | | def __OnMineHelpRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
|
| | | # 摇人帮助请求
|
| | | # 摇人帮助请求、自己驱赶请求
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if not valueList or len(valueList) < 2:
|
| | | GameWorld.DebugLog("没有指定valueList!", playerID)
|
| | |
| | | areaPlayerID = valueList[0]
|
| | | itemIndex = valueList[1]
|
| | |
|
| | | if playerID == areaPlayerID:
|
| | | GameWorld.DebugLog("不能帮助自己!", playerID)
|
| | | return
|
| | | |
| | | if funcLineID == 0:
|
| | | if playerID == areaPlayerID:
|
| | | GameWorld.DebugLog("不能帮助自己! areaPlayerID=%s" % areaPlayerID, playerID)
|
| | | return
|
| | | elif funcLineID == 1:
|
| | | if playerID != areaPlayerID:
|
| | | GameWorld.DebugLog("不是自己的福地,无法自己驱赶! areaPlayerID=%s" % areaPlayerID, playerID)
|
| | | return
|
| | | |
| | | mineItemMgr = PyDataManager.GetDBPyMineAreaItemManager()
|
| | | mineItemData = mineItemMgr.GetMineItem(areaPlayerID, itemIndex)
|
| | | mineID = mineItemData.MineID
|
| | |
| | | return True
|
| | |
|
| | | def __OnMineHelpOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList):
|
| | | # 摇人帮助结果
|
| | | # 摇人帮助结果、自己驱赶结果
|
| | |
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | helpPlayerName = curPlayer.GetName()
|
| | |
| | | if robPlayerID and robPlayerID == tagPlayerID:
|
| | | __DoCancelPull(tagPlayerID, areaPlayerID, itemIndex)
|
| | |
|
| | | robCacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(tagPlayerID))
|
| | | robPlayerName = robCacheDict.get("Name", "")
|
| | | # 帮助的发奖
|
| | | if funcLineID == 0:
|
| | | robCacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(tagPlayerID))
|
| | | robPlayerName = robCacheDict.get("Name", "")
|
| | | |
| | | areaCacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(areaPlayerID))
|
| | | areaPlayerName = areaCacheDict.get("Name", "")
|
| | | |
| | | # 邮件发放奖励
|
| | | PlayerCompensation.SendMailByKey("MineHelpAward", [playerID], awardItemList, [areaPlayerName, robPlayerName])
|
| | | |
| | | # 通知福地玩家
|
| | | PlayerCompensation.SendMailByKey("MineHelpReqOK", [areaPlayerID], [], [helpPlayerName, robPlayerName])
|
| | | |
| | | # 自己驱赶的
|
| | | elif funcLineID == 1:
|
| | | # 自己驱赶的,不用再通知地图,直接return
|
| | | return
|
| | |
|
| | | areaCacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(areaPlayerID))
|
| | | areaPlayerName = areaCacheDict.get("Name", "")
|
| | | |
| | | # 邮件发放奖励
|
| | | PlayerCompensation.SendMailByKey("MineHelpAward", [playerID], awardItemList, [areaPlayerName, robPlayerName])
|
| | | |
| | | # 通知福地玩家
|
| | | PlayerCompensation.SendMailByKey("MineHelpReqOK", [areaPlayerID], [], [helpPlayerName, robPlayerName]) |
| | | return True
|
| | |
|
| | | def MapServer_MineArea(curPlayer, msgList):
|
| | |
| | | import GameWorld
|
| | | import GameWorldMineArea
|
| | | import ChConfig
|
| | | import PlayerViewCache
|
| | |
|
| | | def MapServer_TurnFight(curPlayer, msgList):
|
| | | mapID = curPlayer.GetRealMapID()
|
| | |
| | | elif msgType == "TurnFightOver":
|
| | | ret = __OnTurnFightOver(curPlayer, dataMsg)
|
| | |
|
| | | elif msgType == "TurnFightTagPlayerInfo":
|
| | | ret = __OnGetTagPlayerInfo(curPlayer, dataMsg)
|
| | | |
| | | if ret == None:
|
| | | return
|
| | | return msgList + (ret if isinstance(ret, list) else [ret])
|
| | |
| | | ## 回合战斗请求
|
| | | # @return: None-不允许战斗;非None-允许战斗,具体返回内容功能自己决定
|
| | |
|
| | | mapID, funcLineID, tagPlayerID, valueList = dataMsg
|
| | | mapID, funcLineID, tagType, tagID, valueList = dataMsg
|
| | | if mapID == ChConfig.Def_TFMapID_MineArea:
|
| | | return GameWorldMineArea.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList)
|
| | | return GameWorldMineArea.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagID, valueList)
|
| | |
|
| | | return
|
| | |
|
| | | def __OnTurnFightOver(curPlayer, dataMsg):
|
| | | ## 回合战斗结束
|
| | |
|
| | | mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg
|
| | | mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg
|
| | |
|
| | | if mapID == ChConfig.Def_TFMapID_MineArea:
|
| | | return GameWorldMineArea.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList)
|
| | | return GameWorldMineArea.OnTurnFightOver(curPlayer, mapID, funcLineID, tagID, valueList, fightRet, awardItemList)
|
| | |
|
| | | return
|
| | |
|
| | |
|
| | | def __OnGetTagPlayerInfo(curPlayer, dataMsg):
|
| | | _, _, tagPlayerID, _ = dataMsg
|
| | | if tagPlayerID < 10000:
|
| | | return
|
| | | cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(tagPlayerID))
|
| | | tagPlayerInfo = {
|
| | | "Name":cacheDict.get("Name", ""),
|
| | | "Job":cacheDict.get("Job", 0),
|
| | | "LV":cacheDict.get("LV", 0),
|
| | | "RealmLV":cacheDict.get("RealmLV", 0),
|
| | | "MaxHP":cacheDict.get("MaxHP", 0),
|
| | | "FightPower":cacheDict.get("FightPower", 0),
|
| | | }
|
| | | return tagPlayerInfo
|
| | |
| | | PacketSubCMD_1=0x26
|
| | | 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
|
| | |
|
| | | ;福地
|
| | | [PlayerMineArea]
|
| | | ScriptName = Player\PlayerMineArea.py
|
New file |
| | |
| | | #!/usr/bin/python |
| | | # -*- coding: GBK -*- |
| | | #------------------------------------------------------------------------------- |
| | | # |
| | | ##@package TurnAttack |
| | | # |
| | | # @todo:回合制攻击逻辑 |
| | | # @author hxp |
| | | # @date 2023-11-30 |
| | | # @version 1.0 |
| | | # |
| | | # 详细描述: 回合制攻击逻辑,均使用NPC实例作为战斗主体 |
| | | # |
| | | #------------------------------------------------------------------------------- |
| | | #"""Version = 2023-11-30 15:30""" |
| | | #------------------------------------------------------------------------------- |
| | | |
| | | import ChConfig |
| | | import ChPyNetSendPack |
| | | import NetPackCommon |
| | | import PlayerControl |
| | | import GameWorld |
| | | import GameObj |
| | | import FBCommon |
| | | import FBLogic |
| | | |
| | | # 回合战斗流程状态 |
| | | ( |
| | | FightState_Start, # 0 起始状态,无特殊意义,仅代表开始了,与Over对应 |
| | | FightState_PrepareOK, # 1 准备完毕,包含对战NPC召唤OK、其他等 |
| | | FightState_Fighting, # 2 战斗中 |
| | | FightState_FightEnd, # 3 战斗结束 |
| | | FightState_Award, # 4 结算奖励 |
| | | FightState_Over, # 5 结束状态,无特殊意义,仅代表所有处理结束了,与Start对应 |
| | | ) = range(6) |
| | | |
| | | #// B4 10 回合制战斗 #tagCMTurnFight |
| | | # |
| | | #struct tagCMTurnFight |
| | | #{ |
| | | # tagHead Head; |
| | | # DWORD MapID; // 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等) |
| | | # WORD FuncLineID; |
| | | # BYTE TagType; // 战斗目标类型,0-NPC,1-玩家,2-队伍 |
| | | # DWORD TagID; // 战斗目标类型对应的ID |
| | | # BYTE ValueCount; |
| | | # DWORD ValueList[ValueCount]; // 附加值列表,可选,具体含义由MapID决定 |
| | | #}; |
| | | def OnTurnFight(index, clientData, tick): |
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) |
| | | mapID = clientData.MapID |
| | | funcLineID = clientData.FuncLineID |
| | | tagType = clientData.TagType |
| | | tagID = clientData.TagID |
| | | valueList = clientData.ValueList |
| | | |
| | | playerID = curPlayer.GetPlayerID() |
| | | if tagType == ChConfig.TurnBattle_TagType_Player: |
| | | if tagID == playerID: |
| | | GameWorld.DebugLog("不能打自己!", playerID) |
| | | return |
| | | |
| | | reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList) |
| | | if not reqRet: |
| | | return |
| | | |
| | | # 需要发送到GameServer验证 |
| | | if mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagType, tagID, valueList]) |
| | | return |
| | | |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | return |
| | | |
| | | def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""): |
| | | playerID = curPlayer.GetPlayerID() |
| | | msgList = str([msgType, dataMsg]) |
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "TurnFight", msgList, len(msgList)) |
| | | GameWorld.Log("回合战斗发送GameServer: %s, %s" % (msgType, dataMsg), playerID) |
| | | return |
| | | |
| | | def GameServer_TurnFight_DoResult(curPlayer, msgData, tick): |
| | | |
| | | msgType, dataMsg, ret = msgData |
| | | |
| | | if not ret: |
| | | return |
| | | |
| | | if msgType == "TurnFightRequest": |
| | | mapID, funcLineID, tagType, tagID, valueList = dataMsg |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | |
| | | elif msgType == "TurnFightOver": |
| | | mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg |
| | | FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret) |
| | | |
| | | elif msgType == "TurnFightTagPlayerInfo": |
| | | mapID, funcLineID, tagType, tagID, valueList = dataMsg |
| | | DoTrunFightVSPlayer(curPlayer, tagID, [mapID, funcLineID, valueList], ret) |
| | | |
| | | return |
| | | |
| | | def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): |
| | | ## 执行回合制战斗的完整流程 |
| | | |
| | | #if curPlayer.GetSightLevel() != curPlayer.GetID(): |
| | | # PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Start) |
| | | |
| | | tagPlayerInfo = {} |
| | | if tagType == ChConfig.TurnBattle_TagType_Player and tagID >= 10000 : |
| | | tagPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(tagID) |
| | | if tagPlayer: |
| | | tagPlayerInfo = __GetPlayerInfo(tagPlayer) |
| | | else: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightTagPlayerInfo", [mapID, funcLineID, tagType, tagID, valueList]) |
| | | return |
| | | |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagPlayerInfo) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) |
| | | return |
| | | |
| | | def __GetPlayerInfo(curPlayer): |
| | | infoDict = { |
| | | "Name":curPlayer.GetPlayerName(), |
| | | "Job":curPlayer.GetJob(), |
| | | "LV":curPlayer.GetLV(), |
| | | "RealmLV":curPlayer.GetOfficialRank(), |
| | | "MaxHP":GameObj.GetMaxHP(curPlayer), |
| | | "FightPower":PlayerControl.GetFightPower(curPlayer), |
| | | } |
| | | return infoDict |
| | | |
| | | def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, tagPlayerInfo): |
| | | tagType = ChConfig.TurnBattle_TagType_Player |
| | | tagID = tagPlayerID |
| | | mapID, funcLineID, valueList = callData |
| | | if tagPlayerInfo and curPlayer.GetPlayerID() != tagPlayerID: |
| | | tick = GameWorld.GetGameWorld().GetTick() |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagPlayerInfo) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagInfo=None): |
| | | if not tagID: |
| | | return |
| | | if not tagInfo: |
| | | tagInfo = {} |
| | | playerID = curPlayer.GetPlayerID() |
| | | GameWorld.DebugLog("回合战斗: mapID=%s,funcLineID=%s,tagType=%s,tagID=%s,valueList=%s,tagInfo=%s" |
| | | % (mapID, funcLineID, tagType, tagID, valueList, tagInfo), playerID) |
| | | |
| | | factionSyncInfoA = __GetPlayerInfo(curPlayer) |
| | | factionSyncInfoB = tagInfo |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) |
| | | |
| | | turnNum, turnMax = 1, 15 |
| | | |
| | | curFightPower = PlayerControl.GetFightPower(curPlayer) |
| | | tagFightPower = tagInfo.get("FightPower", 0) |
| | | isWin = 1 if curFightPower >= tagFightPower else 0 |
| | | GameWorld.DebugLog(" 战斗结果: isWin=%s,curFightPower=%s,tagFightPower=%s" % (isWin, curFightPower, tagFightPower), playerID) |
| | | |
| | | factionTotalHurtDict = {} |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_FightEnd, turnNum, turnMax) |
| | | |
| | | playbackID = 0 # 战斗回放ID,可根据该ID查看回放 |
| | | |
| | | # 战斗结束后处理 |
| | | fightRet = [isWin, turnNum, turnMax, factionTotalHurtDict, playbackID] |
| | | |
| | | needSendGameServer, awardItemList, overInfoEx = False, [], {} |
| | | overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) |
| | | if overRet != None: |
| | | needSendGameServer, awardItemList, overInfoEx = overRet |
| | | |
| | | if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) |
| | | |
| | | overMsg = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "totalHurt":0} |
| | | playbackID and overMsg.update({"playbackID":playbackID}) |
| | | overInfoEx and overMsg.update(overInfoEx) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) |
| | | return |
| | | |
| | | def SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, state, turnNum=0, turnMax=0, msg=""): |
| | | if not curPlayer: |
| | | return |
| | | clientPack = ChPyNetSendPack.tagMCTurnFightState() |
| | | clientPack.Clear() |
| | | clientPack.MapID = mapID |
| | | clientPack.FuncLineID = funcLineID |
| | | clientPack.TagType = tagType |
| | | clientPack.TagID = tagID |
| | | clientPack.State = state |
| | | clientPack.TurnNum = turnNum |
| | | clientPack.TurnMax = turnMax |
| | | clientPack.Msg = str(msg) |
| | | clientPack.Len = len(clientPack.Msg) |
| | | NetPackCommon.SendFakePack(curPlayer, clientPack) |
| | | return |
| | |
| | | #情缘副本
|
| | | Def_FBMapID_Love = 31300
|
| | |
|
| | | #回合战斗自定义地图ID
|
| | | TurnFightMapIDList = (
|
| | | Def_TFMapID_MineArea, # 福地 1
|
| | | ) = range(1, 1 + 1)
|
| | |
|
| | | #回合战斗自定义地图需要发送GameServer的列表
|
| | | Def_TFMapID_SendToGameServer = [Def_TFMapID_MineArea]
|
| | |
|
| | | #前端自定义场景地图
|
| | | ClientCustomScene = [Def_FBMapID_PersonalBoss, Def_FBMapID_ArenaBattle]
|
| | |
|
| | |
| | | 'Love':[Def_FBMapID_Love],#情缘副本
|
| | | 'CrossBattlefield':[Def_FBMapID_CrossBattlefield], #跨服战场
|
| | | 'CrossFamilyFlagwar':[Def_FBMapID_CrossFamilyFlagwar], #跨服仙盟夺旗战/逐鹿万界
|
| | | 'MineArea':[Def_TFMapID_MineArea], #福地
|
| | | }
|
| | |
|
| | | #特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
|
| | |
| | | Def_ShopType_NpcShop, #NPC商店
|
| | | Def_ShopType_LongSale, #远程贩售
|
| | | ) = range(1, 2+1)
|
| | |
|
| | | # 回合攻击战斗类型
|
| | | (
|
| | | TurnBattleType_Normal, # 普通
|
| | | TurnBattleType_Combo, # 连击
|
| | | TurnBattleType_AtkBack, # 反击
|
| | | ) = range(3)
|
| | |
|
| | | Def_PerTurnTick = 1000 # 每回合等同于常规tick时长
|
| | |
|
| | | # 回合战斗目标类型
|
| | | TurnBattle_TagType_NPC = 0
|
| | | TurnBattle_TagType_Player = 1
|
| | | TurnBattle_TagType_Team = 2
|
| | |
|
| | | #---NPC字典-------
|
| | | #每道龙卷风最终坐标
|
| | |
| | |
|
| | | #福地
|
| | | Def_PDict_MineWorkerCount = "MineWorkerCount" # 已雇佣工人数
|
| | | Def_PDict_MineWorkerEnergyUsed = "MineWorkerEnergyUsed" # 今日已已消耗体力
|
| | | Def_PDict_MineWorkerEnergyUsed = "MineWorkerEnergyUsed" # 今日已消耗体力
|
| | | Def_PDict_MineHelpAwardCount = "MineHelpAwardCount" # 今日已帮助别人奖励次数
|
| | | Def_PDict_MineRefreshCount = "MineRefreshCount_%s" # 今日已刷新次数,参数(刷新类型)
|
| | | Def_PDict_MineTreasureState = "MineTreasureState" # 聚宝盆激活状态,按类型位运算记录是否已激活
|
| | | Def_PDict_MineTreasureAward = "MineTreasureAward" # 聚宝盆奖励状态,按类型位运算记录是否已领取
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 10 回合制战斗 #tagCMTurnFight
|
| | |
|
| | | class tagCMTurnFight(Structure):
|
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | ValueCount = 0 #(BYTE ValueCount)
|
| | | ValueList = list() #(vector<DWORD> ValueList)// 附加值列表,可选,具体含义由MapID决定
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x10
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.ValueCount):
|
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | | self.ValueList.append(value)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x10
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.ValueCount = 0
|
| | | self.ValueList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 4 * self.ValueCount
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.ValueCount)
|
| | | for i in range(self.ValueCount):
|
| | | data = CommFunc.WriteDWORD(data, self.ValueList[i])
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | ValueCount:%d,
|
| | | ValueList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.ValueCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMTurnFight=tagCMTurnFight()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTurnFight.Head.Cmd,m_NAtagCMTurnFight.Head.SubCmd))] = m_NAtagCMTurnFight
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B5 14 拍卖行竞价物品 #tagCMBiddingAuctionItem
|
| | |
|
| | | class tagCMBiddingAuctionItem(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B4 20 回合制战斗状态 #tagMCTurnFightState
|
| | |
|
| | | class tagMCTurnFightState(Structure):
|
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | State = 0 #(BYTE State)// 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
|
| | | TurnNum = 0 #(BYTE TurnNum)// 当前轮次
|
| | | TurnMax = 0 #(BYTE TurnMax)// 最大轮次
|
| | | Len = 0 #(WORD Len)
|
| | | Msg = "" #(String Msg)//size = Len
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x20
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Msg,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB4
|
| | | self.Head.SubCmd = 0x20
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.State = 0
|
| | | self.TurnNum = 0
|
| | | self.TurnMax = 0
|
| | | self.Len = 0
|
| | | self.Msg = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 2
|
| | | length += len(self.Msg)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.State)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnNum)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnMax)
|
| | | data = CommFunc.WriteWORD(data, self.Len)
|
| | | data = CommFunc.WriteString(data, self.Len, self.Msg)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | State:%d,
|
| | | TurnNum:%d,
|
| | | TurnMax:%d,
|
| | | Len:%d,
|
| | | Msg:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.State,
|
| | | self.TurnNum,
|
| | | self.TurnMax,
|
| | | self.Len,
|
| | | self.Msg
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCTurnFightState=tagMCTurnFightState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Head.Cmd,m_NAtagMCTurnFightState.Head.SubCmd))] = m_NAtagMCTurnFightState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 09 跨服排位玩家信息 #tagMCChampionshipPlayerInfo
|
| | |
|
| | | class tagMCChampionshipPlayerInfo(Structure):
|
| | |
| | | return False
|
| | | return callFunc(curPlayer)
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 - 地图验证
|
| | | # @return: 是否允许
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
| | | # 默认不限制
|
| | | return True
|
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList)
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList)
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
|
| | | # @return: None - 无结算逻辑,可走TurnAttack模块通用逻辑
|
| | | # @return: 是否需要同步GameServer, 奖励列表
|
| | |
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
|
| | |
| | | if callFunc == None:
|
| | | return
|
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet)
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet)
|
| | |
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret):
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret):
|
| | | ## 回合战斗结束 - GameServer处理完毕返回
|
| | |
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
| | | if callFunc == None:
|
| | | return
|
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret)
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret)
|
| | |
|
| | | |
| | |
| | | import PlayerControl
|
| | | import GameWorld
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 - 地图验证
|
| | | |
| | | if tagType != ChConfig.TurnBattle_TagType_Player:
|
| | | GameWorld.DebugLog("请求回合战斗目标异常! mapID=%s,tagType=%s,tagID=%s" % (mapID, tagType, tagID), curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | | # 摇人帮助
|
| | | if funcLineID == 0:
|
| | | if not tagPlayerID:
|
| | | if not tagID:
|
| | | return
|
| | | awardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHelpAwardCount)
|
| | | awardCountMax = IpyGameDataPY.GetFuncCfg("MineAreaHelp", 1)
|
| | | if awardCountMax and awardCount >= awardCountMax:
|
| | | GameWorld.DebugLog("已达到今日福地帮助奖励次数上限! awardCount=%s" % awardCount, curPlayer.GetPlayerID())
|
| | | return
|
| | | # 自己驱赶
|
| | | elif funcLineID == 1:
|
| | | pass
|
| | | else:
|
| | | # 通过lineID扩展同个功能系统下的不同战斗需求
|
| | | pass
|
| | |
|
| | | return True
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
|
| | | needSendGameServer = True
|
| | | awardItemList = []
|
| | | overInfoEx = {}
|
| | |
|
| | | # 摇人帮助
|
| | | if funcLineID == 0:
|
| | | # 无论胜负都要同步GameServer汇报结果
|
| | | isWin = fightRet[0]
|
| | | if not isWin:
|
| | | return True, [], 0
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | |
|
| | | awardItemList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHelp", 2)
|
| | | return True, awardItemList, 2
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | | |
| | | # 自己驱赶
|
| | | elif funcLineID == 1:
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | |
|
| | | return
|
| | |
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret):
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret):
|
| | | ## 回合战斗结束 - GameServer处理完毕返回
|
| | |
|
| | | # 摇人帮助
|