消耗系统学习笔记


配置

  1. 配置文件: resource/ConsumeResource.xlsx
  2. 配置实体类 ConsumeResource
    • 配置主键 key
    • 配置类型 ConsumeType type
    • 分级参数,从0开始 step
    • 分级类型,根据玩家可获取当前分级 StepType stepType
    • 根据唯一id消耗(用于道具) long objId
    • 背包列表类型列表 List<PackType> packTyps
    • 消耗id String code
    • 消耗值 long value

领域模型

消费对象 AbstractConsume<Obj>

  • Result verify(Obj obj, long multiple) 校验资源是否足够
  • abstract void consume(Obj obj,ModuleInfo mouduleInfo, long multiple) 消耗资源
  • abstract ConsumeType getType() 获取消费类型
  • final AbstractConsume<Obj> merge(AbstractConsume<Obj> consume) 合并

消耗对象会继承该类并getType()consume(...)方法。

消耗消息封装 消耗组 Consumes<Obj>

  • verity(Obj obj, int int account) 检测消耗条件是否满足
  • void act(Obj obj, ModuleInfo moduleInfo, int amount) 消耗
  • void actOrFailException(Obj obj, ModuleInfo moduleInfo, int amount) 检测消耗条件并执行消耗

分级消耗 StepConsumes<Obj>

采用TreeMap的结构储存,key为下限,value为消耗组

  • addConsume(int step, Consume<Obj> consumes) 添加分级消耗
  • Consumes<Obj> getConsumes 获取该级的消耗,使用

消耗类型 ConsumeType

  • HP 耗血
  • MP 耗蓝
  • ITEM 消耗物品
  • CURRENCY 消耗货币
  • EFFECT 消耗一个被动效果
  • ENERGY_EXP 消耗内功经验
  • GANG_FUNDS 消耗公会资金
  • GOD_MIGHT 神威值
  • TREASURE_SCORE 探宝积分
  • JING_JIE_SCORE 消耗境界点
  • STOVE_SCORE 消耗公会积分
  • GANG_CONTRIBUTIONS 消耗公会贡献
  • TRANSFER_ITEM 消耗跨服物品

类型枚举ConsumeType拥有抽象方法abstract <T extends AbstractConsume> create(ConsumeResource resource)

消费管理器 ConsumeManager

  • Consumes getResource(ConsumeKey key) 获取配置表的消耗
  • <Obj> Consumes<Obj> createConsumes(List<ConsumeResource> resources) 创建消耗组
  • <Obj> StepConsumes<Obj> createStepConsumes(List<ConsumeResource> resource) 创建分级消耗,需要保证ConsumeResource#step不冲突

如何使用消耗

  1. 如何要玩法需要的消耗是新的,要在ConsumeType内定义消耗类型并重写create(...)方法
  2. 获取消耗的配置对象
  3. 通过配置对象创建消耗消息组
  4. 检测消耗组条件是否满足
  5. 执行消耗
    XxxResource> XxxResource = XxxManager.getXxxResource();

    Consume<Player> consumes = XxxResource.getConsumes();

    Result result = consumes.verify(player,1);
    if(!result.isSuccess()) {
        throw ManagedException.valueOf(result.getCode())
    }

    consumes.actOrFailException(palyer,ModuleInfo.valueOf(ModuleType.Xxx,SubModuleType.Xxxx),1)