Опять projectile шалит

Версия Minecraft
1.19.2
API
Forge
11
1
0
Сейчас новая проблема. В прошлый раз я спрашивал, как я могу запустить снаряд при помощи предмета. Я немного посидел, вот, что вышло:
Java:
    @Override
    public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) {
        RedstoneWaveEntity entity = new RedstoneWaveEntity(world, player, 0, 0, 0);
        if (!world.isClientSide) {
            entity.shootFromRotation(player, player.getXRot(), player.getYRot(), 0, 2, 0);
            world.addFreshEntity(entity);
            player.getCooldowns().addCooldown(this, 30);
        }
        return super.use(world, player, hand);
    }
И, вроде бы, всё хорошо, но есть одно НО. Оно запускает снаряд из ног, снаряд сталкивается с блоком и уничтожается. Я думал, что вот этот нолик
Java:
player.getYRot(), 0 /*<- Да, этот*/, 2, 0;
отвечает за позицию z, но нифига подобного. Суть вопроса в том, что я должен сделать, чтобы снаряд вылетал оттуда, откуда мне надо, а не из ног?
 
Решение
Ага, а этот AbstractHurtingProjectile берёт координаты игрока

Ну можешь второй конструктор поменять типа вот так, только getX/getY/getZ/getEyeHeight() могут по-другому называться, у нас маппинги разные
Java:
    public RedstoneWaveEntity(Level world, LivingEntity entity, double dx, double dy, double dz) {
        super(ModEntities.RWE.get(), entity, entity.getX(), entity.getY() + entity.getEyeHeight(), entity.getZ(), dx, dy, dz, world);
    }
445
42
117
отвечает за позицию z, но нифига подобного. Суть вопроса в том, что я должен сделать, чтобы снаряд вылетал оттуда, откуда мне надо, а не из ног?
Тебе просто нужно заспавнить свой снаряд на 1.6 блока выше по оси Y, и будет вылетать из головы
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
11
1
0
Я вроде бы решил проблему, разобравшись, что делает тот первый ноль, но всё равно не понял, что надо делать, чтобы из головы вылетало. Короче, принял решение сделать так, чтобы снаряд не уничтожался, когда хитбокс касается блока. Это было лучшее решение. Но, спасибо огромное за то, что попытались помочь!)
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
хз, я таки пошёл посмотрел на этот ваш shootFromRotation, он позицию энтити вообще не сеттит

так что неизвестно что у тебя в new RedstoneWaveEntity(world, player, 0, 0, 0) происходит, предположительно там позиция берётся игрока, вот в том месте к позиции и добавь высоту к Y ещё
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Так покажи что конкретно ты пытался сделать
Вообще в идеале весь этот RedstoneWaveEntity, но мне нужен хотя-бы конструктор
 
11
1
0
Java:
public class RedstoneWaveEntity extends AbstractHurtingProjectile {

    public RedstoneWaveEntity(EntityType<RedstoneWaveEntity> type, Level world) {
        super(type, world);
    }

    public RedstoneWaveEntity(Level world, LivingEntity entity, double x, double y, double z) {
        super(ModEntities.RWE.get(), entity, x, y, z, world);
    }

    @Override
    protected void onHitEntity(EntityHitResult hitResult) {
        super.onHitEntity(hitResult);
        Entity entity = this.getOwner();
        if (entity instanceof LivingEntity) {
            hitResult.getEntity().hurt(DamageSource.indirectMagic(this, entity).setProjectile(), 8.0f);
        }
        if (!level.isClientSide && (!noPhysics || hitResult.getType() != HitResult.Type.ENTITY)) remove(RemovalReason.KILLED);
    }

    @Override
    protected void onHit(HitResult result) {
        super.onHit(result);
    }

    @Override
    protected float getInertia() {
        return 1;
    }

    @Override
    public boolean hurt(DamageSource damageSource, float p_36840_) {
        return false;
    }

    @Override
    public boolean isOnFire() {
        return false;
    }

    @Override
    public boolean isPickable() {
        return false;
    }

    @Override
    protected boolean shouldBurn() {
        return false;
    }

    @Override
    protected void defineSynchedData() {}

    @Override
    public Packet<?> getAddEntityPacket() {
        return NetworkHooks.getEntitySpawningPacket(this);
    }
}
Вот он весь
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ага, а этот AbstractHurtingProjectile берёт координаты игрока

Ну можешь второй конструктор поменять типа вот так, только getX/getY/getZ/getEyeHeight() могут по-другому называться, у нас маппинги разные
Java:
    public RedstoneWaveEntity(Level world, LivingEntity entity, double dx, double dy, double dz) {
        super(ModEntities.RWE.get(), entity, entity.getX(), entity.getY() + entity.getEyeHeight(), entity.getZ(), dx, dy, dz, world);
    }
 
11
1
0
Не работает. Я посмотрел, в других модах в основном используют AbstractArrowEntity. И это ГОРАЗДО удобней. Буду использовать его, как раз гайд нашёл.
А этот снаряд пусть остаётся, но только будет проходить сквозь блоки и умирать в воде. Как-то так.
1682212082_papik-pro-p-stiker-i-tak-soidet-vektor-8.jpg


Спасибо огромное за помощь!
 
Сверху