本帖最后由 Zeus_2333 于 2019-9-11 12:04 编辑









                                AITool
    为什么写这个:很多开发者对于生物AI,都很感兴趣。但是AI(Pathfinder)这个东西呢,Bukkit并没有提供,只能用到NMS,而NMS对版本极其不友好,于是我为了方便写了这个前置API,为了方便版本兼容,和防止与那些诡异的abcde方法打交道(懒)。


    可以干什么:
    这个插件是个前置API,需要有编程基础的人来操作,不仅可以实现许多原版没有的怪物AI,还提供了一些Bukkit没有提供的怪物操作(跳跃,自定义仇恨表)。
    并且还利用AI写了一个技能施放的AI接口,这里的AI(Pathfinder)实质上是一个计时器,但是比Bukkit提供的高级且性能更好,所以你可以利用这个前置写出令人满意的怪物。超远距离找人,破坏方块,跳着走路等奇葩(强大)怪物,都可以自己来创造

    这个API开源的,随便魔改:https://github.com/za233/AITool/tree/master/src

    API教程:
    1.新建AI
    这个API将Pathfinder重新命名了(AbstractAIItem),这是个基本类,你需要实现

    shouldExecute(),startExecute(),continueExecute(),upDate(),resetAI()方法



    shouldExecute():当AI需要开始执行时的条件
    startExecute():满足条件后开始执行时的代码
    continueExecute():是否继续执行AI,若果是true则执行
    upDate(),否则执行resetAI()
    当你重写完成这三个方法后肯定想将它赋予给生物,这是直接使用AIManager(有四个Manager:AIManager,AttributeManager,ControlManager和NavigationManager),new一个AIManager对象,里面填写LivingEntity,直接使用addAI(或者addTargetAI(这个建议在写设置生物攻击目标AI的时候使用))的方法,即可将AI添加给指定生物了,记得写优先值int(越小越优先(0到2147483647)).。。。。。
    AIManager下还有许多方法,都是字面意思,值得注意的是有两种AI(寻找目标的和普通的)。


    2.内置AI
    当然不完全要你自己来写AI,要是你对这些AI的机制搞不明白的话,可以直接用一些内置的AI,其实就是我直接写的,还在不断扩充中
    这里分为两种.
    第一个是MC原版AI,我直接将原版AI加入进去(实现了几个方法),在AIManager下,返回一个布尔值,反应是否成功加入AI:
        1.boolean addFleeSunAI(double speed,int prop)     这个方法能让生物躲避阳光,speed就是移动速度,prop就是优先级
        2.boolean addMeleeAttackAI(double speed,boolean flag,int prop)     这个方法能让生物可以攻击,包括原版友好怪物,但要设置目标
        3.boolean addOpenDoorAI(boolean flag,int prop)     这个方法能让生物自己开门
        4.boolean addBreakDoorAI(int prop)    这个方法能让生物破坏门
         (未完待续)

    第二个是我自己写的AIItem,你可以去学习一下,这个是AIItem,用AIManager下的addAI或addTargetAI来加入
        1.WatchNearByPlayerAIItem(LivingEntity le,double distance)    le就是目标生物,distance就是距离,这个方法让生物看向附近玩家
        2.ExistTimeAIItem(Entity target,int ticks)    target就是目标生物,ticks就是时间,让生物自行消失
        3.RemoteAttackAIItem(LivingEntity target,IRangedAttackWrapper wrapper,double speed,int attackInterval,int maxAttackTime,float maxAttackDistanceIn)    这个有点复杂,可以让生物实现远程攻击,但是你要先自定义一个IRangeAttackWrapper,这个将会决定生物的攻击方式,speed生物走位速度,attackInterval攻击间隔,maxAttackTime攻击的持续时间,maxAttackDistanceIn就是攻击范围   

        4.
    ActiveCastSkillAIItem    下面进行介绍
        (未完待续)

    3.技能类
    AItem包下面实现了几个AI,其中有个ActiveCastSkillAIItem,就是一个定时施放技能的AI
    你只需要自己写好技能(继承Skill类,实现cast(使用者,攻击目标,伤害)方法),然后利用AIManager.addAIItem(new ActiveCastSkillAIItem(new 你的技能类(),获得技能的生物,施法周期,伤害),0);即可添加技能(比计时器更加高效)


    4.内置生物包装类
    当然,也许你也不想这么复杂,想直接弄个更好用的Entity对象,这里实现了一个MyEnitity的类:MyEntity(EntityType e,Location loc),你只要这样填入两个参数,然后spawnEntity()就ok,这个包装类里面内置有一些我自己写的AI,但是你不用对其直接操作,你可以通过setTargetLocation来控制生物走向什么地方,通过setSpeedToLocation来设置生物走向目标地点的速度,通过setTarget来设置生物攻击目标,setFollowTarget来设置生物的跟随目标,也可以通过getBukkitEntity()来得到Bukkit下的生物实体对象
    这些功能的AIItem(具体实现)放置于com.zeus.pathfinder.AI.AIItem.Special包下



    5.生物行为操作

    要是只有这样那和计时器有什么区别,当然不止.
    之前提到了四个Manager(用法和AIManager一类似),AttributeManager随着Bukkit功能的强化没啥用了。但是还有NavigationManager和ControlManager
    1->NavigationManager:用于寻路
    你主要关注navigationTo方法,这个是设置生物的寻路目标,设置后生物就会自己努力走向目的位置(太远了会达不到)
    而tick方法不需要管,noPath就是返回现在生物是否有寻路目标,stop就是清空生物寻路目标
    2->ControlManager:用于生物身体控制
    doJump就是设置生物跳跃,设置后生物就会跳跃一次,setMoveTo(emmmm)和NavigationManager一样,不要管它,而lookTicks就是设置生物望向哪个地方,推荐在AIItem的upDate或者放到startExecute下使用(由于startExtcute是每tick检验后执行的,效果差不多),因为这个只能设置一瞬间(tick),如果想要时时盯着目标,那么就必须这么做
    例如:
    3->AIManager用于添加AIItem,设置生物仇恨值或者获得一些属性
    killXXAI方法是用于删除AI或者TargetAI(仇恨AI)
    setGoalTarget设置生物攻击的目标(设置为Null停止攻击),getGoalTarget获得此时生物攻击目标,若不存在就是Null
    getLastDamageTicks获取生物上次收到攻击的距离现在的时间(单位是tick,20tick是一秒)


    若果不知道Pathfinder的机制是什么的,这里有教程
    https://www.mcbbs.net/forum.php?mod=viewthread&tid=775757
    你可以自己写,但是版本兼容和混淆后的方法真的让人爆炸


    更新日志:
    ---->2019-8-31:
            -->实现了一些原版的AI,在AIManager下可发现一些新增方法
            -->实现了远程攻击的AI(RemoteAttackAIItem),通过自定义IRangedAttackWrapper里的方法实现自定义攻击手段
            -->修正了NavigationManager下误导性的方法名
            -->自定义了一系列AI(ExistTimeAIItem,ProtectPlayerAIItem,WatchNearByPlayerAIItem)
            -->更新了PaintLib,更加方便的进行技能绘制,创造自己的怪物(教程即将完成)




    API下载:

    AITool_For_1.14.4.jar (214.61 KB, 下载次数: 238)




[groupid=1511]Server CT[/groupid]