10130 【后端】福地争夺资源功能(增加摇人功能、支持自己驱赶;优化刷福地物品相关GM命令;)
11个文件已修改
1个文件已添加
825 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/MineArea.py 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -20703,6 +20703,101 @@
#------------------------------------------------------
# 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):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -48937,6 +48937,119 @@
#------------------------------------------------------
# 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):
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/MineArea.py
@@ -31,17 +31,19 @@
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()
@@ -49,24 +51,39 @@
    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)
        
    # 派工人拉物品
@@ -165,8 +182,9 @@
        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):
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py
@@ -790,22 +790,22 @@
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)
@@ -813,10 +813,15 @@
    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
@@ -841,7 +846,7 @@
    return True
def __OnMineHelpOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList):
    # 摇人帮助结果
    # 摇人帮助结果、自己驱赶结果
    
    playerID = curPlayer.GetPlayerID()
    helpPlayerName = curPlayer.GetName()
@@ -863,17 +868,25 @@
    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):
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py
@@ -18,6 +18,7 @@
import GameWorld
import GameWorldMineArea
import ChConfig
import PlayerViewCache
def MapServer_TurnFight(curPlayer, msgList):
    mapID = curPlayer.GetRealMapID()
@@ -35,6 +36,9 @@
    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])
@@ -43,20 +47,33 @@
    ## 回合战斗请求
    # @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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1873,6 +1873,18 @@
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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
New file
@@ -0,0 +1,203 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1873,6 +1873,14 @@
#情缘副本
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]
@@ -2006,6 +2014,7 @@
                'Love':[Def_FBMapID_Love],#情缘副本
                'CrossBattlefield':[Def_FBMapID_CrossBattlefield], #跨服战场
                'CrossFamilyFlagwar':[Def_FBMapID_CrossFamilyFlagwar], #跨服仙盟夺旗战/逐鹿万界
                'MineArea':[Def_TFMapID_MineArea], #福地
                }
#特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
@@ -3064,6 +3073,20 @@
    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字典-------
#每道龙卷风最终坐标
@@ -4390,7 +4413,8 @@
#福地
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" # 聚宝盆奖励状态,按类型位运算记录是否已领取
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -20703,6 +20703,101 @@
#------------------------------------------------------
# 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):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -48937,6 +48937,119 @@
#------------------------------------------------------
# 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):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -2424,7 +2424,7 @@
        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)
@@ -2435,12 +2435,11 @@
        # 默认不限制
        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)
    
@@ -2449,9 +2448,9 @@
    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)
@@ -2461,6 +2460,5 @@
    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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py
@@ -21,41 +21,55 @@
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处理完毕返回
    
    # 摇人帮助