游戏生物的抽象

世界唯一对象 AbstractMirObject

构造器

public AbstractMirObject(IMirObjectSoulFill mirObjectSoulFill) {
    setobjectId(mirObjectSoulFill.createId());
}

public interface IMirObjectSoulFill {
    // 生成单位唯一id
    long createId();
}

主要属性

  • 对象唯一id protected long objectId
  • 对象id的包装类型 protected long objId

可见物 AbstractVisibleObject extends AbsreactMirObject

主要属性

  • 配置id int objectkey
  • 观察者列表 KnownList knownList
  • 视野位面 int planes (决定视野可见,等于0表示可被所有位面可见)
  • 位置 WorldPosition position
  • 控制器 AbstractVisibleObjectController controller
  • 可见对象的目标 AbstractVisibleObject target
  • 刷新资源 SpawnResource spawnResource
  • 出生的X轴 bornX
  • 出生的Y轴 bornY
  • 朝向 DirectionEnum bornHeading

  • 该对象的心跳业务 Map<ObjectTickType, objectTick><?> tickMap 主要用于防止取消心跳,统一取消

  • 是否为出生 boolean birth 用于客户端表现出生特效

  • 过滤器 FilterController filterController
  • 人物状态 MergeSubmit<CreatureUpdateType> creatureUpdateTask

构造器

public AbstractVisibleObject(IVisibleObjectSoulFill visibleObjectSoulFill) {
    super(visibleObjectSoulFill);

    this.filterController = new FilterController();
    this.objectKet = visibleObjectSoulFill.getObjKey();
    this.controller = visibleObjectSoulFill.createController(this);
    this.controller.setOwner(this);
    this.position = visibleObjectSoulFill.createPosition();
    this.knownList = visibleObjectSoulFill.createKnownList(this);
    creatureUpdateTask = new MergeSubmit<>(CreatureUpdateType.class);
}


启动一个针对该对象的心跳,使用者要注意定时业务的回收,避免内存泄漏

public <T extends AbstractVisibleObject> ObjectTick<T> createTick(ObjectTickType tickType, long initialDelay, long initialDelay, 
long initialDelay, long period, TimeUnit timeUnit, Tick<T> tick) {

    ObjectTick exits = tickMap.remove(tickType);
    if(exist != null) {
        exist.tryCancle();
        LOGGER.error("exist tick task"+ tickType);
    }
    ObjectTick<T>  objectTick = ObjectTick.valueOf(tickType,(T) this, initialDelay, period, timeUnit);
    tickMap.put(tickType,objectTick)
    return objectTick;
}

添加会合并的延迟任务,同一种CreatureUpdateType类型的任务.在延迟时间内提交过多次也只会执行一次
PS:这里的延迟任务是不保证关服时一定能够执行完成,如果必须是在关服前执行的任务,请在玩家等处或者停服接口处执行
public void addMergeDelayTask(CreatureUpdateType type, int dispatcherCode, String name, int delay, TimeUnit timeUnit, Runnable runnable)


AbstractCreature 生物体,有血有肉的 AbstractCreature extends AbstractVisibleObject

  • 攻击模式
  • 移动控制器
  • 使用中技能
  • 生物血量状态 CreatureLifeStats<?> lifeStats
  • 生物属性管理器 CreatureGameStats gameStats
  • 效果管理器
  • 事件管理器 ObserveController observeController
  • 技能管理器

  • 实际扣血控制器

  • 所有的召唤物,每种类型的召唤物在场上可能有多个,像五条狗这种 Map<SummonType, List<Summon>>

  • 有时效的标记 AgingMark<CreatureAgingMark> agingMark

构造器

public AbstractCreature(ICreatureSoulFill creatureSoulFill) {
    super(creatureSoulFill);

    this.lifeStats  = creatureSoulFill.createLifeStats(this);
    this.lifeStats.init();
    this.moveController = new MoveController(this);
    this.observeController = creatureSoulFill.createObserveController(this);
    this.gameStats = creatureSoulFill.createCreatureGameStats(this);
    this.effectController = creatureSoulFill.createEffectController(this);
    this.skillController = creatureSoulFill.createSkillController(this);
    this.agingMark = new AgingMark();
}

方法

  • 获取单位等级

NPC Npc extends AbstractCreature

  • 路由 RouteRoad
  • AI AbstractAi ai
  • 生成时间 long createTime
  • 抽象仇恨列表 AbstractAggroList aggroList
  • 攻击时间 Map<Long, Long> ontrAttackTime

  • 攻击控制器 NpcAttackController attackController

  • 当前选中的目标 AbstractCreature curTarget

  • 当前目标加入时间 long curTargetJoinTime
    *
    构造器

public NPC(INpcSoulFill npcSoulFill) {
    super(npcSoulFill);

    this.aggroList = npcSoulFill.createAggroList(this);
    this.followPolicy = npcSoulFill.createFollowPolicy(this);
    this.attackControler = ncSoulFill.createAttackController(this);

    createTime = System.currentTimeMillis();
}
  • ObjectResource getObjectResource() 获取NVPC的对象配置
  • ObjectFIghtAttrResource getObjectFightAttrResource()

怪物实体 Monster extends NPC

  • boolean needRefreshAggroList() 判断某些事情发生(仇恨列表中的玩家死亡)后,该怪物是否需要立刻刷新仇恨列表

重写的方法

  • Object createShowInfo(FightPlayer witness) 创建客户端显示用的信息体
  • boolean canGo(int targetX, int targetY) 是否可以到达

NPC攻击控制器

  • 攻击任务 `Future<?> attackTask