NaturesAura/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java

107 lines
4.9 KiB
Java
Raw Normal View History

2019-03-12 19:34:59 +01:00
package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
2021-12-04 15:40:09 +01:00
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityProjectileGenerator;
2021-12-19 15:32:45 +01:00
import de.ellpeck.naturesaura.blocks.tiles.ModBlockEntities;
2020-01-23 19:20:47 +01:00
import de.ellpeck.naturesaura.blocks.tiles.render.RenderProjectileGenerator;
2020-01-29 01:34:58 +01:00
import de.ellpeck.naturesaura.data.BlockStateGenerator;
2020-01-22 23:21:52 +01:00
import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles;
2020-01-29 01:34:58 +01:00
import de.ellpeck.naturesaura.reg.ICustomBlockState;
2020-01-23 19:20:47 +01:00
import de.ellpeck.naturesaura.reg.ITESRProvider;
2021-12-15 16:24:53 +01:00
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import net.minecraft.core.Position;
import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.entity.projectile.ThrownEnderpearl;
import net.minecraft.world.entity.projectile.ThrownTrident;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.phys.BlockHitResult;
2019-03-12 19:34:59 +01:00
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.ProjectileImpactEvent;
2019-10-20 22:30:49 +02:00
import net.minecraftforge.eventbus.api.SubscribeEvent;
2021-12-15 16:24:53 +01:00
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
2020-01-28 18:08:56 +01:00
2021-12-04 15:40:09 +01:00
public class BlockProjectileGenerator extends BlockContainerImpl implements ITESRProvider<BlockEntityProjectileGenerator>, ICustomBlockState {
2019-03-12 19:34:59 +01:00
public BlockProjectileGenerator() {
2023-07-08 12:32:27 +02:00
super("projectile_generator", BlockEntityProjectileGenerator.class, Properties.of().strength(2.5F).sound(SoundType.STONE));
2019-03-12 19:34:59 +01:00
MinecraftForge.EVENT_BUS.register(this);
2021-12-15 16:24:53 +01:00
DispenserBlock.registerBehavior(Items.ENDER_PEARL, new AbstractProjectileDispenseBehavior() {
@Override
2021-12-15 16:24:53 +01:00
protected Projectile getProjectile(Level levelIn, Position position, ItemStack stackIn) {
2021-12-15 16:30:22 +01:00
var ret = new ThrownEnderpearl(EntityType.ENDER_PEARL, levelIn);
2021-12-15 16:24:53 +01:00
ret.setPos(position.x(), position.y(), position.z());
return ret;
}
});
2021-12-15 16:24:53 +01:00
DispenserBlock.registerBehavior(Items.TRIDENT, new AbstractProjectileDispenseBehavior() {
@Override
2021-12-15 16:24:53 +01:00
protected Projectile getProjectile(Level levelIn, Position position, ItemStack stackIn) {
2021-12-15 16:30:22 +01:00
var ret = new ThrownTrident(EntityType.TRIDENT, levelIn);
2021-12-15 16:24:53 +01:00
ret.setPos(position.x(), position.y(), position.z());
2021-12-19 16:51:20 +01:00
ObfuscationReflectionHelper.setPrivateValue(ThrownTrident.class, ret, stackIn.copy(), "f_37555_");
2021-12-15 16:24:53 +01:00
ret.pickup = AbstractArrow.Pickup.ALLOWED;
return ret;
}
});
2019-03-12 19:34:59 +01:00
}
@SubscribeEvent
public void onProjectileImpact(ProjectileImpactEvent event) {
2021-12-15 16:30:22 +01:00
var entity = event.getEntity();
2023-07-08 12:32:27 +02:00
if (entity.level().isClientSide)
2019-03-12 19:34:59 +01:00
return;
2021-12-15 16:30:22 +01:00
var ray = event.getRayTraceResult();
2021-12-15 16:24:53 +01:00
if (!(ray instanceof BlockHitResult blockRay))
2020-01-22 23:21:52 +01:00
return;
2021-12-15 16:30:22 +01:00
var pos = blockRay.getBlockPos();
2019-03-12 19:34:59 +01:00
if (pos == null)
return;
2023-07-08 12:32:27 +02:00
var tile = entity.level().getBlockEntity(pos);
2021-12-15 16:24:53 +01:00
if (!(tile instanceof BlockEntityProjectileGenerator generator))
2019-03-12 19:34:59 +01:00
return;
2021-12-15 16:24:53 +01:00
if (generator.nextSide != blockRay.getDirection())
2019-03-12 19:34:59 +01:00
return;
2021-12-15 16:30:22 +01:00
var amount = NaturesAuraAPI.PROJECTILE_GENERATIONS.get(entity.getType());
if (amount == null || amount <= 0)
2019-03-12 19:34:59 +01:00
return;
2021-03-30 15:44:31 +02:00
if (!generator.canGenerateRightNow(amount))
return;
2021-03-30 15:44:31 +02:00
generator.generateAura(amount);
2019-03-12 19:34:59 +01:00
2023-07-08 12:32:27 +02:00
PacketHandler.sendToAllAround(entity.level(), pos, 32,
2021-12-15 16:24:53 +01:00
new PacketParticles((float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), PacketParticles.Type.PROJECTILE_GEN, pos.getX(), pos.getY(), pos.getZ()));
2023-07-08 12:32:27 +02:00
entity.level().playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ENDER_EYE_LAUNCH, SoundSource.BLOCKS, 0.8F, 1F);
2019-03-31 23:53:53 +02:00
2021-12-15 16:24:53 +01:00
generator.nextSide = generator.nextSide.getClockWise();
2019-03-12 19:34:59 +01:00
generator.sendToClients();
2021-12-15 16:24:53 +01:00
entity.kill();
2019-03-12 19:34:59 +01:00
event.setCanceled(true);
}
2019-03-31 23:53:53 +02:00
2020-01-29 01:34:58 +01:00
@Override
public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(),
generator.modLoc("block/" + this.getBaseName()),
generator.modLoc("block/" + this.getBaseName() + "_top"),
generator.modLoc("block/" + this.getBaseName() + "_top")));
}
2021-12-15 16:24:53 +01:00
@Override
public void registerTESR() {
2021-12-19 15:32:45 +01:00
BlockEntityRenderers.register(ModBlockEntities.PROJECTILE_GENERATOR, RenderProjectileGenerator::new);
2021-12-15 16:24:53 +01:00
}
2019-03-12 19:34:59 +01:00
}