zoukankan      html  css  js  c++  java
  • Buff系统框架设计

    Buff的配置文件


    BufType: 1: 精神类Buf 2: 物理类Buf 3.元素类Buf 4.其他类Buf 5.被动类Buf
    BufSubType: 1000-1999 精神子类 2000-2999.物理子类 3000-3999.元素子类 4000-4999.其他子类 5000-5999.被动子类。所以子类可以唯一标识一个Buff的类别 
    OppGroupId: 表明该GroupBuff互斥的BuffGroup.玩家身上只可能两种BuffSubType存在一种

    RawBufDesc.xml
    <RawBufDesc RawBuffId="RawBuff的ID" bProBaseDerivedWXImp="是否有基础参数" bCalcImp="是否影响公式计算" bEquipImp="是否影响装备限制计算" bNeedTick="是否需要被Tick"></RawBufDesc>


    BufDesc.xml
    <BufDesc BuffId="Buf的Id" Name="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)" Name="Buff组名">
    <buf bufId="" level=""></buf>
    <buf ...></buf>
    </BufGroupDesc>

    PropertiesDesc.xml 记录了所有游戏使用的属性内容,已经其对应的宏
    <PropertiesDesc ProId="属性ID" name="宏参数" displayerName="" 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(_U32 iBuffId, _U32 iBuffInstanceId, _U32 iPeriod, TActorRecalcContext* pCtx)
    => CalcBufChangeWhenAttachBufById(_U32 iBuffId, U32& iAttachBufId, _U32& iPeriod, _U32& iDetachBufId, _U32& iDetachInstanceId) 该函数会调整最后生成的BuffId, 生存周期 和Detach的BuffId, BuffInstanceId

    通过iBuffId的SubType判定该Buff是有BuffGroup还是没有。如果有BuffGroup获取其在组里面的BuffLevel,否则BuffLevel为1

    => CalcBufChangeWhenAttachBufBySubType(_U16 iBufSubType, _U32 iBufId, _U32 iBufLevelInc, _U32& iAttachBufId, _U32& iPeriod, _U32 iDetachBufId, _U32& 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(_U32 iBuffId, _U32 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(_U32 iBufId, _U32 iBufInstanceId, _U32 iPeriod, TUpdateBufContext* pCtx)
    => TBuff::CreateBuf(_U32 iBuffId, _U32 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数组
     
  • 相关阅读:
    Linux系统中日志级别详情
    android测试和iOS测试的区别
    React Router的Route的使用
    React中this.props的主要属性
    2019 年 React 学习路线图(转)
    Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean (default-clean) on project
    Maven笔记
    优化Android Studio/Gradle构建(转)
    Java相关查询记录
    自己电脑组一个Wifi热点
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/7029420.html
Copyright © 2011-2022 走看看