消耗系统学习笔记


配置

  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)

条件选择器学习笔记

chooser作为条件选择器。可以抽象出一些统一的

条件系统学习笔记


概况

条件系统是为了方便于各个系统进行条件判断的,在条件复杂的情况下很好用。


配置资源

  1. 配置文件: resource/ConditionResource.xlsx

领域模型与接口

所有具体的条件实现类都实现了ICondition<Obj>接口或者继承了实现了该接口的基类。

条件接口

public interface ICondition<Obj> {

    // 获取条件
    ConditionType getType();

    // 带有resource参数的init方法。方便以后子拓展新的字段
    void init(ConditionResource resource);

    // 验证条件是否满足
    Result verify(Obj obj, int amount, Map<object, Object> param)

}

玩家条件基类 BasePubCondition

    public abstract class BasePubCondition implements ICondition<Object> {
        @Verride
        public final Result verify(Object t, int amount, Map<Object,Objct> param) {
            return verify(amount, param);
        }
    }
    // 验证条件是否满足
    public abstract Result verify(int amount, Map<Object, Object>);

公共条件组 PubConditions

  • Result verify(int amount, Map<Object, Object> param) 验证条件是否满足,所有条件
  • void verifyOrFailException(int amount, Map<object, Object>) param 验证条件,如果验证失败,则抛出异常
  • boolean verifyOr(int amount, Map<Object, Object>) param 验证条件是否满足,只要有一个条件满足,就算成功

条件类型定义 ConditionType


public enum ConditionType {
    // 必然失败条件
    FAIL(FailCondition.class),
    //开服天数
    OPEN_DAY(OpenDayCondition.class),
    //开关类条件
    ON_OFF(ONOffCondition.class),
    //开关类条件
    ITEM_RANGE(TimeRangeCodition.class),
    //日期条件
    DAY_RANGE(DayRangeCondition.class),
...

    private Class<? extends ICondition<?>> conditionClass;
    // 构造方法
    ConditionType(Class<? extends ICondition<?> conditionClass) {
        this.conditionClass = conditionClass;
    }

    // 创建一个没有初始化的条件
    public <T extends ICondition> T create() {
        try {
            return (T) conditionClass.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);        }
    }

    // 根据配置创建条件
    public <T extends ICondition> T create(ConditionResource resouece) {
        T condition = create();
        condition.init(resource);
        retrun condition;
    }

}


  • <T extends ICondition> T created() 创建一个没有初始化的条件
  • T extends ICondition> T create(ConditionResource resource) 根据配置创建条

验证结果 Result

每一个result都具有唯一性,不可变性


条件管理 ConditionManager

  • <Obj> Conditions<Obj> create(ConditionResource resource) 创建单个条件的组,如果传入的条件组为null,返回一个无条件的空
  • <Obj> Condition<Obj> create(List<ConditionResource> resources, boolean isDefaultSuccess) 创建多个条件的组,如果传入的条件组为null,返回一个无条件的空。
  • <Obj> ConditionOrAnd createOrAnd(ConditionOrAndResource orAndResource) 创建支持与(&&)或(||)检测的条件组

条件系统的使用

  1. 创建ICondition<Obj>实现类
    编写ICondition<Obj>的实现类,重写验证条件的方法。

         ConditionType getType();
    
         void init(ConditionResource resource);
    
         Result verify(Obj objm int amount, Map<Object, Object> param);
    
    
  2. 编写ConditionType枚举类

    通过构造参数绑定条件相关的ICondition<Obj>实现类。

     // 玩家等级条件枚举
     PLAYER_LEVLE(PlayerLevelCondition.class)
    
    
  3. excel配置条件
    excel配置条件会转化ConditionResource对象。可以在某模块的配置中以json格式的方式配置条件。

    json配置格式在Excel中的例子:[{key:1, type:"PLAYER_LEVLE"}]
    在配置类中:

         private List<ConditionResource> useConditions;
         private transient Conditions<Player> useCondition;
    

    ConditionResource.xlsx配置的条件通过ConditionManager使用(目前还没有提供使用方法)

    ConditionResource.xlsx中配置

         @Static
         private Storage<String,ConditionResource> conditionResource;
    
  4. 使用检验

     // createConditions方法传入的是一个List<ConditionResource>,需要配置在xlxs文件中。根据ConditionType调用create方法创建一个AbstractCondition实现类。
    
     Conditions conditions  = Conditions.valueOf(channelResource.getSendConditions());
    
     // 调用conditions的verify方法逐个AbstractCondition实现类的verify
     Result result = conditions.verify(player,1);
     if(!result.isSuccess()) {
         throw ManagedException.valueOf(result.getCode())
     }