129 【战斗】战斗系统-服务端(战斗去除对象池使用,释放效率有点低,且对象池对简单的类创建性能提升不高,故暂废弃;)
6个文件已修改
100 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ObjPool.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -23,7 +23,6 @@
import ChNetSendPack
import ShareDefine
import ChConfig
import ObjPool
import TurnPassive
import TurnBuff
@@ -306,13 +305,10 @@
    def GetBounceHP(self): return self._bounceHP
    def SetBounceHP(self, bounceHP): self._bounceHP = bounceHP
    def ClearHurtObjEx(self):
        poolMgr = ObjPool.GetPoolMgr()
        for hurtObjEx in self._hurtListEx:
            poolMgr.release(hurtObjEx)
        self._hurtListEx = []
        return
    def AddHurtObjEx(self, tagID):
        hurtObj = ObjPool.GetPoolMgr().acquire(HurtObj)
        hurtObj = HurtObj()
        hurtObj.SetObjID(tagID)
        self._hurtListEx.append(hurtObj)
        return hurtObj
@@ -359,7 +355,7 @@
            values = getattr(ipyData, "GetEffectValues%s" % num)()
            triggerWay = getattr(ipyData, "GetTriggerWay%s" % num)()
            triggerSrc = getattr(ipyData, "GetTriggerSrc%s" % num)()
            effect = ObjPool.GetPoolMgr().acquire(SkillEffect, effID, values, triggerWay, triggerSrc)
            effect = SkillEffect(effID, values, triggerWay, triggerSrc)
            self._effList.append(effect)
            self._effDict[(effID, triggerWay)] = effect
        return
@@ -412,7 +408,7 @@
class PyBuff():
    
    def __init__(self, ipyData):
        self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
        self._skillData = SklllData(ipyData)
        self._skillID = self._skillData.GetSkillID()
        self._skillTypeID = self._skillData.GetSkillTypeID()
        self._addTiming = 0 # 添加该buff时间点,0-自身回合前;1-自身回合后
@@ -500,9 +496,6 @@
        return
    
    def ClearBuff(self):
        poolMgr = ObjPool.GetPoolMgr()
        for buff in self._buffList:
            poolMgr.release(buff)
        self._buffList = []
        self._buffIDDict = {}
        self._skillTypeIDBuffIDs = {}
@@ -522,7 +515,7 @@
        self._buffID += 1
        
        buffID = self._buffID
        buff = ObjPool.GetPoolMgr().acquire(PyBuff, ipyData)
        buff = PyBuff(ipyData)
        buff.SetBuffID(buffID)
        
        self._buffList.append(buff)
@@ -558,8 +551,6 @@
            if not buffIDList:
                self._skillTypeIDBuffIDs.pop(skillTypeID)
            break
        if release:
            ObjPool.GetPoolMgr().release(buff)
        return
    
    def GetBuff(self, buffID):
@@ -645,7 +636,7 @@
    
    def __init__(self, ipyData, objID):
        self._objID = objID # 该技能谁的
        self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
        self._skillData = SklllData(ipyData)
        self._skillID = self._skillData.GetSkillID()
        self._skillTypeID = self._skillData.GetSkillTypeID()
        self._remainTime = 0
@@ -754,21 +745,18 @@
        return
    def ClearHurtObj(self):
        ## 清空伤血统计
        poolMgr = ObjPool.GetPoolMgr()
        for hurtObj in self._hurtList:
            hurtObj.ClearHurtObjEx()
            poolMgr.release(hurtObj)
        self._hurtList = []
        
        for hurtObjEx in self._hurtListEx:
            hurtObjEx.ClearHurtObjEx()
            poolMgr.release(hurtObjEx)
        self._hurtListEx = []
        return
    def AddHurtObj(self, tagID, isEx=False):
        ## 添加某个伤血
        # @param isEx: 是否额外伤血
        hurtObj = ObjPool.GetPoolMgr().acquire(HurtObj)
        hurtObj = HurtObj()
        hurtObj.SetObjID(tagID)
        if isEx:
            self._hurtListEx.append(hurtObj)
@@ -830,9 +818,6 @@
        return
    
    def SkillReset(self):
        poolMgr = ObjPool.GetPoolMgr()
        for skill in self._skillList:
            poolMgr.release(skill)
        self._skillList = []
        self._skillDict = {}
        return
@@ -865,7 +850,7 @@
            self.__deleteSkill(curSkill)
            
        # 学新技能
        curSkill = ObjPool.GetPoolMgr().acquire(PySkill, ipyData, self._batObj.GetID())
        curSkill = PySkill(ipyData, self._batObj.GetID())
        self._skillDict[skillID] = curSkill
        self._skillList.append(curSkill)
        return curSkill
@@ -875,7 +860,6 @@
        self._skillDict.pop(skillID, None)
        if curSkill in self._skillList:
            self._skillList.remove(curSkill)
        ObjPool.GetPoolMgr().release(curSkill)
        return
    
class BatObj():
@@ -912,9 +896,9 @@
        self._skillHappenFailCntDict = {} # 技能累计概率触发次数,使用成功后重置 {skillID:failCnt, ...}
        self._skillUseCntDict = {} # 技能累计使用次数 {skillID:useCnt, ...}
        self._skillTurnUseCntDict = {} # 技能单回合累计使用次数 {skillID:useCnt, ...}
        self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager, self)
        self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self)
        self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
        self._skillMgr = SkillManager(self)
        self._buffMgr = BuffManager(self)
        self._passiveEffMgr = PassiveEffManager(self)
        self._lastHurtValue = 0
        self._harmSelfHP = 0 # 自残值
        self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
@@ -1240,7 +1224,7 @@
        newObjID = self.__getNewObjID()
        if not newObjID:
            return newBatObj
        newBatObj = ObjPool.GetPoolMgr().acquire(BatObj)
        newBatObj = BatObj()
        newBatObj.objID = newObjID
        self.batObjDict[newObjID] = newBatObj
        GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
@@ -1274,7 +1258,6 @@
        #    turnFight.addBatPack(clientPack)
        
        # 最后回收对象
        ObjPool.GetPoolMgr().release(batObj)
        if objID not in self._freeIDList: # 回收ID,重复利用
            self._freeIDList.append(objID)
        return
@@ -1298,7 +1281,7 @@
    turnFight = TurnAttack.GetTurnFightMgr().getTurnFight(batObj.GetTFGUID())
    if not turnFight:
        return
    clientPack = ObjPool.GetPoolMgr().acquire(ChNetSendPack.tagObjInfoRefresh)
    clientPack = ChNetSendPack.tagObjInfoRefresh()
    clientPack.ObjID = batObj.GetID()
    clientPack.RefreshType = refreshType
    if isBig:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -43,7 +43,6 @@
import TurnBuff
import FBCommon
import CommFunc
import ObjPool
import FBLogic
import random
@@ -462,14 +461,11 @@
            GameWorld.DebugLogEx("回合战斗过程封包: %s, len:%s", headStr, buffLen)
            self.batBuffer += CommFunc.WriteWORD("", buffLen)
            self.batBuffer += packBuff
            ObjPool.GetPoolMgr().release(clientPack)
        else:
            GameWorld.DebugLogEx("回合战斗过程封包: %s", headStr)
            # 有玩家的统一每个包单独发送,同样也支持战报统计
            if self.curPlayer:
                NetPackCommon.SendFakePack(self.curPlayer, clientPack)
            else:
                ObjPool.GetPoolMgr().release(clientPack)
        return
    
    def ResetOneActionUseSkillCnt(self): self._oneActionUseSkillCntDict = {}
@@ -487,7 +483,7 @@
        return
    
    def addTurnFight(self, guid, mapID, funcLineID=0, reqPlayerID=0, reqServerID=0):
        tf = ObjPool.GetPoolMgr().acquire(TurnFight, guid, mapID, funcLineID, reqPlayerID, reqServerID)
        tf = TurnFight(guid, mapID, funcLineID, reqPlayerID, reqServerID)
        if not tf:
            tf = TurnFight(guid, mapID, funcLineID, reqPlayerID, reqServerID) # 一般是不可能,为了点出代码
        self.turnFightDict[tf.guid] = tf
@@ -499,7 +495,6 @@
            return
        turnFight.exitFight()
        self.turnFightDict.pop(guid, None)
        ObjPool.GetPoolMgr().release(turnFight)
        return
    
    def getTurnFight(self, guid):
@@ -1994,7 +1989,7 @@
    gameObj.SetDead()
    TurnBuff.DoBuffByDead(turnFight, gameObj)
    
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCTurnFightObjDead)
    clientPack = ChPyNetSendPack.tagMCTurnFightObjDead()
    clientPack.ObjID = objID
    clientPack.KillerObjID = killerObjID
    clientPack.SkillID = skillID
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
@@ -31,7 +31,6 @@
import traceback
import ChGameToMapPyPack
from PyMongoDB.DBCommon import CommonDefine
import ObjPool
import ChServerToServerPyPack
from PyMongoDB.Protocol import MergeServerRecvProtocol
#-------------------------------------------------------------------------------
@@ -230,7 +229,6 @@
        Log("SendFakePack: clientPack Len = %s > %s"%(clientPack.GetLength(), len(innerPackData)))
    #curPlayer.SendFakePack(innerPackData, len(innerPackData))
    curPlayer.SendFakePack(clientPack.GetBuffer(), clientPack.GetLength())
    ObjPool.GetPoolMgr().release(clientPack)
    return
    
def SendFackPackOnline(clientPack, parseFunc=None, *args):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ObjPool.py
@@ -334,8 +334,8 @@
def OnMinute(curTime):
    """每分钟执行,输出对象池状态"""
    if curTime.minute == 5: # 每小时的5分输出一次
        GetPoolMgr().pool_status()
    #if curTime.minute == 5: # 每小时的5分输出一次
    #    GetPoolMgr().pool_status()
    return
## 使用示例
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -21,7 +21,6 @@
import IpyGameDataPY
import TurnBuffs
import BattleObj
import ObjPool
import TurnPassive
GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
@@ -69,13 +68,11 @@
        return
    ownerID = buffOwner.GetID() if buffOwner else 0
    tagObjList = [batObj]
    poolMgr = ObjPool.GetPoolMgr()
    useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, ownerID)
    useSkill = BattleObj.PySkill(skillIpyData, ownerID)
    useSkill.SetTagObjList(tagObjList)
    
    addBuff = OnAddBuff(turnFight, batObj, useSkill, buffOwner, bySkill, afterLogic, isSync=isSync, setLayerCnt=setLayerCnt)
    
    poolMgr.release(useSkill)
    return addBuff
def OnAddBuff(turnFight, batObj, buffSkill, buffOwner=None, bySkill=None, afterLogic=False, isSync=True, **kwargs):
@@ -448,7 +445,6 @@
    ## buff删除后续处理逻辑处理完毕
    relatedSkillID = relatedSkill.GetSkillID() if relatedSkill else 0
    SyncBuffDel(turnFight, buffObjID, curBuff.GetBuffID(), relatedSkillID)
    ObjPool.GetPoolMgr().release(curBuff)
    return
def DoBuffProcess(turnFight, batObj, curBuff, **kwargs):
@@ -640,7 +636,7 @@
def SyncBuffRefresh(turnFight, curBatObj, curBuff, relatedSkillID=0, isNewAdd=False):
    ## @param curBatObj: 该buff的持有者,即在谁身上
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCBuffRefresh)
    clientPack = ChPyNetSendPack.tagSCBuffRefresh()
    clientPack.ObjID = curBatObj.GetID()
    clientPack.BuffID = curBuff.GetBuffID()
    clientPack.SkillID = curBuff.GetSkillID()
@@ -656,7 +652,7 @@
    return
def SyncBuffDel(turnFight, objID, buffID, relatedSkillID=0):
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCBuffDel)
    clientPack = ChPyNetSendPack.tagSCBuffDel()
    clientPack.ObjID = objID
    clientPack.BuffID = buffID
    clientPack.RelatedSkillID = relatedSkillID
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -27,7 +27,6 @@
import TurnPassive
import TurnAttack
import TurnBuff
import ObjPool
import FBLogic
import random
@@ -140,12 +139,9 @@
                         objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
    # 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
    
    poolMgr = ObjPool.GetPoolMgr()
    usePoolSkill = False
    if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
        usePoolSkill = True
        # 统一使用 BattleObj.PySkill
        useSkill = poolMgr.acquire(BattleObj.PySkill, useSkill, objID)
        useSkill = BattleObj.PySkill(useSkill, objID)
        
    useSkill.ResetUseRec()
    useSkill.SetTagObjList(tagObjList)
@@ -192,8 +188,6 @@
            
    # 最后重置、回收对象
    useSkill.ResetUseRec()
    if usePoolSkill:
        poolMgr.release(useSkill)
    return True
def CheckSkillUseCntLimit(batObj, useSkill):
@@ -1018,8 +1012,7 @@
    #    hurtValue *= (10000 + FinalDamPer) / 10000.0
    #    GameWorld.DebugLogEx("    增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
    
    poolMgr = ObjPool.GetPoolMgr()
    useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
    useSkill = BattleObj.PySkill(skillIpyData, atkID)
    useSkill.SetTagObjList([defObj])
    useSkill.SetBatType(ChConfig.TurnBattleType_Cot)
    
@@ -1055,7 +1048,6 @@
    Sync_TurnFightTag(turnFight, useTag, 1)
    
    useSkill.ResetUseRec()
    poolMgr.release(useSkill)
    return
def SkillModule_6(turnFight, curBatObj, useSkill, opType):
@@ -2710,8 +2702,7 @@
        hurtValue *= (10000 + FinalDamPer) / 10000.0
        GameWorld.DebugLogEx("    增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
        
    poolMgr = ObjPool.GetPoolMgr()
    useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
    useSkill = BattleObj.PySkill(skillIpyData, atkID)
    useSkill.SetTagObjList([defObj])
    useSkill.SetBatType(ChConfig.TurnBattleType_Dot)
    
@@ -2727,12 +2718,11 @@
    Sync_TurnFightTag(turnFight, useTag, 1)
    
    useSkill.ResetUseRec()
    poolMgr.release(useSkill)
    return
def Sync_TurnFightTag(turnFight, useTag, sign):
    ## 通知技能标签
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTurnFightTag)
    clientPack = ChPyNetSendPack.tagSCTurnFightTag()
    clientPack.Tag = useTag
    clientPack.Len = len(clientPack.Tag)
    clientPack.Sign = sign
@@ -2743,8 +2733,7 @@
    ## 通知释放技能
    bySkill = useSkill.GetBySkill()
    relatedSkillID = bySkill.GetSkillID() if bySkill else 0
    poolMgr = ObjPool.GetPoolMgr()
    clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkill)
    clientPack = ChPyNetSendPack.tagSCUseSkill()
    clientPack.ObjID = curBatObj.GetID()
    clientPack.PMType = GetPMType(curBatObj, useSkill)
    clientPack.BattleType = useSkill.GetBatType()
@@ -2755,7 +2744,7 @@
    # 技能的主要伤害
    clientPack.HurtList = []
    for hurtObj in useSkill.GetHurtObjList():
        hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
        hurt = ChPyNetSendPack.tagSCUseSkillHurt()
        hurt.ObjID = hurtObj.GetObjID()
        hurt.AttackTypes = hurtObj.GetHurtTypes()
        hurt.HurtHP = hurtObj.GetHurtHP() % ChConfig.Def_PerPointValue
@@ -2767,7 +2756,7 @@
        hurt.HurtListEx = []
        # 单个伤害的额外伤害,如弹射+平摊伤害
        for hurtObjEx in hurtObj.GetHurtObjListEx():
            hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
            hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
            hurtEx.ObjID = hurtObjEx.GetObjID()
            hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
            hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
@@ -2782,7 +2771,7 @@
    # 技能的额外伤害,如常规技能的平摊伤害
    clientPack.HurtListEx = []
    for hurtObjEx in useSkill.GetHurtObjListEx():
        hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
        hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
        hurtEx.ObjID = hurtObjEx.GetObjID()
        hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
        hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
@@ -2797,7 +2786,7 @@
    if not clientPack.HurtList:
        for tagObj in useSkill.GetTagObjList():
            tagID = tagObj.GetID()
            hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
            hurt = ChPyNetSendPack.tagSCUseSkillHurt()
            hurt.ObjID = tagID
            hurt.CurHP = tagObj.GetHP() % ChConfig.Def_PerPointValue
            hurt.CurHPEx = tagObj.GetHP() / ChConfig.Def_PerPointValue
@@ -2819,8 +2808,7 @@
    if attrID not in ChConfig.CDBRefresh_AttrIDDict:
        return
    refreshType, isBig = ChConfig.CDBRefresh_AttrIDDict[attrID]
    poolMgr = ObjPool.GetPoolMgr()
    clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCObjPropertyRefreshView)
    clientPack = ChPyNetSendPack.tagSCObjPropertyRefreshView()
    clientPack.ObjID = curBatObj.GetID()
    clientPack.RefreshType = refreshType
    clientPack.AttackTypes = hurtTypes    
@@ -2842,7 +2830,7 @@
def Sync_HPRefresh(turnFight, curBatObj):
    hp, maxHP = curBatObj.GetHP(), curBatObj.GetMaxHP()
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCObjHPRefresh)
    clientPack = ChPyNetSendPack.tagSCObjHPRefresh()
    clientPack.ObjID = curBatObj.GetID()
    clientPack.HP = hp % ShareDefine.Def_PerPointValue
    clientPack.HPEx = hp / ShareDefine.Def_PerPointValue