hxp
2024-01-12 6b76741f4ea905c4de5997c40b0476bd63fa37b8
10019 【砍树】回合战斗(增加伤血统计、奖励结算及通知;)
6个文件已修改
248 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -47689,72 +47689,106 @@
# B4 20 回合制战斗状态 #tagMCTurnFightState
class  tagMCTurnFightState(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),    # 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
                  ("FuncLineID", c_ushort),
                  ("PlayerID", c_int),    # 对应玩家ID,可为0,某些功能可能有用,如竞技场
                  ("State", c_ubyte),    # 0-开始;1-战斗中;2-胜利;3-失败;4-结束
                  ("TurnNum", c_ubyte),    # 当前轮次
                  ("TurnMax", c_ubyte),    # 最大轮次
                  ]
    Head = tagHead()
    MapID = 0    #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
    FuncLineID = 0    #(WORD FuncLineID)
    PlayerID = 0    #(DWORD PlayerID)// 对应玩家ID,可为0,某些功能可能有用,如竞技场
    State = 0    #(BYTE State)// 0-开始;1-战斗中;2-胜利;3-失败;4-结束
    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.Cmd = 0xB4
        self.SubCmd = 0x20
        self.Head.Cmd = 0xB4
        self.Head.SubCmd = 0x20
        return
    def ReadData(self, stringData, _pos=0, _len=0):
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.PlayerID,_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.Cmd = 0xB4
        self.SubCmd = 0x20
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xB4
        self.Head.SubCmd = 0x20
        self.MapID = 0
        self.FuncLineID = 0
        self.PlayerID = 0
        self.State = 0
        self.TurnNum = 0
        self.TurnMax = 0
        self.Len = 0
        self.Msg = ""
        return
    def GetLength(self):
        return sizeof(tagMCTurnFightState)
        length = 0
        length += self.Head.GetLength()
        length += 4
        length += 2
        length += 4
        length += 1
        length += 1
        length += 1
        length += 2
        length += len(self.Msg)
        return length
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
        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.WriteDWORD(data, self.PlayerID)
        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 = '''// B4 20 回合制战斗状态 //tagMCTurnFightState:
                                Cmd:%s,
                                SubCmd:%s,
        DumpString = '''
                                Head:%s,
                                MapID:%d,
                                FuncLineID:%d,
                                PlayerID:%d,
                                State:%d,
                                TurnNum:%d,
                                TurnMax:%d
                                TurnMax:%d,
                                Len:%d,
                                Msg:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Head.OutputString(),
                                self.MapID,
                                self.FuncLineID,
                                self.PlayerID,
                                self.State,
                                self.TurnNum,
                                self.TurnMax
                                self.TurnMax,
                                self.Len,
                                self.Msg
                                )
        return DumpString
m_NAtagMCTurnFightState=tagMCTurnFightState()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Cmd,m_NAtagMCTurnFightState.SubCmd))] = m_NAtagMCTurnFightState
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Head.Cmd,m_NAtagMCTurnFightState.Head.SubCmd))] = m_NAtagMCTurnFightState
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2459,6 +2459,8 @@
            atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtNPCObjID, defObj.GetID())
        else:
            defObj.SetDict(ChConfig.Def_PlayerKey_LastAttackerObjID, atkObj.GetID())
    TurnAttack.AddTurnObjHurtValue(atkObj, defObj, resultHurtType.HurtType, resultHurtType.RealHurtHP, curSkill)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -32,6 +32,8 @@
import PetControl
import SkillShell
import BuffSkill
import FBCommon
import ItemControler
(
FightState_Start,
@@ -52,7 +54,8 @@
        objName = "%s[%s]" % (objName, mirrorPlayerID)
    faction = GameObj.GetFaction(gameObj)
    fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
    return "%s%s %s" % ("A" if faction == 1 else "B", fightPlaceNum, objName)
    curID = gameObj.GetNPCID() if gameObj.GetGameObjType() == IPY_GameWorld.gotNPC else ""
    return "%s%s %s%s" % ("A" if faction == 1 else "B", fightPlaceNum, objName, curID)
#// B4 10 回合制战斗 #tagCMTurnFight
#
@@ -94,7 +97,8 @@
def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick):
    playerID = curPlayer.GetPlayerID()
    posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()
    GameWorld.DebugLog("===== 执行回合制战斗: mapID=%s,funcLineID=%s,tagPlayerID=%s" % (mapID, funcLineID, tagPlayerID), playerID)
    GameWorld.DebugLog("===== 执行回合制战斗: mapID=%s,funcLineID=%s,playerID=%s,tagPlayerID=%s" % (mapID, funcLineID, playerID, tagPlayerID))
    ipyData = None
    tagObj = None
    if tagPlayerID:
        npcID = ChConfig.Def_NPCID_PVP
@@ -205,16 +209,42 @@
            break
                
    GameWorld.DebugLog("--- 战斗结束处理 ---")
    overState = FightState_Win if isWin else FightState_Fail
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax)
    # 统计总伤害
    factionTotalHurtDict = {}
    for gameObj in fightObjList:
        if not gameObj:
            continue
        faction = GameObj.GetFaction(gameObj)
        objName = GetObjName(gameObj)
        objID = gameObj.GetID()
        totalHurtEx = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue
        totalHurt = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx
        factionTotalHurtDict[faction] = factionTotalHurtDict.get(faction, 0) + totalHurt
        GameWorld.DebugLog("%s objID=%s,faction=%s, 总输出: %s" % (objName, objID, faction, totalHurt))
    for faction, totalHurt in factionTotalHurtDict.items():
        GameWorld.DebugLog("faction=%s, 阵营总输出: %s" % (faction, totalHurt))
    GameWorld.DebugLog("玩家剩余血量: %s / %s" % (GameObj.GetHP(curPlayer), GameObj.GetMaxHP(curPlayer)))
    GameWorld.DebugLog("对方剩余血量: %s / %s" % (GameObj.GetHP(tagObj), GameObj.GetMaxHP(tagObj)))
    
    # 结算奖励...待扩展
    awardItemList = []
    if isWin and ipyData:
        # 山寨测试先默认都是首次奖励,正式后需删除
        awardItemList = ipyData.GetAwardItemListFirst()
    GameWorld.DebugLog("奖励物品: %s" % awardItemList)
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}])
    overMsg = {"itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
    overState = FightState_Win if isWin else FightState_Fail
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax, str(overMsg))
    
    for gameObj in fightObjList:
        TurnFightObjOverReset(gameObj, tick)
        
    GameWorld.DebugLog("===== 回合制战斗结束: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s"
                       % (mapID, funcLineID, tagPlayerID, isWin, overState), playerID)
    GameWorld.DebugLog("===== 回合制战斗结束: mapID=%s,funcLineID=%s,playerID=%s,tagPlayerID=%s,isWin=%s,overState=%s"
                       % (mapID, funcLineID, playerID, tagPlayerID, isWin, overState))
    return
def CheckIswin(curPlayer, tagObj):
@@ -364,6 +394,8 @@
    isMainRole = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRole)
    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightID, playerID)
    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnRebornCount, 0)
    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, 0)
    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, 0)
    SetTimeline(gameObj, 1, 0)
    GameObj.SetFaction(gameObj, faction)
    GameObj.SetHPFull(gameObj)
@@ -524,7 +556,7 @@
            if curBuff.GetCalcStartTick() > timeLine:
                # 回合制中产生的buff是以timeline作为CalcStartTick的,所以超过timeline的可视为非回合制buff
                continue
            GameWorld.DebugLog("    删除回合制buff: buffSkillID=%s" % buffSkillID, objID)
            GameWorld.DebugLog("    删除回合制buff: objID=%s,buffSkillID=%s" % (objID, buffSkillID))
            ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()
            BuffSkill.DoBuffDisApper(gameObj, curBuff, tick)
            buffState.DeleteBuffByIndex(i)
@@ -551,6 +583,17 @@
    NPCCommon.SetDeadEx(gameObj)
    return
def AddTurnObjHurtValue(curObj, tagObj, hurtType, hurtValue, curSkill=None):
    if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
        return
    skillID = curSkill.GetSkillID() if curSkill else 0
    totalHurtEx = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue
    totalHurt = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx + hurtValue
    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, totalHurt % ChConfig.Def_PerPointValue)
    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, totalHurt / ChConfig.Def_PerPointValue)
    GameWorld.DebugLog("        伤血: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s"
                       % (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt))
    return
def DoAttack(curObj, tagObj, tick):
    curID = curObj.GetID()
@@ -780,7 +823,7 @@
            GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
    return useSkillResult
def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0):
def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""):
    clientPack = ChPyNetSendPack.tagMCTurnFightState()
    clientPack.Clear()
    clientPack.MapID = mapID
@@ -789,6 +832,8 @@
    clientPack.State = state
    clientPack.TurnNum = turnNum
    clientPack.TurnMax = turnMax
    clientPack.Msg = msg
    clientPack.Len = len(clientPack.Msg)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3074,6 +3074,8 @@
Def_Obj_Dict_TurnComboNum = 'TurnComboNum' # 本回合已累计连击次数
Def_Obj_Dict_TurnAtkBackNum = 'TurnAtkBackNum' # 本回合已累计反击次数
Def_Obj_Dict_TurnBattleType = 'TurnBattleType' # 本次攻击战斗类型:TurnBattleType_xxx
Def_Obj_Dict_TurnTotalHurt = 'TurnTotalHurt' # 本回合制战斗总伤害,求余亿部分
Def_Obj_Dict_TurnTotalHurtEx = 'TurnTotalHurtEx' # 本回合制战斗总伤害,整除亿部分
Def_Obj_Dict_FightPetPlaceNum = 'FightPetPlaceNum' # 出战灵宠上阵位置,1~n
Def_Obj_Dict_FightPetQuality = 'FightPetQuality' # 出战灵宠品质
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -47689,72 +47689,106 @@
# B4 20 回合制战斗状态 #tagMCTurnFightState
class  tagMCTurnFightState(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),    # 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
                  ("FuncLineID", c_ushort),
                  ("PlayerID", c_int),    # 对应玩家ID,可为0,某些功能可能有用,如竞技场
                  ("State", c_ubyte),    # 0-开始;1-战斗中;2-胜利;3-失败;4-结束
                  ("TurnNum", c_ubyte),    # 当前轮次
                  ("TurnMax", c_ubyte),    # 最大轮次
                  ]
    Head = tagHead()
    MapID = 0    #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
    FuncLineID = 0    #(WORD FuncLineID)
    PlayerID = 0    #(DWORD PlayerID)// 对应玩家ID,可为0,某些功能可能有用,如竞技场
    State = 0    #(BYTE State)// 0-开始;1-战斗中;2-胜利;3-失败;4-结束
    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.Cmd = 0xB4
        self.SubCmd = 0x20
        self.Head.Cmd = 0xB4
        self.Head.SubCmd = 0x20
        return
    def ReadData(self, stringData, _pos=0, _len=0):
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.PlayerID,_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.Cmd = 0xB4
        self.SubCmd = 0x20
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xB4
        self.Head.SubCmd = 0x20
        self.MapID = 0
        self.FuncLineID = 0
        self.PlayerID = 0
        self.State = 0
        self.TurnNum = 0
        self.TurnMax = 0
        self.Len = 0
        self.Msg = ""
        return
    def GetLength(self):
        return sizeof(tagMCTurnFightState)
        length = 0
        length += self.Head.GetLength()
        length += 4
        length += 2
        length += 4
        length += 1
        length += 1
        length += 1
        length += 2
        length += len(self.Msg)
        return length
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
        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.WriteDWORD(data, self.PlayerID)
        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 = '''// B4 20 回合制战斗状态 //tagMCTurnFightState:
                                Cmd:%s,
                                SubCmd:%s,
        DumpString = '''
                                Head:%s,
                                MapID:%d,
                                FuncLineID:%d,
                                PlayerID:%d,
                                State:%d,
                                TurnNum:%d,
                                TurnMax:%d
                                TurnMax:%d,
                                Len:%d,
                                Msg:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Head.OutputString(),
                                self.MapID,
                                self.FuncLineID,
                                self.PlayerID,
                                self.State,
                                self.TurnNum,
                                self.TurnMax
                                self.TurnMax,
                                self.Len,
                                self.Msg
                                )
        return DumpString
m_NAtagMCTurnFightState=tagMCTurnFightState()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Cmd,m_NAtagMCTurnFightState.SubCmd))] = m_NAtagMCTurnFightState
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Head.Cmd,m_NAtagMCTurnFightState.Head.SubCmd))] = m_NAtagMCTurnFightState
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -34,6 +34,7 @@
import GameObj
import PassiveBuffEffMng
import IpyGameDataPY
import TurnAttack
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -1408,6 +1409,8 @@
        elif curObjType == IPY_GameWorld.gotNPC:
            AttackCommon.NPCAddObjInHurtList(attackerOwner, curObj, curObjHP_BeforeAttack, lostValue)
            
    TurnAttack.AddTurnObjHurtValue(buffOwner, curObj, hurtType, lostValue, curSkill)
    #统一调用攻击结束动作
    if isDoAttackResult:
        BaseAttack.DoLogic_AttackResult(buffOwner, curObj, None, tick)