干就完了
本帖最后由 干就完了 于 2021-8-8 10:35 编辑

        这个问题使用的工作环境是1.16.5 Forge 36.2.0,Windows10,Java16.0.2。



        我想设置一个物品,这个物品实现以下的功能:
                右键物品,将会释放4支箭,然后这4支箭分别朝向【东,南,西,北】四个方向发射。然后在落地的一瞬间爆炸。然后物品开始冷却。


        那么我这里已经将上面的绝大部分都实现了,但是还有个问题,当我右键这个物品的时候,物品射出去的箭并不是朝着我理想的方向射出去的,我设置了一些参数,就在BlastFungusItem.java这个类里面的shoot方法体,现在我有一个问题,如何让箭矢朝着玩家的四周发射箭??


有谁能帮我解决这个问题不??下面是我的部分工作空间


BlastFungusEntity.java

https://paste.ubuntu.com/p/BSVZ7XRcHc/


BlastFungusItem.java
https://paste.ubuntu.com/p/wbDbdrXFhK/


只用说说怎样设置那个shoot方法体即可。。。









xinhanyyds
关于这我就不知道了

南柯郡守
什么叫做 不是理想方向

可以尝试设置坐标中的朝向来设定箭头朝向,然后加个向量让他飞出去?

(不是很懂forge 只是一个不成熟的思路

干就完了
本帖最后由 干就完了 于 2021-8-6 12:58 编辑

意思嘛,大概就是箭矢只会朝着面朝方向射出,不会朝着左右射出……飞出去的话,是已经飞出去了,能飞,就是方向不对。。。

Dasffafa
本帖最后由 Dasffafa 于 2021-8-7 23:23 编辑

警告你一下,你的mappings版本可能不对,我的1.16.5Forge,方法名不是这些。
请务必注意这一条!请把build.gradle发上来。
我发现之前的方法不是最方便的,yaw本身就是角度制,可以直接操作见我之后的回答。

建议封装一个函数。下面轻光233说了这个问题。



干就完了
本帖最后由 干就完了 于 2021-8-7 00:08 编辑

我大概懂你的意思……

干就完了
Dasffafa 发表于 2021-8-6 23:34
警告你一下,你的mappings版本可能不对,我的1.16.5Forge,方法名不是这些。
请务必注意这一条!请把build. ...

这是我的build.gradle,有一部分注释没有删除,行,我用的【official】译名,如果你让我换回原来的【snapshot】,我已经写了这么多,换回去不妥吧……

能说的详细点不,思路可还行,就是不知道在MC中的类的方法是什么……光说个向量偏转,我不太懂……谢谢你的回答!!!

https://paste.ubuntu.com/p/YKvm594NWr/

梦魄玖璃
233333333333333333

轻光233
本帖最后由 轻光233 于 2021-8-7 15:23 编辑
干就完了 发表于 2021-8-7 00:08
这是我的build.gradle,有一部分注释没有删除,行,我用的【official】译名,如果你让我换回原来的【snap ...

我这里的forge库提供的名称和你的差别巨大,只能从你给的代码的方法名来猜
首先,你可以把shoot方法只留下一个,也就是这样
  1. public void shootNorth(World world, LivingEntity entity,double x,double y) {
  2.         BlastFungusEntity entityb = new BlastFungusEntity(entity, world);
  3.         entityb.shoot(x,y,0, 15, 1);
  4.         entityb.setSilent(true);
  5.         entityb.setCritArrow(true);
  6.         entityb.setBaseDamage(8);
  7.         entityb.setKnockback(2);
  8.         world.addFreshEntity(entityb);
  9.         world.playSound(null, entity.getX(), entity.getY(), entity.getZ(), SoundEvents.ARROW_SHOOT, SoundCategory.PLAYERS, 1, 1f / (random.nextFloat() * 0.5f + 1) + (2));
  10. }
复制代码

之后再写一个shootAround方法
  1. public void shootAround(World world, LivingEntity entity) {
  2.         double x = entity.getLookAngle().x;
  3.         double y = entity.getLookAngle().y;
  4.         double buf = 0;
  5.         shoot(world,entity,x,y);
  6.         buf = -y;
  7.         y = x;
  8.         x = buf;
  9.         shoot(world,entity,x,y);
  10.         buf = -y;
  11.         y = x;
  12.         x = buf;
  13.         shoot(world,entity,x,y);
  14.         buf = -y;
  15.         y = x;
  16.         x = buf;
  17.         shoot(world,entity,x,y);
  18.     }
复制代码
再把onUsingTick里面那一坨shoot换成这个shootAround就可以了
这样的转动用虚数表示更加形象,不过这样也可以,反正没区别
and,你这个类库是哪来的东西。。。名字全不一样
如果Vec3d这名字都不对,你就自己纠正吧

Dasffafa
干就完了 发表于 2021-8-7 00:08
这是我的build.gradle,有一部分注释没有删除,行,我用的【official】译名,如果你让我换回原来的【snap ...

想象你的眼睛看的方向,当你左右摇头的时候,你的脑袋的Yaw值就会改变,当你上下点头的时候,Pitch值就会改变。

Dasffafa
projectile.func_234612_a_(
                caster, caster.rotationPitch, caster.rotationYaw+90, 0.0F, 0.3f, 0.5F);这就是向右偏转90
projectile.func_234612_a_(
                caster, caster.rotationPitch, caster.rotationYaw-90, 0.0F, 0.3f, 0.5F);这就是向左偏转90
projectile.func_234612_a_(
                caster, caster.rotationPitch, caster.rotationYaw-180, 0.0F, 0.3f, 0.5F);这就是向后偏转

Dasffafa
非常建议你使用snapshot。否则你阅读别人的源码或者查看别人的解答,都会遇到问题。

干就完了
轻光233 发表于 2021-8-7 15:09
我这里的forge库提供的名称和你的差别巨大,只能从你给的代码的方法名来猜
首先,你可以把shoot方法只留下 ...

不行不行,这样的话我的物品射出去的角度就在我的正脚下。。
我在想是不是shoot方法体里面的那个0.0F误导了我……

这样,今天白天我试试用snapshot发代码过来,再尝试解决一下吧……

非常感谢各路大神的指导!感谢!

干就完了
Dasffafa 发表于 2021-8-7 23:19
projectile.func_234612_a_(
                caster, caster.rotationPitch, caster.rotationYaw+90, 0.0F ...

我理解了,用了snapshot的mapping方法,终于成功了!非常感谢你!
此问题已解决,非常感谢!!!
BlastFungusItem.java
https://paste.ubuntu.com/p/MDcQjdjbVN/

贺兰兰
(提醒一下,不建议 1.17 以下版本使用 JDK 16)

洞穴夜莺
贺兰兰 发表于 2021-8-8 12:00
(提醒一下,不建议 1.17 以下版本使用 JDK 16)

但是,只要他的targetCompatibility设置为1.8,那么,无论他用那个版本的JDK写的Mod,都可以运行于Java 8上

ゞ夕阳ミ天变
感觉弓箭射出去还是挺真实的

第一页 上一页 下一页 最后一页