Buff系统框架设计
Buff系统框架设计
Buff的配置文件
BufType: 1: 精神类Buf 2: 物理类Buf .元素类Buf 4.其他类Buf 5.被动类Buf
BufSubType: 1000-1999 精神子类 2000-2999.物理子类 000-999.元素子类 4000-4999.其他子类 5000-5999.被动子类。所以子类可以唯一标识一个Buff的类别
OppG
Buff系统框架设计
Buff的配置文件BufType: 1: 精神类Buf 2: 物理类Buf .元素类Buf 4.其他类Buf 5.被动类Buf
BufSubType: 1000-1999 精神子类 2000-2999.物理子类 000-999.元素子类 4000-4999.其他子类 5000-5999.被动子类。所以子类可以唯一标识一个Buff的类别
OppGroupId: 表明该GroupBuff互斥的BuffGroup.玩家身上只可能两种BuffSubType存在一种
RawBufDesc.xml
<RawBufDesc RawBuffId=RawBuff的ID bProBaseDerivedWXImp=是否有基础参数 bCalcImp=是否影响公式计算 bEquipImp=是否影响装备限制计算 beedTick=是否需要被Tick></RawBufDesc>
BufDesc.xml
<BufDesc BuffId=Buf的Id ame=Buff名 BufType=技能大类,其实没什么用,只是用来进行额外索引。 BufSubType=Buff类别,类别写死了该类别的Buff是替代、叠加、同时存在 LifeCycleTime=Buff存在时间 bRemoveOnDead=是否死亡消失 bDebuf=是否损益Buff bGoodBuf=是否增益Buff bOnlyInFight=是否战斗中有效 bVisible=是否显示效果 bSaveDB=是否需要存数据库 BufLv=Buff的等级,决定替代、叠加关系 bManualRemove=是否手动移除 ViewOrder=图标顺序>
<RawBufInsList>
<RawBufInsDesc RawBuffId=产生的RawBuff序列 P1=RawBuff参数 P2=RawBuff参数>
</RawBufInsList>
</BufDesc>
BufGroupDesc.xml
<BufGroupDesc GroupId=BuffGroupId,基本无效 BufSubType=参考前面,这个就可以索引BuffGroup OppGroupId=对抗的BuffGroupId(其实可以不要GroupId,只要BuffSubType) ame=Buff组名>
<buf bufId= level=></buf>
<buf ...></buf>
</BufGroupDesc>
PropertiesDesc.xml 记录了所有游戏使用的属性内容,已经其对应的宏
<PropertiesDesc ProId=属性ID name=宏参数 displayerame= bVisible= desc=>
Buff系统构成
RawBuff构成了Buff
Buff相同SubType的内容构成了BufGroup,如果没有BuffGroup的SubType可以相互替代
BuffGroup记录了可以叠加的SubType组,和叠加的Buff关系
Buff的流程
判定是否Buff能够Attach
=> TFightActor::GetFirstBufBySubType(iSubType) 获取身上该SubType的Buff
=> 比较需要添加的Buff和已经有的Buff的 BuffLevel.如果已经有更强大的则不能添加
Attach Buff流程
=> AttachBufWithCalc(_U2 iBuffId, _U2 iBuffInstanceId, _U2 iPeriod, TActorRecalcContext* pCtx)
=> CalcBufChangeWhenAttachBufById(_U2 iBuffId, U2& iAttachBufId, _U2& iPeriod, _U2& iDetachBufId, _U2& iDetachInstanceId) 该函数会调整最后生成的BuffId, 生存周期 和Detach的BuffId, BuffInstanceId
通过iBuffId的SubType判定该Buff是有BuffGroup还是没有。如果有BuffGroup获取其在组里面的BuffLevel,否则BuffLevel为1
=> CalcBufChangeWhenAttachBufBySubType(_U16 iBufSubType, _U2 iBufId, _U2 iBufLevelInc, _U2& iAttachBufId, _U2& iPeriod, _U2 iDetachBufId, _U2& iDetachInsId)
SubType的替换类别是
a.同Bufid替换
查身上第一个同个Buffid的Buffer,
如果有,
则Detach原来的Attach现在的,
否则只Attach现在的
b.同SubType替换
查身上第一个同SubType的Buffer,
如果有,
则Detach原来的Attach现在的,
否则只attach现在的
c.同SubType同Level替换
查身上第一个同SubType的Buffer,
如果没有,
则直接attach现在的;
如果有,而且新的Buffer BuffLevel更高,
则Detach原来的Attach现在的,
否则无法Attach
d.叠加
查该SubType的BuffGroup,
如果不存在则无法attach
如果存在,则获取当前SubType的Buff的BuffLevel
如果存在,则Detach当前Buff, 计算当前BuffLevel添加Buff的newBuffLevel计算出新的Buff.添加新的Buff
如果不存在,直接Attach当前Buff
e.叠加、对抗
查是否存在该SubType对抗的SubType的Buff
如果不存在,则走叠加的逻辑
如果存在,则Detach对抗的Buff, 把newBuff的new BuffLevel和对抗的BuffLevel相减。Attach剩下的BuffLevel的BuffId
f.时间叠加
如果存在该BuffId则detach原来的,attach新的,但是period时间是新的原来的剩余时间
g.直接添加
不管任何情况,直接添加
=> DetachBuf(_U2 iBuffId, _U2 iBuffInstanceId, TUpdateBufContext* pCtx)
遍历m_listBuff, if(pBuf->m_iId == iBuffId && (iBufInstance == 0 || pBuf->m_iInstanceId == iBufInstanceId)) DetachBuf(TBuff* pBuff, TUpdateBufContext* pCtx)
=>DetachBuf(TBuff* pBuff, TUpdateBufContext* pCtx)
pCtx记录Detach的BuffInstanceId, BuffDesc, DetachBuffCount
如果RawBuff列表在TFight的战斗Process中,删除
=>TFight::RemoveProcessRequeest(TRawBuff* pRawBuff)
把pRawBuff的Process从战斗的m_listProcessReqCtx里面移除,释放Process. RawBuff的内存资源还在哦
=> TFightActor::DetachBufInternal(TBuff* pBuf) Buff释放逻辑,(RawBuff没有内存释放哦)
遍历Buff的RawBuff里面
RawBuff::OnDetach()
从m_listRawBuffList清除RawBuff
从m_listBuffList清除Buff
=> TBuf::DestroyBuf(TBuf* pBuf)
释放Rawbuff内存
释放Buff内存
=> 如果Alive AttachBuf(_U2 iBufId, _U2 iBufInstanceId, _U2 iPeriod, TUpdateBufContext* pCtx)
=> TBuff::CreateBuf(_U2 iBuffId, _U2 iBuffInstanceId)
创建RawBuff对象
创建Buff对象
pBuff->m_iPeriod = iPeriod
pBuff->m_iCurrTime = 0
=>TFightActor::AttachBufInternal(TBuff* pBuf)
把pBuff放入m_listBuff
把pBuff的RawBuff数组放入m_listRawBuff
=>TBuf::OnAttach(TFightActor* pActor)
设置TBuff::m_pActor
设置TRawBuff::m_pActor
pCtx->m_arAttachBuf记录pBuff
=> TFightActor::RecalcPlayerSkillEquipBufProByCtx(TActorRecalcContext* pCtx, TActorRecalcContext* pPetCtx)
计算BuF属性影响
计算属性
校验属性
TickBuff流程
=> TFightActor::Tick
对需要进行Tick的RawBuff进行Tick操作
=>TRawBuff::Tick()
生成对应的客户端通知,跟技能是一样的,就是一个特效ID,还有相关参数,放入队列。
方式队列到客户端播放效果
服务器客户端同步协议
与技能相同的数据,是一个Process数组
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2024-02-10 10:18:15
推荐阅读
留言与评论(共有 20 条评论) |
本站网友 东学 | 9分钟前 发表 |
OnDetach() 从m_listRawBuffList清除RawBuff 从m_listBuffList清除Buff => TBuf | |
本站网友 前列腺炎如何食疗 | 22分钟前 发表 |
本站网友 如何去除痘印 | 14分钟前 发表 |
否则只Attach现在的 b.同SubType替换 查身上第一个同SubType的Buffer, 如果有, 则Detach原来的Attach现在的, 否则只attach现在的 c.同SubType同Level替换 查身上第一个同SubType的Buffer, 如果没有, 则直接attach现在的; 如果有,而且新的Buffer BuffLevel更高, 则Detach原来的Attach现在的, 否则无法Attach d.叠加 查该SubType的BuffGroup, 如果不存在则无法attach 如果存在,则获取当前SubType的Buff的BuffLevel 如果存在,则Detach当前Buff | |
本站网友 6543 | 21分钟前 发表 |
叠加关系 bManualRemove=是否手动移除 ViewOrder=图标顺序> <RawBufInsList> <RawBufInsDesc RawBuffId=产生的RawBuff序列 P1=RawBuff参数 P2=RawBuff参数> </RawBufInsList> </BufDesc> BufGroupDesc.xml <BufGroupDesc GroupId=BuffGroupId | |
本站网友 测算排卵期 | 7分钟前 发表 |
TUpdateBufContext* pCtx) 遍历m_listBuff | |
本站网友 诸暨二手房出售 | 16分钟前 发表 |
_U2 iBuffInstanceId) 创建RawBuff对象 创建Buff对象 pBuff->m_iPeriod = iPeriod pBuff->m_iCurrTime = 0 =>TFightActor | |
本站网友 早餐吃什么减肥 | 1分钟前 发表 |
TUpdateBufContext* pCtx) => TBuff | |
本站网友 招行理财产品 | 30分钟前 发表 |
m_pActor 设置TRawBuff | |
本站网友 企业管理咨询 | 14分钟前 发表 |
_U2 iBufLevelInc | |
本站网友 丰卉家园二手房 | 2分钟前 发表 |
否则只Attach现在的 b.同SubType替换 查身上第一个同SubType的Buffer, 如果有, 则Detach原来的Attach现在的, 否则只attach现在的 c.同SubType同Level替换 查身上第一个同SubType的Buffer, 如果没有, 则直接attach现在的; 如果有,而且新的Buffer BuffLevel更高, 则Detach原来的Attach现在的, 否则无法Attach d.叠加 查该SubType的BuffGroup, 如果不存在则无法attach 如果存在,则获取当前SubType的Buff的BuffLevel 如果存在,则Detach当前Buff | |
本站网友 杭州婚宴 | 23分钟前 发表 |
_U2& iDetachBufId | |
本站网友 平胸女孩 | 10分钟前 发表 |
对抗 查是否存在该SubType对抗的SubType的Buff 如果不存在,则走叠加的逻辑 如果存在,则Detach对抗的Buff | |
本站网友 沙蚤病 | 5分钟前 发表 |
物理类Buf .元素类Buf 4.其他类Buf 5.被动类Buf BufSubType | |
本站网友 山西工商学院怎么样 | 6分钟前 发表 |
TUpdateBufContext* pCtx) => TBuff | |
本站网友 国家电网改革 | 25分钟前 发表 |
方式队列到客户端播放效果 服务器客户端同步协议 与技能相同的数据,是一个Process数组 | |
本站网友 chad | 24分钟前 发表 |
方式队列到客户端播放效果 服务器客户端同步协议 与技能相同的数据,是一个Process数组 | |
本站网友 膨胀 | 5分钟前 发表 |
m_pActor 设置TRawBuff | |
本站网友 4006年 | 0秒前 发表 |
_U2& iPeriod | |
本站网友 斗鸡眼 | 18分钟前 发表 |
_U2& iDetachInsId) SubType的替换类别是 a.同Bufid替换 查身上第一个同个Buffid的Buffer, 如果有, 则Detach原来的Attach现在的 |