本帖最后由 君の名 于 2021-8-31 02:15 编辑
请原谅我问这么多问题
,我想让我的怪物能够过一段时间就能造成范围伤害,有没有什么范围伤害的方法,或者说有什么类似范围伤害的效果吗。
请原谅我问这么多问题
本帖最后由 Dasffafa 于 2021-8-29 19:14 编辑
为你的实体添加一个AI,这个你大概没啥问题(有问题请继续问);
我着重说下范围伤害
使用复制代码之后遍历所得列表(需要你检测类型是否为LivingEntity)。
使用AxisAlignedBB,需要你自己读一下文档,不过我相信你能看懂。
为你的实体添加一个AI,这个你大概没啥问题(有问题请继续问);
我着重说下范围伤害
使用
- world.getEntitiesWithinAABB()
使用AxisAlignedBB,需要你自己读一下文档,不过我相信你能看懂。
Dasffafa 发表于 2021-8-29 19:11
为你的实体添加一个AI,这个你大概没啥问题(有问题请继续问);
我着重说下范围伤害
使用之后遍历所得列表 ...
说实话有点懵,能不能给个示例。
君の名 发表于 2021-8-29 19:39
说实话有点懵,能不能给个示例。另外,每隔一段时间触发怎么搞
https://www.mcbbs.net/thread-1255607-1-1.html
你其实问过一个类似的问题。
本帖最后由 Dasffafa 于 2021-8-30 11:28 编辑
你这,给你个示例不就是说让我替你写了嘛
我不写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哥的条理,但是他的很多做法值得模仿。
君の名 发表于 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 编辑
话说我这样写没问题吧,但是刚开始的时候还能触发,我编写了几个新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
}
}
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 编辑
我现在试了一下,我把ticksExisted写在updateTask里就可以触发,就是时间不准确会有延迟,但写在shouldExecute里就无法触发,真是见鬼
Dasffafa 发表于 2021-8-30 11:25
你这,给你个示例不就是说让我替你写了嘛
我不写1.12.2,只能给你思路
创建一个AI(直接作为实体的内部类 ...
我现在试了一下,我把ticksExisted写在updateTask里就可以触发,就是时间不准确会有延迟,但写在shouldExecute里就无法触发,真是见鬼
本帖最后由 Dasffafa 于 2021-8-31 11:55 编辑
1.能运行就行了呗
2.至于不行的原因,我估计是你漏覆盖了几个方法,参照原版生物的类似AI,看看自己有什么不一样的地方(可选)
看你的代码,获得坐标应该可以用Entity#getPos()方法,不用你新建BlockPos,而且updateTask应该不是你需要的方法,再看看原版
3.请善用编辑功能,不要多次占楼霸屏(我就因为回答别人问题的时候占了三楼,被扣了20金粒,净收益负数,哭)
君の名 发表于 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好像是球状范围的,我想要个半球的
君の名 发表于 2021-9-3 23:35
对了,如何获取某实体面前的所有实体,getEntitiesWithinAABB好像是球状范围的,我想要个半球的 ...
自己想办法。getEntitiesWithinAABB 是个长方体范围。