Cuki
比如玩家射出了一支箭 或者 发射了一枚火球
然后距离超出了他周围已加载的区块 这时候这个发射物依然会被储存下来

翻了下1.12.2的doc 没有看到监听实体的移动方法

所以 有什么好的方法可以实现 在一枚发射物射出一段距离后 他周围没有玩家 就把这个发射物给清掉



1448848683
本帖最后由 1448848683 于 2021-5-20 09:26 编辑

可以试试给发射物设置一个生命周期,例如2400刻,发射物生成时间超过这个刻了就删除,要不就用world.getEntitiesWithinAABB,但谨慎使用,这方法有点废性能。
至于怎么调用,你可以试试实体刻。

南柯郡守
大体思路:
    1. 对实体进行标记
    2. 在区块加载时判断该区块上是否有需要移除的实体
    3. 移除

Cuki
1448848683 发表于 2021-5-21 01:18
可以试试给发射物设置一个生命周期,例如2400刻,发射物生成时间超过这个刻了就删除,要不就用world.getEnt ...

我尝试过创建一个task来删掉这个发射物,但是在这个发射物进入未加载的区块时,他会直接被保存下来。
而这个task就算到了时间,这个生物已经被标记为dead了。
等区块被加载的时候,这个发射物会依然存在

Cuki
南柯郡守 发表于 2021-5-21 08:41
大体思路:
    1. 对实体进行标记
    2. 在区块加载时判断该区块上是否有需要移除的实体

现在我用的是这个方法。
但除此之外是不是就没其他更合理的方法来处理发射物了。

1448848683
本帖最后由 1448848683 于 2021-5-20 22:49 编辑
Cuki 发表于 2021-5-20 22:10
我尝试过创建一个task来删掉这个发射物,但是在这个发射物进入未加载的区块时,他会直接被保存下来。
而 ...

没办法,mc的机制就是这样,但关于你的需求我其实有个小建议,你根据发射物的速度和时间去计算距离玩家的距离,根据这个推算出需要多少刻移除发射物,然后在其tick的方法里去每次减少1,<=0时移除自身,会比计算距离更好一些
你要是需要更合理的移除的话,1.16的Entity类有个名为writeUnlessPassenger和isAlive的方法,不知道1.12有没有,你可以试着复写一下,或许可以用来在生物进入未加载区块的时候把生物删了。

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