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