From 9d0b6e92a4cdb313f5b5c451715cc1dfcb227177 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 06 六月 2024 11:18:00 +0800
Subject: [PATCH] 10130 【后端】福地争夺资源功能(增加摇人功能、支持自己驱赶;优化刷福地物品相关GM命令;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py |   28 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py                      |   16 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py                                           |   27 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                         |   12 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                 |   95 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                             |  113 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/MineArea.py                                             |   44 ++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                      |   95 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                           |  203 ++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                  |  113 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py                                 |   53 ++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                    |   26 +
 12 files changed, 770 insertions(+), 55 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 2e17195..3b15d61 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 34d8143..5f635c1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/MineArea.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/MineArea.py
index acb9ec2..6d0c928 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/MineArea.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py
index d89f323..2cef9d1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldMineArea.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py
index ffe290e..e19922f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index a94fb90..f7e7343 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
new file mode 100644
index 0000000..662489b
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 72263db..bf79635 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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" # 聚宝盆奖励状态,按类型位运算记录是否已领取
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 2e17195..3b15d61 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 34d8143..5f635c1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
index ca0555f..aad18b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/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)
 
-    
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py
index d4c7296..4df4b05 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py
+++ b/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处理完毕返回
     
     # 摇人帮助

--
Gitblit v1.8.0