From 78eaf1194819493113b0d73d8df223b24e2bebf0 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Mon, 6 Dec 2021 14:38:12 +0100 Subject: [PATCH] some more work~ --- .../naturesaura/api/render/ITrinketItem.java | 11 +- .../naturesaura/api/render/IVisualizable.java | 8 +- .../blocks/BlockContainerImpl.java | 107 +++++++------- .../naturesaura/blocks/BlockEnderCrate.java | 102 ++++++-------- ...ctor.java => BlockEntityAuraDetector.java} | 11 +- ...raTimer.java => BlockEntityAuraTimer.java} | 24 ++-- .../blocks/tiles/BlockEntityAutoCrafter.java | 112 +++++++++++++++ ...va => BlockEntityBlastFurnaceBooster.java} | 43 +++--- ...r.java => BlockEntityChorusGenerator.java} | 38 +++-- ...oader.java => BlockEntityChunkLoader.java} | 28 ++-- .../tiles/BlockEntityFurnaceHeater.java | 130 ++++++++++++++++++ .../blocks/tiles/ItemStackHandlerNA.java | 4 +- .../blocks/tiles/TileEntityAutoCrafter.java | 117 ---------------- .../blocks/tiles/TileEntityEnderCrate.java | 13 +- .../blocks/tiles/TileEntityFurnaceHeater.java | 129 ----------------- .../blocks/tiles/render/RenderEnderCrate.java | 88 +++--------- .../entities/EntityEffectInhibitor.java | 128 +++++++++-------- .../entities/EntityMoverMinecart.java | 95 +++++++------ .../naturesaura/entities/ModEntities.java | 3 +- .../naturesaura/items/ItemColorChanger.java | 7 +- .../naturesaura/items/ItemEffectPowder.java | 38 ++--- .../naturesaura/particles/ParticleMagic.java | 2 +- .../naturesaura/proxy/ClientProxy.java | 69 +++++----- .../de/ellpeck/naturesaura/proxy/IProxy.java | 12 +- .../naturesaura/reg/IColorProvidingBlock.java | 4 +- .../naturesaura/reg/ITESRProvider.java | 6 +- .../renderers/PlayerLayerTrinkets.java | 78 +++++------ 27 files changed, 657 insertions(+), 750 deletions(-) rename src/main/java/de/ellpeck/naturesaura/blocks/tiles/{TileEntityAuraDetector.java => BlockEntityAuraDetector.java} (65%) rename src/main/java/de/ellpeck/naturesaura/blocks/tiles/{TileEntityAuraTimer.java => BlockEntityAuraTimer.java} (84%) create mode 100644 src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAutoCrafter.java rename src/main/java/de/ellpeck/naturesaura/blocks/tiles/{TileEntityBlastFurnaceBooster.java => BlockEntityBlastFurnaceBooster.java} (76%) rename src/main/java/de/ellpeck/naturesaura/blocks/tiles/{TileEntityChorusGenerator.java => BlockEntityChorusGenerator.java} (80%) rename src/main/java/de/ellpeck/naturesaura/blocks/tiles/{TileEntityChunkLoader.java => BlockEntityChunkLoader.java} (83%) create mode 100644 src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityFurnaceHeater.java delete mode 100644 src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java delete mode 100644 src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java diff --git a/src/main/java/de/ellpeck/naturesaura/api/render/ITrinketItem.java b/src/main/java/de/ellpeck/naturesaura/api/render/ITrinketItem.java index 6c95b485..c163264d 100644 --- a/src/main/java/de/ellpeck/naturesaura/api/render/ITrinketItem.java +++ b/src/main/java/de/ellpeck/naturesaura/api/render/ITrinketItem.java @@ -1,15 +1,16 @@ package de.ellpeck.naturesaura.api.render; -import com.mojang.blaze3d.matrix.MatrixStack; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.entity.player.Player; -import net.minecraft.item.ItemStack; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public interface ITrinketItem { + @OnlyIn(Dist.CLIENT) - void render(ItemStack stack, Player player, RenderType type, MatrixStack matrices, IRenderTypeBuffer buffer, int packedLight, boolean isHolding); + void render(ItemStack stack, Player player, RenderType type, PoseStack matrices, MultiBufferSource buffer, int packedLight, boolean isHolding); enum RenderType { HEAD, BODY diff --git a/src/main/java/de/ellpeck/naturesaura/api/render/IVisualizable.java b/src/main/java/de/ellpeck/naturesaura/api/render/IVisualizable.java index 41d512ff..ca032c22 100644 --- a/src/main/java/de/ellpeck/naturesaura/api/render/IVisualizable.java +++ b/src/main/java/de/ellpeck/naturesaura/api/render/IVisualizable.java @@ -1,15 +1,15 @@ package de.ellpeck.naturesaura.api.render; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.level.Level; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public interface IVisualizable { @OnlyIn(Dist.CLIENT) - AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos); + AABB getVisualizationBounds(Level level, BlockPos pos); @OnlyIn(Dist.CLIENT) int getVisualizationColor(Level level, BlockPos pos); diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockContainerImpl.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockContainerImpl.java index 37a39f25..03b77ce1 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockContainerImpl.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockContainerImpl.java @@ -4,39 +4,40 @@ import de.ellpeck.naturesaura.blocks.tiles.BlockEntityImpl; import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModTileType; -import net.minecraft.block.*; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.Player; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemStack; -import net.minecraft.level.IBlockReader; -import net.minecraft.level.ILevel; -import net.minecraft.level.Level; -import net.minecraft.level.server.ServerLevel; -import net.minecraft.loot.LootContext; -import net.minecraft.loot.LootParameters; -import net.minecraft.state.StateContainer; -import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.FluidTags; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import javax.annotation.Nullable; import java.util.List; import java.util.Random; -import java.util.function.Supplier; public class BlockContainerImpl extends BaseEntityBlock implements IModItem { private final String baseName; - private final ModTileType tileType; + private final ModTileType tileType; - public BlockContainerImpl(String baseName, Supplier tileSupplier, Block.Properties properties) { + public BlockContainerImpl(String baseName, BlockEntityType.BlockEntitySupplier tileSupplier, Block.Properties properties) { super(properties); this.baseName = baseName; @@ -46,7 +47,7 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem { ModRegistry.add(this.tileType); if (this.hasWaterlogging()) - this.setDefaultState(this.stateContainer.getBaseState().with(BlockStateProperties.WATERLOGGED, false)); + this.registerDefaultState(this.stateDefinition.any().setValue(BlockStateProperties.WATERLOGGED, false)); } protected boolean hasWaterlogging() { @@ -54,37 +55,37 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem { } @Override - protected void fillStateContainer(StateContainer.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { if (this.hasWaterlogging()) builder.add(BlockStateProperties.WATERLOGGED); } @Override public FluidState getFluidState(BlockState state) { - return this.hasWaterlogging() && state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + return this.hasWaterlogging() && state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, ILevel levelIn, BlockPos currentPos, BlockPos facingPos) { - if (this.hasWaterlogging() && stateIn.get(BlockStateProperties.WATERLOGGED)) - levelIn.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(levelIn)); - return super.updatePostPlacement(stateIn, facing, facingState, levelIn, currentPos, facingPos); + public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, LevelAccessor levelIn, BlockPos currentPos, BlockPos facingPos) { + if (this.hasWaterlogging() && stateIn.getValue(BlockStateProperties.WATERLOGGED)) + levelIn.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(levelIn)); + return super.updateShape(stateIn, facing, facingState, levelIn, currentPos, facingPos); } @Override @Nullable - public BlockState getStateForPlacement(BlockItemUseContext context) { + public BlockState getStateForPlacement(BlockPlaceContext context) { if (this.hasWaterlogging()) { - FluidState state = context.getLevel().getFluidState(context.getPos()); - return this.getDefaultState().with(BlockStateProperties.WATERLOGGED, state.isTagged(FluidTags.WATER) && state.getLevel() == 8); + FluidState state = context.getLevel().getFluidState(context.getClickedPos()); + return this.defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, state.is(FluidTags.WATER) && state.getAmount() == 8); } return super.getStateForPlacement(context); } - @Nullable + @org.jetbrains.annotations.Nullable @Override - public BlockEntity createNewBlockEntity(IBlockReader levelIn) { - return this.tileType.type.create(); + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return this.tileType.type.create(pos, state); } @Override @@ -93,20 +94,15 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem { } @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public void onPlayerDestroy(ILevel levelIn, BlockPos pos, BlockState state) { - super.onPlayerDestroy(levelIn, pos, state); + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; } @Override public List getDrops(BlockState state, LootContext.Builder builder) { List drops = super.getDrops(state, builder); - BlockEntity tile = builder.get(LootParameters.BLOCK_ENTITY); + BlockEntity tile = builder.getParameter(LootContextParams.BLOCK_ENTITY); if (tile instanceof BlockEntityImpl) { for (ItemStack stack : drops) { if (stack.getItem() != this.asItem()) @@ -119,33 +115,28 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem { } @Override - public void onReplaced(BlockState state, Level levelIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onPlace(BlockState state, Level levelIn, BlockPos pos, BlockState newState, boolean isMoving) { if (state.getBlock() != newState.getBlock()) { BlockEntity tile = levelIn.getBlockEntity(pos); if (tile instanceof BlockEntityImpl) ((BlockEntityImpl) tile).dropInventory(); } - super.onReplaced(state, levelIn, pos, newState, isMoving); + super.onPlace(state, levelIn, pos, newState, isMoving); } @Override - public void harvestBlock(Level levelIn, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity te, ItemStack stack) { - super.harvestBlock(levelIn, player, pos, state, te, stack); - levelIn.setBlockState(pos, Blocks.AIR.getDefaultState()); + public void playerDestroy(Level levelIn, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity te, ItemStack stack) { + super.playerDestroy(levelIn, player, pos, state, te, stack); + levelIn.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); } @Override - public void onBlockPlacedBy(Level levelIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { + public void setPlacedBy(Level levelIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { BlockEntity tile = levelIn.getBlockEntity(pos); if (tile instanceof BlockEntityImpl) ((BlockEntityImpl) tile).loadDataOnPlace(stack); } - @Override - public void onBlockAdded(BlockState state, Level levelIn, BlockPos pos, BlockState oldState, boolean isMoving) { - this.updateRedstoneState(levelIn, pos); - } - @Override public void neighborChanged(BlockState state, Level levelIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { this.updateRedstoneState(levelIn, pos); @@ -154,11 +145,10 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem { private void updateRedstoneState(Level level, BlockPos pos) { if (!level.isClientSide) { BlockEntity tile = level.getBlockEntity(pos); - if (tile instanceof BlockEntityImpl) { - BlockEntityImpl impl = (BlockEntityImpl) tile; - int newPower = level.getRedstonePowerFromNeighbors(pos); + if (tile instanceof BlockEntityImpl impl) { + int newPower = level.getBestNeighborSignal(pos); if (impl.redstonePower != newPower) - level.getPendingBlockTicks().scheduleTick(pos, this, 4); + level.scheduleTick(pos, this, 4); } } } @@ -167,9 +157,8 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem { public void tick(BlockState state, ServerLevel levelIn, BlockPos pos, Random random) { if (!levelIn.isClientSide) { BlockEntity tile = levelIn.getBlockEntity(pos); - if (tile instanceof BlockEntityImpl) { - BlockEntityImpl impl = (BlockEntityImpl) tile; - int newPower = levelIn.getRedstonePowerFromNeighbors(pos); + if (tile instanceof BlockEntityImpl impl) { + int newPower = levelIn.getBestNeighborSignal(pos); if (impl.redstonePower != newPower) impl.onRedstonePowerChange(newPower); } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockEnderCrate.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockEnderCrate.java index e8f4e321..0b744479 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockEnderCrate.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockEnderCrate.java @@ -2,49 +2,45 @@ package de.ellpeck.naturesaura.blocks; import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.misc.ILevelData; -import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities; import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate; +import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities; import de.ellpeck.naturesaura.blocks.tiles.render.RenderEnderCrate; import de.ellpeck.naturesaura.data.BlockStateGenerator; import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.reg.ICustomBlockState; import de.ellpeck.naturesaura.reg.ITESRProvider; -import net.minecraft.block.AnvilBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.tileentity.BlockEntityRenderer; -import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher; -import net.minecraft.client.resources.I18n; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.Player; -import net.minecraft.entity.player.ServerPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.particles.ParticleTypes; -import net.minecraft.tileentity.BlockEntity; -import net.minecraft.tileentity.BlockEntityType; -import net.minecraft.util.InteractionResult; -import net.minecraft.util.Hand; +import net.minecraft.ChatFormatting; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Tuple; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.level.IBlockReader; -import net.minecraft.level.Level; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.AnvilUpdateEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.network.NetworkHooks; import javax.annotation.Nullable; -import java.lang.ref.WeakReference; import java.util.List; import java.util.Random; import java.util.function.Function; @@ -52,11 +48,8 @@ import java.util.function.Supplier; public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider, ICustomBlockState { - // This is terrible but I can't see a better solution right now so oh well - private static final ThreadLocal> CACHED_WORLD = new ThreadLocal<>(); - public BlockEnderCrate() { - super("ender_crate", BlockEntityEnderCrate::new, Properties.create(Material.ROCK).hardnessAndResistance(5F).setLightLevel(s -> 7).sound(SoundType.STONE)); + super("ender_crate", BlockEntityEnderCrate::new, Properties.of(Material.STONE).strength(5F).lightLevel(s -> 7).sound(SoundType.STONE)); MinecraftForge.EVENT_BUS.register(this); } @@ -68,32 +61,22 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider } @OnlyIn(Dist.CLIENT) - public static void addEnderNameInfo(ItemStack stack, List tooltip) { + public static void addEnderNameInfo(ItemStack stack, List tooltip) { String name = getEnderName(stack); - if (name != null && !name.isEmpty()) - tooltip.add(new StringTextComponent(TextFormatting.DARK_PURPLE + I18n.format("info." + NaturesAura.MOD_ID + ".ender_name", - TextFormatting.ITALIC + name + TextFormatting.RESET))); - else - tooltip.add(new StringTextComponent(TextFormatting.DARK_PURPLE + I18n.format("info." + NaturesAura.MOD_ID + ".ender_name.missing"))); - } - - @SubscribeEvent - public void onRightClick(PlayerInteractEvent.RightClickBlock event) { - Level level = event.getLevel(); - BlockPos pos = event.getPos(); - BlockState state = level.getBlockState(pos); - if (state.getBlock() instanceof AnvilBlock) { - CACHED_WORLD.set(new WeakReference<>(level)); + if (name != null && !name.isEmpty()) { + tooltip.add(new TextComponent(ChatFormatting.DARK_PURPLE + I18n.get("info." + NaturesAura.MOD_ID + ".ender_name", ChatFormatting.ITALIC + name + ChatFormatting.RESET))); + } else { + tooltip.add(new TextComponent(ChatFormatting.DARK_PURPLE + I18n.get("info." + NaturesAura.MOD_ID + ".ender_name.missing"))); } } @SubscribeEvent public void onAnvilUpdate(AnvilUpdateEvent event) { - WeakReference level = CACHED_WORLD.get(); - if (level == null || level.get() == null) + var player = event.getPlayer(); + if (player == null) return; ItemStack stack = event.getLeft(); - if (stack.getItem() != Item.getItemFromBlock(this) && stack.getItem() != ModItems.ENDER_ACCESS) + if (stack.getItem() != this.asItem() && stack.getItem() != ModItems.ENDER_ACCESS) return; ItemStack second = event.getRight(); if (second.getItem() != Items.ENDER_EYE || second.getCount() < stack.getCount()) @@ -101,7 +84,7 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider String name = event.getName(); if (name == null || name.isEmpty()) return; - if (ILevelData.getOverworldData(level.get()).isEnderStorageLocked(name)) + if (ILevelData.getOverworldData(player.level).isEnderStorageLocked(name)) return; ItemStack output = stack.copy(); output.getOrCreateTag().putString(NaturesAura.MOD_ID + ":ender_name", name); @@ -111,15 +94,12 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider } @Override - public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) { + public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (!levelIn.isClientSide) { BlockEntity tile = levelIn.getBlockEntity(pos); - if (tile instanceof BlockEntityEnderCrate) { - BlockEntityEnderCrate crate = (BlockEntityEnderCrate) tile; - if (crate.canOpen()) { - crate.drainAura(2500); - NetworkHooks.openGui((ServerPlayer) player, crate, pos); - } + if (tile instanceof BlockEntityEnderCrate crate && crate.canOpen()) { + crate.drainAura(2500); + NetworkHooks.openGui((ServerPlayer) player, crate, pos); } } return InteractionResult.SUCCESS; @@ -127,7 +107,7 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider @Override @OnlyIn(Dist.CLIENT) - public void addInformation(ItemStack stack, @Nullable IBlockReader levelIn, List tooltip, ITooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable BlockGetter levelIn, List tooltip, TooltipFlag flagIn) { addEnderNameInfo(stack, tooltip); } @@ -148,7 +128,7 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider } @Override - public Tuple, Supplier>>> getTESR() { + public Tuple, Supplier>>> getTESR() { return new Tuple<>(ModTileEntities.ENDER_CRATE, () -> RenderEnderCrate::new); } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAuraDetector.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAuraDetector.java similarity index 65% rename from src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAuraDetector.java rename to src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAuraDetector.java index b96de5b8..db5a9bcd 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAuraDetector.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAuraDetector.java @@ -1,15 +1,16 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; -import net.minecraft.tileentity.ITickableBlockEntity; -import net.minecraft.util.math.Mth; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; public class BlockEntityAuraDetector extends BlockEntityImpl implements ITickableBlockEntity { public int redstonePower; - public BlockEntityAuraDetector() { - super(ModTileEntities.AURA_DETECTOR); + public BlockEntityAuraDetector(BlockPos pos, BlockState state) { + super(ModTileEntities.AURA_DETECTOR, pos, state); } @Override @@ -19,7 +20,7 @@ public class BlockEntityAuraDetector extends BlockEntityImpl implements ITickabl int power = Mth.clamp(Mth.ceil(totalAmount / (IAuraChunk.DEFAULT_AURA * 2F) * 15F), 0, 15); if (this.redstonePower != power) { this.redstonePower = power; - this.level.updateComparatorOutputLevel(this.worldPosition, this.getBlockState().getBlock()); + this.level.updateNeighbourForOutputSignal(this.worldPosition, this.getBlockState().getBlock()); } } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAuraTimer.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAuraTimer.java similarity index 84% rename from src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAuraTimer.java rename to src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAuraTimer.java index 453aa2fa..261e790d 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAuraTimer.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAuraTimer.java @@ -7,11 +7,11 @@ import de.ellpeck.naturesaura.items.ItemAuraBottle; import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketParticles; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.ITickableBlockEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraftforge.items.IItemHandlerModifiable; import java.util.Map; @@ -30,8 +30,8 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl }; private int timer; - public BlockEntityAuraTimer() { - super(ModTileEntities.AURA_TIMER); + public BlockEntityAuraTimer(BlockPos pos, BlockState state) { + super(ModTileEntities.AURA_TIMER, pos, state); } @Override @@ -57,10 +57,10 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl if (this.level.getGameTime() % 8 == 0) { int color = ItemAuraBottle.getType(this.itemHandler.getStackInSlot(0)).getColor(); NaturesAuraAPI.instance().spawnMagicParticle( - this.worldPosition.getX() + 1 / 16F + this.level.rand.nextFloat() * 14 / 16F, - this.worldPosition.getY() + 1 / 16F + this.level.rand.nextFloat() * 14 / 16F, - this.worldPosition.getZ() + 1 / 16F + this.level.rand.nextFloat() * 14 / 16F, - 0, 0, 0, color, 1, 80 + this.level.rand.nextInt(50), 0, false, true); + this.worldPosition.getX() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F, + this.worldPosition.getY() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F, + this.worldPosition.getZ() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F, + 0, 0, 0, color, 1, 80 + this.level.random.nextInt(50), 0, false, true); } return; } @@ -70,8 +70,8 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl this.timer = 0; BlockState state = this.getBlockState(); - this.level.setBlockState(this.worldPosition, state.with(BlockStateProperties.POWERED, true), 1); - this.level.getPendingBlockTicks().scheduleTick(this.worldPosition, state.getBlock(), 4); + this.level.setBlock(this.worldPosition, state.setValue(BlockStateProperties.POWERED, true), 1); + this.level.scheduleTick(this.worldPosition, state.getBlock(), 4); int color = ItemAuraBottle.getType(this.itemHandler.getStackInSlot(0)).getColor(); PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.TIMER_RESET, color)); diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAutoCrafter.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAutoCrafter.java new file mode 100644 index 00000000..df390110 --- /dev/null +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityAutoCrafter.java @@ -0,0 +1,112 @@ +package de.ellpeck.naturesaura.blocks.tiles; + +import de.ellpeck.naturesaura.blocks.BlockAutoCrafter; +import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; + +public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickableBlockEntity { + + public final CraftingContainer crafting = new CraftingContainer(new AbstractContainerMenu(null, 0) { + @Override + public boolean stillValid(Player playerIn) { + return false; + } + }, 3, 3); + + public BlockEntityAutoCrafter(BlockPos pos, BlockState state) { + super(ModTileEntities.AUTO_CRAFTER, pos, state); + } + + @Override + public void tick() { + if (!this.level.isClientSide) { + if (this.level.getGameTime() % 60 != 0) + return; + if (!Multiblocks.AUTO_CRAFTER.isComplete(this.level, this.worldPosition)) + return; + this.crafting.clearContent(); + + var state = this.level.getBlockState(this.worldPosition); + Direction facing = state.getValue(BlockAutoCrafter.FACING); + var middlePos = this.worldPosition.above(); + var topPos = middlePos.relative(facing, 2); + var bottomPos = middlePos.relative(facing.getOpposite(), 2); + var poses = new BlockPos[]{ + topPos.relative(facing.getCounterClockWise(), 2), + topPos, + topPos.relative(facing.getClockWise(), 2), + middlePos.relative(facing.getCounterClockWise(), 2), + middlePos, + middlePos.relative(facing.getClockWise(), 2), + bottomPos.relative(facing.getCounterClockWise(), 2), + bottomPos, + bottomPos.relative(facing.getClockWise(), 2) + }; + + var items = new ItemEntity[9]; + for (var i = 0; i < poses.length; i++) { + var entities = this.level.getEntitiesOfClass( + ItemEntity.class, new AABB(poses[i]).inflate(0.25), EntitySelector.ENTITY_STILL_ALIVE); + if (entities.size() > 1) + return; + if (entities.isEmpty()) + continue; + var entity = entities.get(0); + if (entity.hasPickUpDelay()) + return; + var stack = entity.getItem(); + if (stack.isEmpty()) + return; + items[i] = entity; + this.crafting.setItem(i, stack.copy()); + } + + var recipe = this.level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, this.crafting, this.level).orElse(null); + if (recipe == null) + return; + + var result = recipe.assemble(this.crafting); + if (result.isEmpty()) + return; + var resultItem = new ItemEntity(this.level, + this.worldPosition.getX() + 0.5F, this.worldPosition.getY() - 0.35F, this.worldPosition.getZ() + 0.5F, result.copy()); + resultItem.setDeltaMovement(0, 0, 0); + this.level.addFreshEntity(resultItem); + + var remainingItems = recipe.getRemainingItems(this.crafting); + for (var i = 0; i < items.length; i++) { + var item = items[i]; + if (item == null) + continue; + var stack = item.getItem(); + if (stack.getCount() <= 1) + item.discard(); + else { + stack.shrink(1); + item.setItem(stack); + } + + var remain = remainingItems.get(i); + if (!remain.isEmpty()) { + var remItem = new ItemEntity(this.level, item.getX(), item.getY(), item.getZ(), remain.copy()); + remItem.setDeltaMovement(0, 0, 0); + this.level.addFreshEntity(remItem); + } + + PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, + new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.ANIMAL_SPAWNER)); + } + } + } +} diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityBlastFurnaceBooster.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityBlastFurnaceBooster.java similarity index 76% rename from src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityBlastFurnaceBooster.java rename to src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityBlastFurnaceBooster.java index d22ae26c..a8b1e6af 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityBlastFurnaceBooster.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityBlastFurnaceBooster.java @@ -3,15 +3,15 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketParticles; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.tileentity.BlastFurnaceBlockEntity; -import net.minecraft.tileentity.ITickableBlockEntity; -import net.minecraft.tileentity.BlockEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.IIntArray; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.block.entity.BlastFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -21,8 +21,8 @@ import java.util.List; public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements ITickableBlockEntity { - public BlockEntityBlastFurnaceBooster() { - super(ModTileEntities.BLAST_FURNACE_BOOSTER); + public BlockEntityBlastFurnaceBooster(BlockPos pos, BlockState state) { + super(ModTileEntities.BLAST_FURNACE_BOOSTER, pos, state); } @Override @@ -30,34 +30,33 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I if (this.level.isClientSide) return; - BlockEntity below = this.level.getBlockEntity(this.worldPosition.down()); - if (!(below instanceof BlastFurnaceBlockEntity)) + BlockEntity below = this.level.getBlockEntity(this.worldPosition.below()); + if (!(below instanceof BlastFurnaceBlockEntity tile)) return; - BlastFurnaceBlockEntity tile = (BlastFurnaceBlockEntity) below; - IRecipe recipe = this.level.getRecipeManager().getRecipe(BlockEntityFurnaceHeater.getRecipeType(tile), tile, this.level).orElse(null); + Recipe recipe = this.level.getRecipeManager().getRecipeFor(BlockEntityFurnaceHeater.getRecipeType(tile), tile, this.level).orElse(null); if (recipe == null) return; if (!this.isApplicable(recipe.getIngredients())) return; - IIntArray data = BlockEntityFurnaceHeater.getFurnaceData(tile); + ContainerData data = BlockEntityFurnaceHeater.getFurnaceData(tile); int doneDiff = data.get(3) - data.get(2); if (doneDiff > 1) return; - if (this.level.rand.nextFloat() > 0.45F) { + if (this.level.random.nextFloat() > 0.45F) { PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 0)); return; } - ItemStack output = tile.getStackInSlot(2); + ItemStack output = tile.getItem(2); if (output.getCount() >= output.getMaxStackSize()) return; if (output.isEmpty()) { - ItemStack result = recipe.getRecipeOutput(); - tile.setInventorySlotContents(2, result.copy()); + ItemStack result = recipe.getResultItem(); + tile.setItem(2, result.copy()); } else { output.grow(1); } @@ -71,7 +70,7 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I private boolean isApplicable(List ingredients) { for (Ingredient ing : ingredients) { - for (ItemStack stack : ing.getMatchingStacks()) { + for (ItemStack stack : ing.getItems()) { if (stack.getItem().getTags().stream().anyMatch(t -> t.getPath().startsWith("ores/"))) return true; } @@ -81,7 +80,7 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I @Override public IItemHandlerModifiable getItemHandler() { - BlockEntity below = this.level.getBlockEntity(this.worldPosition.down()); + BlockEntity below = this.level.getBlockEntity(this.worldPosition.below()); if (!(below instanceof BlastFurnaceBlockEntity)) return null; IItemHandler handler = below.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.UP).orElse(null); diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityChorusGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityChorusGenerator.java similarity index 80% rename from src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityChorusGenerator.java rename to src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityChorusGenerator.java index c888e429..65955bdb 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityChorusGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityChorusGenerator.java @@ -1,18 +1,16 @@ package de.ellpeck.naturesaura.blocks.tiles; -import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketParticles; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.tileentity.ITickableBlockEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import java.util.ArrayDeque; import java.util.ArrayList; @@ -24,8 +22,8 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick private final Deque currentlyBreaking = new ArrayDeque<>(); private int auraPerBlock; - public BlockEntityChorusGenerator() { - super(ModTileEntities.CHORUS_GENERATOR); + public BlockEntityChorusGenerator(BlockPos pos, BlockState state) { + super(ModTileEntities.CHORUS_GENERATOR, pos, state); } @Override @@ -45,7 +43,7 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.CHORUS_GENERATOR, pos.getX(), pos.getY(), pos.getZ())); this.level.removeBlock(pos, false); this.level.playSound(null, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5, - SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, SoundCategory.BLOCKS, 0.5F, 1F); + SoundEvents.CHORUS_FRUIT_TELEPORT, SoundSource.BLOCKS, 0.5F, 1F); this.generateAura(this.auraPerBlock); } @@ -57,8 +55,8 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick for (int x = -range; x <= range; x++) { for (int y = -range; y <= range; y++) { for (int z = -range; z <= range; z++) { - BlockPos offset = this.worldPosition.add(x, y, z); - BlockState below = this.level.getBlockState(offset.down()); + BlockPos offset = this.worldPosition.offset(x, y, z); + BlockState below = this.level.getBlockState(offset.below()); if (below.getBlock() != Blocks.END_STONE) continue; BlockState state = this.level.getBlockState(offset); @@ -87,7 +85,7 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick for (Direction dir : Direction.values()) { if (dir == Direction.DOWN) continue; - BlockPos offset = pos.offset(dir); + BlockPos offset = pos.relative(dir); if (blocks.contains(offset)) continue; BlockState state = this.level.getBlockState(offset); @@ -102,9 +100,9 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick public void writeNBT(CompoundTag compound, SaveType type) { super.writeNBT(compound, type); if (type == SaveType.TILE) { - ListNBT list = new ListNBT(); + ListTag list = new ListTag(); for (BlockPos pos : this.currentlyBreaking) - list.add(NBTUtil.writeBlockPos(pos)); + list.add(NbtUtils.writeBlockPos(pos)); compound.put("breaking", list); compound.putInt("aura", this.auraPerBlock); } @@ -115,9 +113,9 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick super.readNBT(compound, type); if (type == SaveType.TILE) { this.currentlyBreaking.clear(); - ListNBT list = compound.getList("breaking", 10); + ListTag list = compound.getList("breaking", 10); for (int i = 0; i < list.size(); i++) - this.currentlyBreaking.add(NBTUtil.readBlockPos(list.getCompound(i))); + this.currentlyBreaking.add(NbtUtils.readBlockPos(list.getCompound(i))); this.auraPerBlock = compound.getInt("aura"); } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityChunkLoader.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityChunkLoader.java similarity index 83% rename from src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityChunkLoader.java rename to src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityChunkLoader.java index 3f2fcfb8..f3db12c4 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityChunkLoader.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityChunkLoader.java @@ -2,12 +2,12 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.tileentity.ITickableBlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.Mth; -import net.minecraft.level.server.ServerLevel; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.state.BlockState; import java.util.ArrayList; import java.util.Arrays; @@ -19,13 +19,13 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable private final List forcedChunks = new ArrayList<>(); private boolean firstTick = true; - public BlockEntityChunkLoader() { - super(ModTileEntities.CHUNK_LOADER); + public BlockEntityChunkLoader(BlockPos pos, BlockState state) { + super(ModTileEntities.CHUNK_LOADER, pos, state); } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); this.loadChunks(true); } @@ -55,23 +55,23 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable for (int z = (this.worldPosition.getZ() - range) >> 4; z <= (this.worldPosition.getZ() + range) >> 4; z++) { ChunkPos pos = new ChunkPos(x, z); // Only force chunks that we're already forcing or that nobody else is forcing - if (this.forcedChunks.contains(pos) || !level.getForcedChunks().contains(pos.asLong())) + if (this.forcedChunks.contains(pos) || !level.getForcedChunks().contains(pos.toLong())) shouldBeForced.add(pos); } } } } - // Unforce all of the chunks that shouldn't be forced anymore + // Unforce all the chunks that shouldn't be forced anymore for (ChunkPos pos : this.forcedChunks) { if (!shouldBeForced.contains(pos)) - level.forceChunk(pos.x, pos.z, false); + level.setChunkForced(pos.x, pos.z, false); } this.forcedChunks.clear(); // Force all chunks that should be forced for (ChunkPos pos : shouldBeForced) { - level.forceChunk(pos.x, pos.z, true); + level.setChunkForced(pos.x, pos.z, true); this.forcedChunks.add(pos); } } @@ -100,7 +100,7 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable public void writeNBT(CompoundTag compound, SaveType type) { super.writeNBT(compound, type); if (type == SaveType.TILE) - compound.putLongArray("forced_chunks", this.forcedChunks.stream().map(ChunkPos::asLong).collect(Collectors.toList())); + compound.putLongArray("forced_chunks", this.forcedChunks.stream().map(ChunkPos::toLong).collect(Collectors.toList())); } @Override diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityFurnaceHeater.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityFurnaceHeater.java new file mode 100644 index 00000000..2dca6b5b --- /dev/null +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityFurnaceHeater.java @@ -0,0 +1,130 @@ +package de.ellpeck.naturesaura.blocks.tiles; + +import de.ellpeck.naturesaura.Helper; +import de.ellpeck.naturesaura.NaturesAura; +import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.api.aura.type.IAuraType; +import de.ellpeck.naturesaura.blocks.BlockFurnaceHeater; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticleStream; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.AbstractFurnaceBlock; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.BlastFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SmokerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; + +import java.lang.reflect.Field; + +public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickableBlockEntity { + + private static final Field FURNACE_DATA_FIELD = ObfuscationReflectionHelper.findField(AbstractFurnaceBlockEntity.class, "dataAccess"); + public boolean isActive; + + public BlockEntityFurnaceHeater(BlockPos pos, BlockState state) { + super(ModTileEntities.FURNACE_HEATER, pos, state); + } + + public static ContainerData getFurnaceData(AbstractFurnaceBlockEntity tile) { + try { + return (ContainerData) FURNACE_DATA_FIELD.get(tile); + } catch (IllegalAccessException e) { + NaturesAura.LOGGER.fatal("Couldn't reflect furnace field", e); + return null; + } + } + + public static RecipeType getRecipeType(AbstractFurnaceBlockEntity furnace) { + if (furnace instanceof BlastFurnaceBlockEntity) { + return RecipeType.BLASTING; + } else if (furnace instanceof SmokerBlockEntity) { + return RecipeType.SMOKING; + } else { + return RecipeType.SMELTING; + } + } + + @Override + public void tick() { + if (!this.level.isClientSide && this.level.getGameTime() % 5 == 0) { + boolean did = false; + + Direction facing = this.level.getBlockState(this.worldPosition).getValue(BlockFurnaceHeater.FACING); + BlockPos tilePos = this.worldPosition.relative(facing.getOpposite()); + BlockEntity tile = this.level.getBlockEntity(tilePos); + if (tile instanceof AbstractFurnaceBlockEntity furnace && this.isReady(furnace)) { + ContainerData data = getFurnaceData(furnace); + int burnTime = data.get(0); + if (burnTime <= 0) + this.level.setBlockAndUpdate(tilePos, this.level.getBlockState(tilePos).setValue(AbstractFurnaceBlock.LIT, true)); + + data.set(0, 200); + //if set higher than 199, it'll never finish because the furnace does ++ and then == + data.set(2, Math.min(data.get(3) - 1, data.get(2) + 5)); + + BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 20, this.worldPosition); + IAuraChunk chunk = IAuraChunk.getAuraChunk(this.level, spot); + chunk.drainAura(spot, Mth.ceil((200 - burnTime) * 16.6F)); + did = true; + + if (this.level.getGameTime() % 15 == 0) { + PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream( + this.worldPosition.getX() + (float) this.level.random.nextGaussian() * 5F, + this.worldPosition.getY() + 1 + this.level.random.nextFloat() * 5F, + this.worldPosition.getZ() + (float) this.level.random.nextGaussian() * 5F, + tilePos.getX() + this.level.random.nextFloat(), + tilePos.getY() + this.level.random.nextFloat(), + tilePos.getZ() + this.level.random.nextFloat(), + this.level.random.nextFloat() * 0.07F + 0.07F, IAuraType.forLevel(this.level).getColor(), this.level.random.nextFloat() + 0.5F + )); + } + } + + if (did != this.isActive) { + this.isActive = did; + this.sendToClients(); + } + } + } + + private boolean isReady(AbstractFurnaceBlockEntity furnace) { + if (!furnace.getItem(1).isEmpty()) + return false; + + ItemStack input = furnace.getItem(0); + if (!input.isEmpty()) { + AbstractCookingRecipe recipe = this.level.getRecipeManager().getRecipeFor(getRecipeType(furnace), furnace, this.level).orElse(null); + if (recipe == null) + return false; + ItemStack output = recipe.getResultItem(); + ItemStack currOutput = furnace.getItem(2); + return currOutput.isEmpty() || Helper.areItemsEqual(currOutput, output, true) && currOutput.getCount() + output.getCount() <= output.getMaxStackSize(); + } else + return false; + } + + @Override + public void writeNBT(CompoundTag compound, SaveType type) { + super.writeNBT(compound, type); + + if (type == SaveType.SYNC) + compound.putBoolean("active", this.isActive); + } + + @Override + public void readNBT(CompoundTag compound, SaveType type) { + super.readNBT(compound, type); + + if (type == SaveType.SYNC) + this.isActive = compound.getBoolean("active"); + } +} diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ItemStackHandlerNA.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ItemStackHandlerNA.java index 3ed95213..0a430873 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ItemStackHandlerNA.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/ItemStackHandlerNA.java @@ -1,6 +1,6 @@ package de.ellpeck.naturesaura.blocks.tiles; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.ItemStackHandler; import javax.annotation.Nonnull; @@ -23,7 +23,7 @@ public class ItemStackHandlerNA extends ItemStackHandler { @Override protected void onContentsChanged(int slot) { if (this.tile != null) { - this.tile.markDirty(); + this.tile.setChanged(); if (this.sendToClients && !this.tile.getLevel().isClientSide) this.tile.sendToClients(); } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java deleted file mode 100644 index 7968f2d0..00000000 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java +++ /dev/null @@ -1,117 +0,0 @@ -package de.ellpeck.naturesaura.blocks.tiles; - -import de.ellpeck.naturesaura.blocks.BlockAutoCrafter; -import de.ellpeck.naturesaura.blocks.multi.Multiblocks; -import de.ellpeck.naturesaura.packet.PacketHandler; -import de.ellpeck.naturesaura.packet.PacketParticles; -import net.minecraft.block.BlockState; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.Player; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.tileentity.ITickableBlockEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.EntityPredicates; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; - -import java.util.List; - -public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickableBlockEntity { - public final CraftingInventory crafting = new CraftingInventory(new Container(null, 0) { - @Override - public boolean canInteractWith(Player playerIn) { - return false; - } - }, 3, 3); - - public BlockEntityAutoCrafter() { - super(ModTileEntities.AUTO_CRAFTER); - } - - @Override - public void tick() { - if (!this.level.isClientSide) { - if (this.level.getGameTime() % 60 != 0) - return; - if (!Multiblocks.AUTO_CRAFTER.isComplete(this.level, this.worldPosition)) - return; - this.crafting.clear(); - - BlockState state = this.level.getBlockState(this.worldPosition); - Direction facing = state.get(BlockAutoCrafter.FACING); - BlockPos middlePos = this.worldPosition.up(); - BlockPos topPos = middlePos.offset(facing, 2); - BlockPos bottomPos = middlePos.offset(facing.getOpposite(), 2); - BlockPos[] poses = new BlockPos[]{ - topPos.offset(facing.rotateYCCW(), 2), - topPos, - topPos.offset(facing.rotateY(), 2), - middlePos.offset(facing.rotateYCCW(), 2), - middlePos, - middlePos.offset(facing.rotateY(), 2), - bottomPos.offset(facing.rotateYCCW(), 2), - bottomPos, - bottomPos.offset(facing.rotateY(), 2) - }; - - ItemEntity[] items = new ItemEntity[9]; - for (int i = 0; i < poses.length; i++) { - List entities = this.level.getEntitiesWithinAABB( - ItemEntity.class, new AxisAlignedBB(poses[i]).grow(0.25), EntityPredicates.IS_ALIVE); - if (entities.size() > 1) - return; - if (entities.isEmpty()) - continue; - ItemEntity entity = entities.get(0); - if (entity.cannotPickup()) - return; - ItemStack stack = entity.getItem(); - if (stack.isEmpty()) - return; - items[i] = entity; - this.crafting.setInventorySlotContents(i, stack.copy()); - } - - IRecipe recipe = this.level.getRecipeManager().getRecipe(IRecipeType.CRAFTING, this.crafting, this.level).orElse(null); - if (recipe == null) - return; - - ItemStack result = recipe.getCraftingResult(this.crafting); - if (result.isEmpty()) - return; - ItemEntity resultItem = new ItemEntity(this.level, - this.worldPosition.getX() + 0.5F, this.worldPosition.getY() - 0.35F, this.worldPosition.getZ() + 0.5F, result.copy()); - resultItem.setMotion(0, 0, 0); - this.level.addEntity(resultItem); - - NonNullList remainingItems = recipe.getRemainingItems(this.crafting); - for (int i = 0; i < items.length; i++) { - ItemEntity item = items[i]; - if (item == null) - continue; - ItemStack stack = item.getItem(); - if (stack.getCount() <= 1) - item.remove(); - else { - stack.shrink(1); - item.setItem(stack); - } - - ItemStack remain = remainingItems.get(i); - if (!remain.isEmpty()) { - ItemEntity remItem = new ItemEntity(this.level, item.getPosX(), item.getPosY(), item.getPosZ(), remain.copy()); - remItem.setMotion(0, 0, 0); - this.level.addEntity(remItem); - } - - PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, - new PacketParticles((float) item.getPosX(), (float) item.getPosY(), (float) item.getPosZ(), PacketParticles.Type.ANIMAL_SPAWNER)); - } - } - } -} diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEnderCrate.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEnderCrate.java index cade087f..c732a018 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEnderCrate.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEnderCrate.java @@ -6,22 +6,27 @@ import de.ellpeck.naturesaura.api.misc.ILevelData; import de.ellpeck.naturesaura.blocks.BlockEnderCrate; import de.ellpeck.naturesaura.gui.ContainerEnderCrate; import de.ellpeck.naturesaura.gui.ModContainers; +import net.minecraft.core.BlockPos; import net.minecraft.entity.player.Player; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.INamedContainerProvider; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.inventory.MenuConstructor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedContainerProvider { +public class BlockEntityEnderCrate extends BlockEntityImpl implements MenuProvider { public String name; private final IItemHandlerModifiable wrappedEnderStorage = new IItemHandlerModifiable() { @@ -74,8 +79,8 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont } }; - public BlockEntityEnderCrate() { - super(ModTileEntities.ENDER_CRATE); + public BlockEntityEnderCrate(BlockPos pos, BlockState state) { + super(ModTileEntities.ENDER_CRATE, pos, state); } @Override diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java deleted file mode 100644 index 88fc2728..00000000 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java +++ /dev/null @@ -1,129 +0,0 @@ -package de.ellpeck.naturesaura.blocks.tiles; - -import de.ellpeck.naturesaura.Helper; -import de.ellpeck.naturesaura.NaturesAura; -import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; -import de.ellpeck.naturesaura.api.aura.type.IAuraType; -import de.ellpeck.naturesaura.blocks.BlockFurnaceHeater; -import de.ellpeck.naturesaura.packet.PacketHandler; -import de.ellpeck.naturesaura.packet.PacketParticleStream; -import net.minecraft.block.AbstractFurnaceBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.AbstractCookingRecipe; -import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.tileentity.*; -import net.minecraft.util.Direction; -import net.minecraft.util.IIntArray; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Mth; -import net.minecraftforge.fml.common.ObfuscationReflectionHelper; - -import java.lang.reflect.Field; - -public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickableBlockEntity { - - private static final Field FURNACE_DATA_FIELD = ObfuscationReflectionHelper.findField(AbstractFurnaceBlockEntity.class, "field_214013_b"); - public boolean isActive; - - public BlockEntityFurnaceHeater() { - super(ModTileEntities.FURNACE_HEATER); - } - - public static IIntArray getFurnaceData(AbstractFurnaceBlockEntity tile) { - try { - return (IIntArray) FURNACE_DATA_FIELD.get(tile); - } catch (IllegalAccessException e) { - NaturesAura.LOGGER.fatal("Couldn't reflect furnace field", e); - return null; - } - } - - public static IRecipeType getRecipeType(AbstractFurnaceBlockEntity furnace) { - if (furnace instanceof BlastFurnaceBlockEntity) { - return IRecipeType.BLASTING; - } else if (furnace instanceof SmokerBlockEntity) { - return IRecipeType.SMOKING; - } else { - return IRecipeType.SMELTING; - } - } - - @Override - public void tick() { - if (!this.level.isClientSide && this.level.getGameTime() % 5 == 0) { - boolean did = false; - - Direction facing = this.level.getBlockState(this.worldPosition).get(BlockFurnaceHeater.FACING); - BlockPos tilePos = this.worldPosition.offset(facing.getOpposite()); - BlockEntity tile = this.level.getBlockEntity(tilePos); - if (tile instanceof AbstractFurnaceBlockEntity) { - AbstractFurnaceBlockEntity furnace = (AbstractFurnaceBlockEntity) tile; - if (this.isReady(furnace)) { - IIntArray data = getFurnaceData(furnace); - int burnTime = data.get(0); - if (burnTime <= 0) - this.level.setBlockState(tilePos, this.level.getBlockState(tilePos).with(AbstractFurnaceBlock.LIT, true)); - - data.set(0, 200); - //if set higher than 199, it'll never finish because the furnace does ++ and then == - data.set(2, Math.min(data.get(3) - 1, data.get(2) + 5)); - - BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 20, this.worldPosition); - IAuraChunk chunk = IAuraChunk.getAuraChunk(this.level, spot); - chunk.drainAura(spot, Mth.ceil((200 - burnTime) * 16.6F)); - did = true; - - if (this.level.getGameTime() % 15 == 0) { - PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream( - this.worldPosition.getX() + (float) this.level.rand.nextGaussian() * 5F, - this.worldPosition.getY() + 1 + this.level.rand.nextFloat() * 5F, - this.worldPosition.getZ() + (float) this.level.rand.nextGaussian() * 5F, - tilePos.getX() + this.level.rand.nextFloat(), - tilePos.getY() + this.level.rand.nextFloat(), - tilePos.getZ() + this.level.rand.nextFloat(), - this.level.rand.nextFloat() * 0.07F + 0.07F, IAuraType.forLevel(this.level).getColor(), this.level.rand.nextFloat() + 0.5F - )); - } - } - } - - if (did != this.isActive) { - this.isActive = did; - this.sendToClients(); - } - } - } - - private boolean isReady(AbstractFurnaceBlockEntity furnace) { - if (!furnace.getStackInSlot(1).isEmpty()) - return false; - - ItemStack input = furnace.getStackInSlot(0); - if (!input.isEmpty()) { - AbstractCookingRecipe recipe = this.level.getRecipeManager().getRecipe(getRecipeType(furnace), furnace, this.level).orElse(null); - if (recipe == null) - return false; - ItemStack output = recipe.getRecipeOutput(); - ItemStack currOutput = furnace.getStackInSlot(2); - return currOutput.isEmpty() || Helper.areItemsEqual(currOutput, output, true) && currOutput.getCount() + output.getCount() <= output.getMaxStackSize(); - } else - return false; - } - - @Override - public void writeNBT(CompoundTag compound, SaveType type) { - super.writeNBT(compound, type); - - if (type == SaveType.SYNC) - compound.putBoolean("active", this.isActive); - } - - @Override - public void readNBT(CompoundTag compound, SaveType type) { - super.readNBT(compound, type); - - if (type == SaveType.SYNC) - this.isActive = compound.getBoolean("active"); - } -} diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/render/RenderEnderCrate.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/render/RenderEnderCrate.java index ce25408c..dce96447 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/render/RenderEnderCrate.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/render/RenderEnderCrate.java @@ -1,85 +1,37 @@ package de.ellpeck.naturesaura.blocks.tiles.render; -import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate; -import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.tileentity.BlockEntityRenderer; -import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher; -import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import java.util.List; -import java.util.Random; -import java.util.stream.IntStream; - @OnlyIn(Dist.CLIENT) -public class RenderEnderCrate extends BlockEntityRenderer { - private static final Random RANDOM = new Random(31100L); - private static final List RENDER_TYPES = IntStream.range(0, 16).mapToObj(i -> RenderType.getEndPortal(i + 1)).collect(ImmutableList.toImmutableList()); - - public RenderEnderCrate(BlockEntityRendererDispatcher rendererDispatcherIn) { - super(rendererDispatcherIn); - } +public class RenderEnderCrate implements BlockEntityRenderer { @Override - public void render(BlockEntityEnderCrate tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) { - RANDOM.setSeed(31100L); - double d0 = tileEntityIn.getPos().distanceSq(this.renderDispatcher.renderInfo.getProjectedView(), true); - int i = this.getPasses(d0); - float f = this.getOffset(); - Matrix4f matrix4f = matrixStackIn.getLast().getMatrix(); - this.renderCube(f, 0.15F, matrix4f, bufferIn.getBuffer(RENDER_TYPES.get(0))); - - for (int j = 1; j < i; ++j) { - this.renderCube(f, 2.0F / (float) (18 - j), matrix4f, bufferIn.getBuffer(RENDER_TYPES.get(j))); - } + public void render(BlockEntityEnderCrate tileEntityIn, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) { + Matrix4f matrix4f = matrixStackIn.last().pose(); + float f1 = RenderEnderCrate.getOffsetUp(); + RenderEnderCrate.renderFace(matrix4f, bufferIn.getBuffer(RenderEnderCrate.renderType()), f1, f1); } - private void renderCube(float g, float h, Matrix4f mat, IVertexBuilder builder) { - float f = (RANDOM.nextFloat() * 0.5F + 0.1F) * h; - float f1 = (RANDOM.nextFloat() * 0.5F + 0.4F) * h; - float f2 = (RANDOM.nextFloat() * 0.5F + 0.5F) * h; - this.renderFace(mat, builder, g, g, f, f1, f2); + private static void renderFace(Matrix4f p_173696_, VertexConsumer p_173697_, float p_173700_, float p_173701_) { + p_173697_.vertex(p_173696_, (float) 0.0, p_173700_, (float) 1.0).endVertex(); + p_173697_.vertex(p_173696_, (float) 1.0, p_173700_, (float) 1.0).endVertex(); + p_173697_.vertex(p_173696_, (float) 1.0, p_173701_, (float) 0.0).endVertex(); + p_173697_.vertex(p_173696_, (float) 0.0, p_173701_, (float) 0.0).endVertex(); } - private void renderFace(Matrix4f mat, IVertexBuilder builder, float h, float i, float n, float o, float p) { - builder.pos(mat, 2 / 16F, h, 14 / 16F).color(n, o, p, 1.0F).endVertex(); - builder.pos(mat, 14 / 16F, h, 14 / 16F).color(n, o, p, 1.0F).endVertex(); - builder.pos(mat, 14 / 16F, i, 2 / 16F).color(n, o, p, 1.0F).endVertex(); - builder.pos(mat, 2 / 16F, i, 2 / 16F).color(n, o, p, 1.0F).endVertex(); - } - - protected int getPasses(double dist) { - int i; - - if (dist > 36864.0D) { - i = 1; - } else if (dist > 25600.0D) { - i = 3; - } else if (dist > 16384.0D) { - i = 5; - } else if (dist > 9216.0D) { - i = 7; - } else if (dist > 4096.0D) { - i = 9; - } else if (dist > 1024.0D) { - i = 11; - } else if (dist > 576.0D) { - i = 13; - } else if (dist > 256.0D) { - i = 14; - } else { - i = 15; - } - - return i; - } - - protected float getOffset() { + private static float getOffsetUp() { return 1.001F; } + + private static RenderType renderType() { + return RenderType.endPortal(); + } } diff --git a/src/main/java/de/ellpeck/naturesaura/entities/EntityEffectInhibitor.java b/src/main/java/de/ellpeck/naturesaura/entities/EntityEffectInhibitor.java index 74d1743f..9b232576 100644 --- a/src/main/java/de/ellpeck/naturesaura/entities/EntityEffectInhibitor.java +++ b/src/main/java/de/ellpeck/naturesaura/entities/EntityEffectInhibitor.java @@ -1,6 +1,5 @@ package de.ellpeck.naturesaura.entities; -import com.google.common.collect.ListMultimap; import de.ellpeck.naturesaura.Helper; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.misc.ILevelData; @@ -8,33 +7,30 @@ import de.ellpeck.naturesaura.api.render.IVisualizable; import de.ellpeck.naturesaura.items.ItemEffectPowder; import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.misc.LevelData; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.item.ItemStack; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.IPacket; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.ResourceLocation; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Tuple; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.level.Level; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.EntityDamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.network.NetworkHooks; - -import java.util.List; +import net.minecraftforge.network.NetworkHooks; public class EntityEffectInhibitor extends Entity implements IVisualizable { - private static final DataParameter INHIBITED_EFFECT = EntityDataManager.createKey(EntityEffectInhibitor.class, DataSerializers.STRING); - private static final DataParameter COLOR = EntityDataManager.createKey(EntityEffectInhibitor.class, DataSerializers.VARINT); - private static final DataParameter AMOUNT = EntityDataManager.createKey(EntityEffectInhibitor.class, DataSerializers.VARINT); + private static final EntityDataAccessor INHIBITED_EFFECT = SynchedEntityData.defineId(EntityEffectInhibitor.class, EntityDataSerializers.STRING); + private static final EntityDataAccessor COLOR = SynchedEntityData.defineId(EntityEffectInhibitor.class, EntityDataSerializers.INT); + private static final EntityDataAccessor AMOUNT = SynchedEntityData.defineId(EntityEffectInhibitor.class, EntityDataSerializers.INT); private ResourceLocation lastEffect; private boolean powderListDirty; @@ -46,47 +42,47 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable { } public static void place(Level level, ItemStack stack, double posX, double posY, double posZ) { - ResourceLocation effect = ItemEffectPowder.getEffect(stack); - EntityEffectInhibitor entity = new EntityEffectInhibitor(ModEntities.EFFECT_INHIBITOR, level); + var effect = ItemEffectPowder.getEffect(stack); + var entity = new EntityEffectInhibitor(ModEntities.EFFECT_INHIBITOR, level); entity.setInhibitedEffect(effect); entity.setColor(NaturesAuraAPI.EFFECT_POWDERS.get(effect)); entity.setAmount(stack.getCount()); - entity.setPosition(posX, posY, posZ); - level.addEntity(entity); + entity.setPos(posX, posY, posZ); + level.addFreshEntity(entity); } @Override - public void onAddedToLevel() { - super.onAddedToLevel(); + public void onAddedToWorld() { + super.onAddedToWorld(); this.powderListDirty = true; } @Override - public void onRemovedFromLevel() { - super.onRemovedFromLevel(); + public void onRemovedFromWorld() { + super.onRemovedFromWorld(); this.setInhibitedEffect(null); this.updatePowderListStatus(); } @Override - protected void registerData() { - this.dataManager.register(INHIBITED_EFFECT, null); - this.dataManager.register(COLOR, 0); - this.dataManager.register(AMOUNT, 0); + protected void defineSynchedData() { + this.entityData.define(INHIBITED_EFFECT, null); + this.entityData.define(COLOR, 0); + this.entityData.define(AMOUNT, 0); } @Override - public void notifyDataManagerChange(DataParameter key) { - super.notifyDataManagerChange(key); + public void onSyncedDataUpdated(EntityDataAccessor key) { + super.onSyncedDataUpdated(key); if (INHIBITED_EFFECT.equals(key) || AMOUNT.equals(key)) this.powderListDirty = true; } @Override - public void setPosition(double x, double y, double z) { - if (x != this.getPosX() || y != this.getPosY() || z != this.getPosZ()) + public void setPos(double x, double y, double z) { + if (x != this.getX() || y != this.getY() || z != this.getZ()) this.powderListDirty = true; - super.setPosition(x, y, z); + super.setPos(x, y, z); } @Override @@ -99,13 +95,13 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable { if (this.level.isClientSide) { if (this.level.getGameTime() % 5 == 0) { NaturesAuraAPI.instance().spawnMagicParticle( - this.getPosX() + this.level.rand.nextGaussian() * 0.1F, - this.getPosY(), - this.getPosZ() + this.level.rand.nextGaussian() * 0.1F, - this.level.rand.nextGaussian() * 0.005F, - this.level.rand.nextFloat() * 0.03F, - this.level.rand.nextGaussian() * 0.005F, - this.getColor(), this.level.rand.nextFloat() * 3F + 1F, 120, 0F, true, true); + this.getX() + this.level.random.nextGaussian() * 0.1F, + this.getY(), + this.getZ() + this.level.random.nextGaussian() * 0.1F, + this.level.random.nextGaussian() * 0.005F, + this.level.random.nextFloat() * 0.03F, + this.level.random.nextGaussian() * 0.005F, + this.getColor(), this.level.random.nextFloat() * 3F + 1F, 120, 0F, true, true); } this.renderTicks++; } @@ -117,32 +113,32 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable { } @Override - protected void readAdditional(CompoundTag compound) { + protected void readAdditionalSaveData(CompoundTag compound) { this.setInhibitedEffect(new ResourceLocation(compound.getString("effect"))); this.setColor(compound.getInt("color")); this.setAmount(compound.contains("amount") ? compound.getInt("amount") : 24); } @Override - protected void writeAdditional(CompoundTag compound) { + protected void addAdditionalSaveData(CompoundTag compound) { compound.putString("effect", this.getInhibitedEffect().toString()); compound.putInt("color", this.getColor()); compound.putInt("amount", this.getAmount()); } @Override - public IPacket createSpawnPacket() { + public Packet getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @Override - public boolean attackEntityFrom(DamageSource source, float amount) { + public boolean hurt(DamageSource source, float amount) { if (source instanceof EntityDamageSource && !this.level.isClientSide) { - this.remove(); - this.entityDropItem(this.getDrop(), 0F); + this.kill(); + this.spawnAtLocation(this.getDrop(), 0F); return true; } else - return super.attackEntityFrom(source, amount); + return super.hurt(source, amount); } public ItemStack getDrop() { @@ -150,36 +146,36 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable { } public ResourceLocation getInhibitedEffect() { - String effect = this.dataManager.get(INHIBITED_EFFECT); + var effect = this.entityData.get(INHIBITED_EFFECT); if (effect == null || effect.isEmpty()) return null; return new ResourceLocation(effect); } public void setInhibitedEffect(ResourceLocation effect) { - this.dataManager.set(INHIBITED_EFFECT, effect != null ? effect.toString() : null); + this.entityData.set(INHIBITED_EFFECT, effect != null ? effect.toString() : null); } public int getColor() { - return this.dataManager.get(COLOR); + return this.entityData.get(COLOR); } public void setColor(int color) { - this.dataManager.set(COLOR, color); + this.entityData.set(COLOR, color); } public int getAmount() { - return this.dataManager.get(AMOUNT); + return this.entityData.get(AMOUNT); } public void setAmount(int amount) { - this.dataManager.set(AMOUNT, amount); + this.entityData.set(AMOUNT, amount); } @Override @OnlyIn(Dist.CLIENT) - public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) { - return Helper.aabb(this.getPositionVec()).grow(this.getAmount()); + public AABB getVisualizationBounds(Level level, BlockPos pos) { + return Helper.aabb(this.getEyePosition()).inflate(this.getAmount()); } @Override @@ -189,15 +185,15 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable { } private void updatePowderListStatus() { - ListMultimap> powders = ((LevelData) ILevelData.getLevelData(this.level)).effectPowders; + var powders = ((LevelData) ILevelData.getLevelData(this.level)).effectPowders; if (this.lastEffect != null) { - List> oldList = powders.get(this.lastEffect); - oldList.removeIf(t -> this.getPositionVec().equals(t.getA())); + var oldList = powders.get(this.lastEffect); + oldList.removeIf(t -> this.getEyePosition().equals(t.getA())); } - ResourceLocation effect = this.getInhibitedEffect(); + var effect = this.getInhibitedEffect(); if (effect != null) { - List> newList = powders.get(effect); - newList.add(new Tuple<>(this.getPositionVec(), this.getAmount())); + var newList = powders.get(effect); + newList.add(new Tuple<>(this.getEyePosition(), this.getAmount())); } this.powderListDirty = false; this.lastEffect = effect; diff --git a/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java b/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java index 724f541d..89eaf7ad 100644 --- a/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java +++ b/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java @@ -4,34 +4,33 @@ import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketParticles; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.item.minecart.AbstractMinecartEntity; -import net.minecraft.item.ItemStack; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.INBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.nbt.LongNBT; -import net.minecraft.network.IPacket; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Mth; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.level.GameRules; -import net.minecraft.level.Level; -import net.minecraft.level.server.ServerLevel; -import net.minecraftforge.common.util.Constants; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.LongTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.util.ITeleporter; -import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.network.NetworkHooks; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -public class EntityMoverMinecart extends AbstractMinecartEntity { +public class EntityMoverMinecart extends AbstractMinecart { private final List spotOffsets = new ArrayList<>(); public boolean isActive; @@ -50,14 +49,14 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { super.moveMinecartOnRail(railPos); if (!this.isActive) return; - BlockPos pos = this.getPosition(); + BlockPos pos = this.getOnPos(); if (!this.spotOffsets.isEmpty() && this.level.getGameTime() % 10 == 0) PacketHandler.sendToAllAround(this.level, pos, 32, new PacketParticles( - (float) this.getPosX(), (float) this.getPosY(), (float) this.getPosZ(), PacketParticles.Type.MOVER_CART, - Mth.floor(this.getMotion().getX() * 100F), Mth.floor(this.getMotion().getY() * 100F), Mth.floor(this.getMotion().getZ() * 100F))); + (float) this.getX(), (float) this.getY(), (float) this.getZ(), PacketParticles.Type.MOVER_CART, + Mth.floor(this.getDeltaMovement().x * 100F), Mth.floor(this.getDeltaMovement().y * 100F), Mth.floor(this.getDeltaMovement().z * 100F))); - if (pos.distanceSq(this.lastPosition) < 8 * 8) + if (pos.distSqr(this.lastPosition) < 8 * 8) return; this.moveAura(this.level, this.lastPosition, this.level, pos); @@ -66,7 +65,7 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { private void moveAura(Level oldLevel, BlockPos oldPos, Level newLevel, BlockPos newPos) { for (BlockPos offset : this.spotOffsets) { - BlockPos spot = oldPos.add(offset); + BlockPos spot = oldPos.offset(offset); IAuraChunk chunk = IAuraChunk.getAuraChunk(oldLevel, spot); int amount = chunk.getDrainSpot(spot); if (amount <= 0) @@ -76,17 +75,17 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { if (drained <= 0) continue; int toLose = Mth.ceil(drained / 250F); - BlockPos newSpot = newPos.add(offset); + BlockPos newSpot = newPos.offset(offset); IAuraChunk.getAuraChunk(newLevel, newSpot).storeAura(newSpot, drained - toLose, false, false); } } @Override - public void onActivatorRailPass(int x, int y, int z, boolean receivingPower) { + public void activateMinecart(int x, int y, int z, boolean receivingPower) { if (this.isActive != receivingPower) { this.isActive = receivingPower; - BlockPos pos = this.getPosition(); + BlockPos pos = this.getOnPos(); if (!this.isActive) { this.moveAura(this.level, this.lastPosition, this.level, pos); this.spotOffsets.clear(); @@ -103,21 +102,21 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { } @Override - public void killMinecart(DamageSource source) { - this.remove(); - if (this.level.getGameRules().getBoolean(GameRules.DO_ENTITY_DROPS)) - this.entityDropItem(new ItemStack(ModItems.MOVER_CART), 0); + public void destroy(DamageSource source) { + this.kill(); + if (this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) + this.spawnAtLocation(new ItemStack(ModItems.MOVER_CART), 0); } @Override public CompoundTag serializeNBT() { CompoundTag compound = super.serializeNBT(); compound.putBoolean("active", this.isActive); - compound.putLong("last_pos", this.lastPosition.toLong()); + compound.putLong("last_pos", this.lastPosition.asLong()); - ListNBT list = new ListNBT(); + ListTag list = new ListTag(); for (BlockPos offset : this.spotOffsets) - list.add(LongNBT.valueOf(offset.toLong())); + list.add(LongTag.valueOf(offset.asLong())); compound.put("offsets", list); return compound; } @@ -126,12 +125,12 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { public void deserializeNBT(CompoundTag compound) { super.deserializeNBT(compound); this.isActive = compound.getBoolean("active"); - this.lastPosition = BlockPos.fromLong(compound.getLong("last_pos")); + this.lastPosition = BlockPos.of(compound.getLong("last_pos")); this.spotOffsets.clear(); - ListNBT list = compound.getList("offsets", Constants.NBT.TAG_LONG); - for (INBT base : list) - this.spotOffsets.add(BlockPos.fromLong(((LongNBT) base).getLong())); + ListTag list = compound.getList("offsets", Tag.TAG_LONG); + for (Tag base : list) + this.spotOffsets.add(BlockPos.of(((LongTag) base).getAsLong())); } @Nullable @@ -139,7 +138,7 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { public Entity changeDimension(ServerLevel destination, ITeleporter teleporter) { Entity entity = super.changeDimension(destination, teleporter); if (entity instanceof EntityMoverMinecart) { - BlockPos pos = entity.getPosition(); + BlockPos pos = entity.getOnPos(); this.moveAura(this.level, this.lastPosition, entity.level, pos); ((EntityMoverMinecart) entity).lastPosition = pos; } @@ -147,8 +146,8 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { } @Override - public BlockState getDisplayTile() { - return Blocks.STONE.getDefaultState(); + public BlockState getDisplayBlockState() { + return Blocks.STONE.defaultBlockState(); } @Override @@ -162,7 +161,7 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { } @Override - public ItemStack getPickedResult(RayTraceResult target) { + public ItemStack getPickedResult(HitResult target) { return new ItemStack(ModItems.MOVER_CART); } @@ -172,13 +171,13 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { } @Override - protected void applyDrag() { - Vector3d motion = this.getMotion(); - this.setMotion(motion.x * 0.99F, 0, motion.z * 0.99F); + protected void applyNaturalSlowdown() { + Vec3 motion = this.getDeltaMovement(); + this.setDeltaMovement(motion.x * 0.99F, 0, motion.z * 0.99F); } @Override - public IPacket createSpawnPacket() { + public Packet getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } } diff --git a/src/main/java/de/ellpeck/naturesaura/entities/ModEntities.java b/src/main/java/de/ellpeck/naturesaura/entities/ModEntities.java index fae14d11..131d979c 100644 --- a/src/main/java/de/ellpeck/naturesaura/entities/ModEntities.java +++ b/src/main/java/de/ellpeck/naturesaura/entities/ModEntities.java @@ -1,9 +1,10 @@ package de.ellpeck.naturesaura.entities; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; @SuppressWarnings("FieldNamingConvention") public final class ModEntities { + public static EntityType MOVER_CART; public static EntityType EFFECT_INHIBITOR; public static EntityType LIGHT_PROJECTILE; diff --git a/src/main/java/de/ellpeck/naturesaura/items/ItemColorChanger.java b/src/main/java/de/ellpeck/naturesaura/items/ItemColorChanger.java index adce45b7..3680d6c8 100644 --- a/src/main/java/de/ellpeck/naturesaura/items/ItemColorChanger.java +++ b/src/main/java/de/ellpeck/naturesaura/items/ItemColorChanger.java @@ -8,12 +8,11 @@ import de.ellpeck.naturesaura.reg.ICustomItemModel; import net.minecraft.block.Block; import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.entity.player.Player; -import net.minecraft.item.DyeColor; -import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; import net.minecraft.level.Level; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/de/ellpeck/naturesaura/items/ItemEffectPowder.java b/src/main/java/de/ellpeck/naturesaura/items/ItemEffectPowder.java index 0f9f8f77..3f26973b 100644 --- a/src/main/java/de/ellpeck/naturesaura/items/ItemEffectPowder.java +++ b/src/main/java/de/ellpeck/naturesaura/items/ItemEffectPowder.java @@ -3,17 +3,17 @@ package de.ellpeck.naturesaura.items; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.entities.EntityEffectInhibitor; import de.ellpeck.naturesaura.reg.IColorProvidingItem; -import net.minecraft.client.renderer.color.IItemColor; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; -import net.minecraft.util.InteractionResult; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.level.Level; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.core.NonNullList; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -38,11 +38,11 @@ public class ItemEffectPowder extends ItemImpl implements IColorProvidingItem { } @Override - public InteractionResult onItemUse(ItemUseContext context) { + public InteractionResult useOn(UseOnContext context) { Level level = context.getLevel(); if (!level.isClientSide) { - Vector3d hit = context.getHitVec(); - ItemStack stack = context.getPlayer().getHeldItem(context.getHand()); + Vec3 hit = context.getClickLocation(); + ItemStack stack = context.getPlayer().getItemInHand(context.getHand()); EntityEffectInhibitor.place(level, stack, hit.x, hit.y + 1, hit.z); stack.setCount(0); } @@ -50,8 +50,8 @@ public class ItemEffectPowder extends ItemImpl implements IColorProvidingItem { } @Override - public void fillItemGroup(ItemGroup tab, NonNullList items) { - if (this.isInGroup(tab)) { + public void fillItemCategory(CreativeModeTab tab, NonNullList items) { + if (this.allowdedIn(tab)) { for (ResourceLocation effect : NaturesAuraAPI.EFFECT_POWDERS.keySet()) { ItemStack stack = new ItemStack(this); setEffect(stack, effect); @@ -61,13 +61,13 @@ public class ItemEffectPowder extends ItemImpl implements IColorProvidingItem { } @Override - public ITextComponent getDisplayName(ItemStack stack) { - return new TranslationTextComponent(this.getTranslationKey(stack) + "." + getEffect(stack)); + public Component getName(ItemStack stack) { + return new TranslatableComponent(this.getDescriptionId(stack) + "." + getEffect(stack)); } @Override @OnlyIn(Dist.CLIENT) - public IItemColor getItemColor() { + public ItemColor getItemColor() { return (stack, tintIndex) -> NaturesAuraAPI.EFFECT_POWDERS.getOrDefault(getEffect(stack), 0xFFFFFF); } } diff --git a/src/main/java/de/ellpeck/naturesaura/particles/ParticleMagic.java b/src/main/java/de/ellpeck/naturesaura/particles/ParticleMagic.java index 245b8884..dfda2a54 100644 --- a/src/main/java/de/ellpeck/naturesaura/particles/ParticleMagic.java +++ b/src/main/java/de/ellpeck/naturesaura/particles/ParticleMagic.java @@ -2,10 +2,10 @@ package de.ellpeck.naturesaura.particles; import com.mojang.blaze3d.vertex.IVertexBuilder; import de.ellpeck.naturesaura.NaturesAura; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.IParticleRenderType; import net.minecraft.client.particle.Particle; import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.level.ClientLevel; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraft.util.ReuseableStream; diff --git a/src/main/java/de/ellpeck/naturesaura/proxy/ClientProxy.java b/src/main/java/de/ellpeck/naturesaura/proxy/ClientProxy.java index 80744678..96835f13 100644 --- a/src/main/java/de/ellpeck/naturesaura/proxy/ClientProxy.java +++ b/src/main/java/de/ellpeck/naturesaura/proxy/ClientProxy.java @@ -12,31 +12,25 @@ import de.ellpeck.naturesaura.particles.ParticleMagic; import de.ellpeck.naturesaura.reg.*; import de.ellpeck.naturesaura.renderers.PlayerLayerTrinkets; import de.ellpeck.naturesaura.renderers.SupporterFancyHandler; -import net.minecraft.block.Block; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScreenManager; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.color.IItemColor; -import net.minecraft.client.renderer.color.ItemColors; -import net.minecraft.client.renderer.entity.PlayerRenderer; -import net.minecraft.client.renderer.tileentity.BlockEntityRenderer; -import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.item.Item; -import net.minecraft.item.ItemModelsProperties; -import net.minecraft.tileentity.BlockEntity; -import net.minecraft.tileentity.BlockEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Tuple; +import net.minecraft.client.color.item.ItemColor; +import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.EntityRenderers; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.client.registry.IRenderFactory; -import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import java.util.Map; -import java.util.function.Function; import java.util.function.Supplier; public class ClientProxy implements IProxy { @@ -45,20 +39,22 @@ public class ClientProxy implements IProxy { public void preInit(FMLCommonSetupEvent event) { MinecraftForge.EVENT_BUS.register(new ClientEvents()); Compat.setupClient(); - ScreenManager.registerFactory(ModContainers.ENDER_CRATE, GuiEnderCrate::new); - ScreenManager.registerFactory(ModContainers.ENDER_ACCESS, GuiEnderCrate::new); + MenuScreens.register(ModContainers.ENDER_CRATE, GuiEnderCrate::new); + MenuScreens.register(ModContainers.ENDER_ACCESS, GuiEnderCrate::new); - ItemModelsProperties.func_239418_a_(ModItems.COLOR_CHANGER, new ResourceLocation(NaturesAura.MOD_ID, "fill_mode"), + ItemProperties.register(ModItems.COLOR_CHANGER, new ResourceLocation(NaturesAura.MOD_ID, "fill_mode"), (stack, levelIn, entityIn) -> ItemColorChanger.isFillMode(stack) ? 1F : 0F); - ItemModelsProperties.func_239418_a_(ModItems.COLOR_CHANGER, new ResourceLocation(NaturesAura.MOD_ID, "has_color"), + ItemProperties.register(ModItems.COLOR_CHANGER, new ResourceLocation(NaturesAura.MOD_ID, "has_color"), (stack, levelIn, entityIn) -> ItemColorChanger.getStoredColor(stack) != null ? 1F : 0F); } @Override public void init(FMLCommonSetupEvent event) { - Map skinMap = Minecraft.getInstance().getRenderManager().getSkinMap(); - for (PlayerRenderer render : new PlayerRenderer[]{skinMap.get("default"), skinMap.get("slim")}) - render.addLayer(new PlayerLayerTrinkets(render)); + var skinMap = Minecraft.getInstance().getEntityRenderDispatcher().getSkinMap(); + for (var render : new EntityRenderer[]{skinMap.get("default"), skinMap.get("slim")}) { + if (render instanceof PlayerRenderer living) + living.addLayer(new PlayerLayerTrinkets(living)); + } new SupporterFancyHandler(); } @@ -66,14 +62,14 @@ public class ClientProxy implements IProxy { public void postInit(FMLCommonSetupEvent event) { for (IModItem item : ModRegistry.ALL_ITEMS) { if (item instanceof ICustomRenderType) - RenderTypeLookup.setRenderLayer((Block) item, ((ICustomRenderType) item).getRenderType().get()); + ItemBlockRenderTypes.setRenderLayer((Block) item, ((ICustomRenderType) item).getRenderType().get()); } } @Override public void addColorProvidingItem(IColorProvidingItem item) { ItemColors colors = Minecraft.getInstance().getItemColors(); - IItemColor color = item.getItemColor(); + ItemColor color = item.getItemColor(); if (item instanceof Item) { colors.register(color, (Item) item); @@ -84,15 +80,14 @@ public class ClientProxy implements IProxy { @Override public void addColorProvidingBlock(IColorProvidingBlock block) { - if (block instanceof Block) { + if (block instanceof Block) Minecraft.getInstance().getBlockColors().register(block.getBlockColor(), (Block) block); - } } @Override - public void registerTESR(ITESRProvider provider) { - Tuple, Supplier>>> tesr = provider.getTESR(); - ClientRegistry.bindBlockEntityRenderer(tesr.getA(), tesr.getB().get()); + public void registerTESR(ITESRProvider provider) { + var tesr = provider.getTESR(); + BlockEntityRenderers.register(tesr.getA(), tesr.getB().get()); } @Override @@ -119,8 +114,8 @@ public class ClientProxy implements IProxy { } @Override - public void registerEntityRenderer(EntityType entityClass, Supplier> renderFactory) { - RenderingRegistry.registerEntityRenderingHandler(entityClass, renderFactory.get()); + public void registerEntityRenderer(EntityType entityClass, Supplier> renderFactory) { + EntityRenderers.register(entityClass, renderFactory.get()); } } \ No newline at end of file diff --git a/src/main/java/de/ellpeck/naturesaura/proxy/IProxy.java b/src/main/java/de/ellpeck/naturesaura/proxy/IProxy.java index aee2ef26..a159cb68 100644 --- a/src/main/java/de/ellpeck/naturesaura/proxy/IProxy.java +++ b/src/main/java/de/ellpeck/naturesaura/proxy/IProxy.java @@ -3,14 +3,15 @@ package de.ellpeck.naturesaura.proxy; import de.ellpeck.naturesaura.reg.IColorProvidingBlock; import de.ellpeck.naturesaura.reg.IColorProvidingItem; import de.ellpeck.naturesaura.reg.ITESRProvider; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraftforge.fml.client.registry.IRenderFactory; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import java.util.function.Supplier; public interface IProxy { + void preInit(FMLCommonSetupEvent event); void init(FMLCommonSetupEvent event); @@ -21,7 +22,7 @@ public interface IProxy { void addColorProvidingBlock(IColorProvidingBlock block); - void registerTESR(ITESRProvider provider); + void registerTESR(ITESRProvider provider); void spawnMagicParticle(double posX, double posY, double posZ, double motionX, double motionY, double motionZ, int color, float scale, int maxAge, float gravity, boolean collision, boolean fade); @@ -31,6 +32,5 @@ public interface IProxy { void setParticleCulling(boolean cull); - void registerEntityRenderer(EntityType entityClass, Supplier> renderFactory); - + void registerEntityRenderer(EntityType entityClass, Supplier> renderFactory); } diff --git a/src/main/java/de/ellpeck/naturesaura/reg/IColorProvidingBlock.java b/src/main/java/de/ellpeck/naturesaura/reg/IColorProvidingBlock.java index 6d4202c4..878a9c2d 100644 --- a/src/main/java/de/ellpeck/naturesaura/reg/IColorProvidingBlock.java +++ b/src/main/java/de/ellpeck/naturesaura/reg/IColorProvidingBlock.java @@ -1,12 +1,12 @@ package de.ellpeck.naturesaura.reg; -import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.client.color.block.BlockColor; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public interface IColorProvidingBlock { @OnlyIn(Dist.CLIENT) - IBlockColor getBlockColor(); + BlockColor getBlockColor(); } diff --git a/src/main/java/de/ellpeck/naturesaura/reg/ITESRProvider.java b/src/main/java/de/ellpeck/naturesaura/reg/ITESRProvider.java index 40500949..7b781bb5 100644 --- a/src/main/java/de/ellpeck/naturesaura/reg/ITESRProvider.java +++ b/src/main/java/de/ellpeck/naturesaura/reg/ITESRProvider.java @@ -1,19 +1,17 @@ package de.ellpeck.naturesaura.reg; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.util.Tuple; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import java.util.function.Function; import java.util.function.Supplier; public interface ITESRProvider { @OnlyIn(Dist.CLIENT) - Tuple, Supplier>>> getTESR(); + Tuple, Supplier>> getTESR(); } diff --git a/src/main/java/de/ellpeck/naturesaura/renderers/PlayerLayerTrinkets.java b/src/main/java/de/ellpeck/naturesaura/renderers/PlayerLayerTrinkets.java index e3f0f2a1..45df7a21 100644 --- a/src/main/java/de/ellpeck/naturesaura/renderers/PlayerLayerTrinkets.java +++ b/src/main/java/de/ellpeck/naturesaura/renderers/PlayerLayerTrinkets.java @@ -1,85 +1,83 @@ package de.ellpeck.naturesaura.renderers; -import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.api.render.ITrinketItem; import de.ellpeck.naturesaura.api.render.ITrinketItem.RenderType; -import de.ellpeck.naturesaura.compat.Compat; -import net.minecraft.client.entity.player.AbstractClientPlayer; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.entity.IEntityRenderer; -import net.minecraft.client.renderer.entity.layers.LayerRenderer; -import net.minecraft.client.renderer.entity.model.PlayerModel; -import net.minecraft.entity.Pose; -import net.minecraft.entity.player.Player; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Effects; -import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.items.IItemHandler; -import top.theillusivec4.curios.api.CuriosApi; import java.util.HashSet; import java.util.Set; @OnlyIn(Dist.CLIENT) -public class PlayerLayerTrinkets extends LayerRenderer> { +public class PlayerLayerTrinkets extends RenderLayer> { private final Set alreadyRendered = new HashSet<>(); - public PlayerLayerTrinkets(IEntityRenderer> entityRendererIn) { - super(entityRendererIn); + public PlayerLayerTrinkets(RenderLayerParent> p_117346_) { + super(p_117346_); } @Override - public void render(MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn, AbstractClientPlayer player, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + public void render(PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn, AbstractClientPlayer player, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { if (!ModConfig.instance.renderItemsOnPlayer.get()) return; - if (player.getActivePotionEffect(Effects.INVISIBILITY) != null) + if (player.getEffect(MobEffects.INVISIBILITY) != null) return; - ItemStack main = player.getHeldItemMainhand(); - ItemStack second = player.getHeldItemOffhand(); + var main = player.getMainHandItem(); + var second = player.getOffhandItem(); this.alreadyRendered.clear(); - matrixStackIn.push(); + matrixStackIn.pushPose(); this.render(player, RenderType.BODY, main, second, matrixStackIn, bufferIn, packedLightIn); - float yaw = player.prevRotationYawHead + (player.rotationYawHead - player.prevRotationYawHead) * partialTicks; - float yawOffset = player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialTicks; - float pitch = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * partialTicks; - matrixStackIn.rotate(Vector3f.YN.rotationDegrees(yawOffset)); - matrixStackIn.rotate(Vector3f.YP.rotationDegrees(yaw - 270)); - matrixStackIn.rotate(Vector3f.ZP.rotationDegrees(pitch)); + var yaw = player.yHeadRotO + (player.yHeadRot - player.yHeadRotO) * partialTicks; + var yawOffset = player.yBodyRotO + (player.yBodyRot - player.yBodyRotO) * partialTicks; + var pitch = player.xRotO + (player.getXRot() - player.xRotO) * partialTicks; + matrixStackIn.mulPose(Vector3f.YN.rotationDegrees(yawOffset)); + matrixStackIn.mulPose(Vector3f.YP.rotationDegrees(yaw - 270)); + matrixStackIn.mulPose(Vector3f.ZP.rotationDegrees(pitch)); this.render(player, RenderType.HEAD, main, second, matrixStackIn, bufferIn, packedLightIn); - matrixStackIn.pop(); + matrixStackIn.popPose(); } - private void render(Player player, RenderType type, ItemStack main, ItemStack second, MatrixStack matrices, IRenderTypeBuffer buffer, int packedLight) { - for (int i = 0; i < player.inventory.getSizeInventory(); i++) { - this.renderStack(player.inventory.getStackInSlot(i), player, type, main, second, matrices, buffer, packedLight); + private void render(Player player, RenderType type, ItemStack main, ItemStack second, PoseStack matrices, MultiBufferSource buffer, int packedLight) { + for (var i = 0; i < player.getInventory().getContainerSize(); i++) { + this.renderStack(player.getInventory().getItem(i), player, type, main, second, matrices, buffer, packedLight); } - if (Compat.hasCompat("curios")) { + // TODO Curios + /* if (Compat.hasCompat("curios")) { IItemHandler handler = CuriosApi.getCuriosHelper().getEquippedCurios(player).orElse(null); if (handler != null) { for (int i = 0; i < handler.getSlots(); i++) this.renderStack(handler.getStackInSlot(i), player, type, main, second, matrices, buffer, packedLight); } - } + }*/ } - private void renderStack(ItemStack stack, Player player, RenderType type, ItemStack main, ItemStack second, MatrixStack matrices, IRenderTypeBuffer buffer, int packedLight) { + private void renderStack(ItemStack stack, Player player, RenderType type, ItemStack main, ItemStack second, PoseStack matrices, MultiBufferSource buffer, int packedLight) { if (!stack.isEmpty()) { - Item item = stack.getItem(); + var item = stack.getItem(); if (item instanceof ITrinketItem && !this.alreadyRendered.contains(item)) { - matrices.push(); + matrices.pushPose(); if (type == RenderType.BODY && player.getPose() == Pose.CROUCHING) { matrices.translate(0F, 0.2F, 0F); - matrices.rotate(Vector3f.XP.rotationDegrees(90F / (float) Math.PI)); + matrices.mulPose(Vector3f.XP.rotationDegrees(90F / (float) Math.PI)); } ((ITrinketItem) item).render(stack, player, type, matrices, buffer, packedLight, stack == main || stack == second); - matrices.pop(); + matrices.popPose(); this.alreadyRendered.add(item); } }