君の名
本帖最后由 君の名 于 2021-8-31 02:15 编辑

请原谅我问这么多问题,我想让我的怪物能够过一段时间就能造成范围伤害,有没有什么范围伤害的方法,或者说有什么类似范围伤害的效果吗。

Dasffafa
本帖最后由 Dasffafa 于 2021-8-29 19:14 编辑

为你的实体添加一个AI,这个你大概没啥问题(有问题请继续问);
我着重说下范围伤害
使用
  1. world.getEntitiesWithinAABB()
复制代码
之后遍历所得列表(需要你检测类型是否为LivingEntity)。
使用AxisAlignedBB,需要你自己读一下文档,不过我相信你能看懂。




君の名
Dasffafa 发表于 2021-8-29 19:11
为你的实体添加一个AI,这个你大概没啥问题(有问题请继续问);
我着重说下范围伤害
使用之后遍历所得列表 ...

说实话有点懵,能不能给个示例。另外,每隔一段时间触发怎么搞

3TUSK
君の名 发表于 2021-8-29 19:39
说实话有点懵,能不能给个示例。另外,每隔一段时间触发怎么搞

https://www.mcbbs.net/thread-1255607-1-1.html
你其实问过一个类似的问题。

Dasffafa
本帖最后由 Dasffafa 于 2021-8-30 11:28 编辑
君の名 发表于 2021-8-29 19:39
说实话有点懵,能不能给个示例。另外,每隔一段时间触发怎么搞

你这,给你个示例不就是说让我替你写了嘛
我不写1.12.2,只能给你思路
创建一个AI(直接作为实体的内部类即可)
复写canExecute,条件是this.entity.ticksExisted % 你的冷却时间(ticks)==0
复写startExecuting,创建一个AxisAlignedBB,坐标是自己的坐标,使用grow(你的范围)方法,将其扩大
如果你还是不明白怎么用这个类,请 你 读 Javadoc 或 者  看 代 码 里 的 注 释再不行,抄植物魔法的娇媚之刺。
之后利用world.getEntitiesWithinAABB,获得生物,如果 instanceof LivingEntity就造成伤害。
给实体添加AI。Done!

3T说你问过类似问题,那是基于直接在tick()方法里面实现的思路
(直接在tick方法里面检测ticksExisted%冷却时间)
不过,我觉得还是写个AI比较标准。

请你多读原版代码和优质模组代码,尤其植物魔法。
我们也许做不到V姐……不对,V哥的条理,但是他的很多做法值得模仿。




君の名
Dasffafa 发表于 2021-8-30 11:25
你这,给你个示例不就是说让我替你写了嘛
我不写1.12.2,只能给你思路
创建一个AI(直接作为实体的内部类 ...

感谢大佬,我已经实现了。

君の名
本帖最后由 君の名 于 2021-8-31 05:38 编辑
Dasffafa 发表于 2021-8-30 11:25
你这,给你个示例不就是说让我替你写了嘛
我不写1.12.2,只能给你思路
创建一个AI(直接作为实体的内部类 ...

话说我这样写没问题吧,但是刚开始的时候还能触发,我编写了几个新AI之后又不行了,用历史记录恢复原来的代码还是不行,动画能触发,AI触发不了。该不会是bug吧。
private static class AISkill extends EntityAIBase
    {
        private final Frost entity;
        private AISkill(Frost entity) {
            this.entity = entity;
        }

        @Override
        public void updateTask()
        {
            BlockPos blockPos = new BlockPos(this.entity.posX, this.entity.posY , this.entity.posZ);
            AxisAlignedBB axisalignedbb = new AxisAlignedBB(blockPos).grow(10);
            for (Entity entity:this.entity.world.getEntitiesWithinAABB(Entity.class,axisalignedbb))
            {
                if(entity instanceof EntityLivingBase)
                {
                    entity.attackEntityFrom(Damagecause.causeFrostDamage(entity, null), 20);
                    ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(PotionRegistryHandler.POTION_FROST, 120, 1));
                }
            }
        }

        @Override
        public boolean shouldExecute()
        {
            return this.entity.ticksExisted % 360 == 0
        }
    }

君の名
本帖最后由 君の名 于 2021-8-31 10:39 编辑
Dasffafa 发表于 2021-8-30 11:25
你这,给你个示例不就是说让我替你写了嘛
我不写1.12.2,只能给你思路
创建一个AI(直接作为实体的内部类 ...

我现在试了一下,我把ticksExisted写在updateTask里就可以触发,就是时间不准确会有延迟,但写在shouldExecute里就无法触发,真是见鬼

Dasffafa
本帖最后由 Dasffafa 于 2021-8-31 11:55 编辑
君の名 发表于 2021-8-31 10:29
我现在试了一下,我把ticksExisted写在updateTask里就可以触发,就是时间不准确会有延迟,但写在shouldExe ...

1.能运行就行了呗
2.至于不行的原因,我估计是你漏覆盖了几个方法,参照原版生物的类似AI,看看自己有什么不一样的地方(可选)
看你的代码,获得坐标应该可以用Entity#getPos()方法,不用你新建BlockPos,而且updateTask应该不是你需要的方法,再看看原版
3.请善用编辑功能,不要多次占楼霸屏(我就因为回答别人问题的时候占了三楼,被扣了20金粒,净收益负数,哭)


君の名
Dasffafa 发表于 2021-8-31 11:46
1.能运行就行了呗
2.至于不行的原因,我估计是你漏覆盖了几个方法,参照原版生物的类似AI,看看自己有什么 ...

对了,如何获取某实体面前的所有实体,getEntitiesWithinAABB好像是球状范围的,我想要个半球的

3TUSK
君の名 发表于 2021-9-3 23:35
对了,如何获取某实体面前的所有实体,getEntitiesWithinAABB好像是球状范围的,我想要个半球的 ...

自己想办法。getEntitiesWithinAABB 是个长方体范围。