129 【战斗】战斗系统-服务端(战斗去除对象池使用,释放效率有点低,且对象池对简单的类创建性能提升不高,故暂废弃;)
| | |
| | | import ChNetSendPack
|
| | | import ShareDefine
|
| | | import ChConfig
|
| | | import ObjPool
|
| | | import TurnPassive
|
| | | import TurnBuff
|
| | |
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | | 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-自身回合后
|
| | |
| | | return
|
| | |
|
| | | def ClearBuff(self):
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | for buff in self._buffList:
|
| | | poolMgr.release(buff)
|
| | | self._buffList = []
|
| | | self._buffIDDict = {}
|
| | | self._skillTypeIDBuffIDs = {}
|
| | |
| | | self._buffID += 1
|
| | |
|
| | | buffID = self._buffID
|
| | | buff = ObjPool.GetPoolMgr().acquire(PyBuff, ipyData)
|
| | | buff = PyBuff(ipyData)
|
| | | buff.SetBuffID(buffID)
|
| | |
|
| | | self._buffList.append(buff)
|
| | |
| | | if not buffIDList:
|
| | | self._skillTypeIDBuffIDs.pop(skillTypeID)
|
| | | break
|
| | | if release:
|
| | | ObjPool.GetPoolMgr().release(buff)
|
| | | return
|
| | |
|
| | | def GetBuff(self, buffID):
|
| | |
| | |
|
| | | 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
|
| | |
| | | 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)
|
| | |
| | | return
|
| | |
|
| | | def SkillReset(self):
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | for skill in self._skillList:
|
| | | poolMgr.release(skill)
|
| | | self._skillList = []
|
| | | self._skillDict = {}
|
| | | return
|
| | |
| | | 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
|
| | |
| | | self._skillDict.pop(skillID, None)
|
| | | if curSkill in self._skillList:
|
| | | self._skillList.remove(curSkill)
|
| | | ObjPool.GetPoolMgr().release(curSkill)
|
| | | return
|
| | |
|
| | | class BatObj():
|
| | |
| | | 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列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
|
| | |
| | | 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)
|
| | |
| | | # turnFight.addBatPack(clientPack)
|
| | |
|
| | | # 最后回收对象
|
| | | ObjPool.GetPoolMgr().release(batObj)
|
| | | if objID not in self._freeIDList: # 回收ID,重复利用
|
| | | self._freeIDList.append(objID)
|
| | | return
|
| | |
| | | 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:
|
| | |
| | | import TurnBuff
|
| | | import FBCommon
|
| | | import CommFunc
|
| | | import ObjPool
|
| | | import FBLogic
|
| | |
|
| | | import random
|
| | |
| | | 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 = {}
|
| | |
| | | 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
|
| | |
| | | return
|
| | | turnFight.exitFight()
|
| | | self.turnFightDict.pop(guid, None)
|
| | | ObjPool.GetPoolMgr().release(turnFight)
|
| | | return
|
| | |
|
| | | def getTurnFight(self, guid):
|
| | |
| | | gameObj.SetDead()
|
| | | TurnBuff.DoBuffByDead(turnFight, gameObj)
|
| | |
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCTurnFightObjDead)
|
| | | clientPack = ChPyNetSendPack.tagMCTurnFightObjDead()
|
| | | clientPack.ObjID = objID
|
| | | clientPack.KillerObjID = killerObjID
|
| | | clientPack.SkillID = skillID
|
| | |
| | | import traceback
|
| | | import ChGameToMapPyPack
|
| | | from PyMongoDB.DBCommon import CommonDefine
|
| | | import ObjPool
|
| | | import ChServerToServerPyPack
|
| | | from PyMongoDB.Protocol import MergeServerRecvProtocol
|
| | | #-------------------------------------------------------------------------------
|
| | |
| | | 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):
|
| | |
| | |
|
| | | def OnMinute(curTime):
|
| | | """每分钟执行,输出对象池状态"""
|
| | | if curTime.minute == 5: # 每小时的5分输出一次
|
| | | GetPoolMgr().pool_status()
|
| | | #if curTime.minute == 5: # 每小时的5分输出一次
|
| | | # GetPoolMgr().pool_status()
|
| | | return
|
| | |
|
| | | ## 使用示例
|
| | |
| | | import IpyGameDataPY
|
| | | import TurnBuffs
|
| | | import BattleObj
|
| | | import ObjPool
|
| | | import TurnPassive
|
| | |
|
| | | GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
|
| | |
| | | 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):
|
| | |
| | | ## 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):
|
| | |
| | |
|
| | | 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()
|
| | |
| | | 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
|
| | |
| | | import TurnPassive
|
| | | import TurnAttack
|
| | | import TurnBuff
|
| | | import ObjPool
|
| | | import FBLogic
|
| | |
|
| | | import random
|
| | |
| | | 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)
|
| | |
| | |
|
| | | # 最后重置、回收对象
|
| | | useSkill.ResetUseRec()
|
| | | if usePoolSkill:
|
| | | poolMgr.release(useSkill)
|
| | | return True
|
| | |
|
| | | def CheckSkillUseCntLimit(batObj, useSkill):
|
| | |
| | | # 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)
|
| | |
|
| | |
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
|
| | | useSkill.ResetUseRec()
|
| | | poolMgr.release(useSkill)
|
| | | return
|
| | |
|
| | | def SkillModule_6(turnFight, curBatObj, useSkill, opType):
|
| | |
| | | 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)
|
| | |
|
| | |
| | | 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
|
| | |
| | | ## 通知释放技能
|
| | | 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()
|
| | |
| | | # 技能的主要伤害
|
| | | 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
|
| | |
| | | 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
|
| | |
| | | # 技能的额外伤害,如常规技能的平摊伤害
|
| | | 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
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | |
|
| | | 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
|