From 63024abef346199a35e7976dd435d0c502463f73 Mon Sep 17 00:00:00 2001 From: Carlos Hugo Date: Fri, 19 Jan 2024 02:06:07 +0100 Subject: [PATCH 1/3] initial migration to 1.20.4 updated dependencies code adapted to new mappings removed forge version because i can't be bothered with it --- build.gradle | 2 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- marketcrates-common/build.gradle | 39 +--- marketcrates-common/gradle.properties | 8 +- .../blocks/AbstractCrateBlock.java | 187 +++++++++--------- .../blocks/AbstractCrateBlockEntity.java | 97 +++++---- .../marketcrates/blocks/states/CrateType.java | 15 +- .../blocks/states/CrateTypeProperty.java | 3 +- .../marketcrates/common/ClientProxy.java | 8 +- .../marketcrates/common/CommonProxy.java | 4 +- .../common/IMarketCratesProxy.java | 4 +- .../marketcrates/common/ItemOrientation.java | 74 +++---- .../marketcrates/common/OrientationList.java | 5 +- .../marketcrates/gui/BaseCrateContainer.java | 52 ++--- .../marketcrates/gui/BaseCrateScreen.java | 37 ++-- .../marketcrates/gui/CrateDoubleScreen.java | 12 +- .../lfaoanl/marketcrates/gui/CrateScreen.java | 12 +- .../lfaoanl/marketcrates/items/CrateItem.java | 22 +-- .../render/CrateBlockEntityRenderer.java | 60 +++--- marketcrates-fabric/build.gradle | 11 +- marketcrates-fabric/gradle.properties | 13 +- .../marketcrates/blocks/CrateBlock.java | 32 ++- .../marketcrates/blocks/CrateBlockEntity.java | 28 +-- .../client/MarketCratesFabricClient.java | 16 +- .../marketcrates/core/CrateRegistry.java | 45 ++--- .../marketcrates/gui/CrateContainer.java | 17 +- .../gui/CrateDoubleContainer.java | 16 +- .../src/main/resources/fabric.mod.json | 6 +- marketcrates-forge/LICENSE | 13 -- marketcrates-forge/build.gradle | 173 ---------------- .../marketcrates/MarketCratesForge.java | 53 ----- .../marketcrates/blocks/CrateBlock.java | 27 --- .../marketcrates/blocks/CrateBlockEntity.java | 43 ---- .../marketcrates/core/CrateRegistry.java | 70 ------- .../marketcrates/core/ForgeClientProxy.java | 23 --- .../marketcrates/data/CrateBlockStates.java | 70 ------- .../marketcrates/data/CrateDataGenerator.java | 28 --- .../data/CrateItemModelProvider.java | 36 ---- .../data/CrateLootTableProvider.java | 118 ----------- .../data/CrateRecipeProvider.java | 61 ------ .../marketcrates/gui/CrateContainer.java | 23 --- .../gui/CrateDoubleContainer.java | 21 -- .../network/CratesPacketHandler.java | 50 ----- .../network/packets/CrateItemsPacket.java | 50 ----- .../src/main/resources/META-INF/mods.toml | 39 ---- .../src/main/resources/pack.mcmeta | 7 - settings.gradle | 5 +- 48 files changed, 404 insertions(+), 1335 deletions(-) delete mode 100644 marketcrates-forge/LICENSE delete mode 100644 marketcrates-forge/build.gradle delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/MarketCratesForge.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/ForgeClientProxy.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateBlockStates.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateDataGenerator.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateItemModelProvider.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateLootTableProvider.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateRecipeProvider.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/CratesPacketHandler.java delete mode 100644 marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/packets/CrateItemsPacket.java delete mode 100644 marketcrates-forge/src/main/resources/META-INF/mods.toml delete mode 100644 marketcrates-forge/src/main/resources/pack.mcmeta diff --git a/build.gradle b/build.gradle index e03118b..3cab72f 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group = 'com.lfaoanl' -version = '1.3' +version = '1.4' subprojects { apply plugin: 'java-library' diff --git a/gradle.properties b/gradle.properties index db4604f..af0af10 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -javaVersion=16 +javaVersion=17 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 05679dc..a595206 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/marketcrates-common/build.gradle b/marketcrates-common/build.gradle index e750721..87ef96b 100644 --- a/marketcrates-common/build.gradle +++ b/marketcrates-common/build.gradle @@ -1,35 +1,14 @@ -//plugins { -// id 'fabric-loom' version '0.10-SNAPSHOT' -// id 'maven-publish' -//} -//dependencies { -// // To change the versions see the gradle.properties file -// minecraft "com.mojang:minecraft:${project.minecraft_version}" -// mappings loom.officialMojangMappings() -// -//} -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - } +plugins { + id 'fabric-loom' version '1.5-SNAPSHOT' + id 'maven-publish' +} +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" } - -apply plugin: 'net.minecraftforge.gradle' - java { archivesBaseName = 'marketcrates-common' - toolchain.languageVersion = JavaLanguageVersion.of(16) + toolchain.languageVersion = JavaLanguageVersion.of(17) } -minecraft { - mappings channel: 'official', version: '1.17.1' -} - -dependencies { - minecraft 'net.minecraftforge:forge:1.17.1-37.0.109' -} \ No newline at end of file diff --git a/marketcrates-common/gradle.properties b/marketcrates-common/gradle.properties index 83b60d9..db0f6f0 100644 --- a/marketcrates-common/gradle.properties +++ b/marketcrates-common/gradle.properties @@ -3,13 +3,13 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.17.1 -yarn_mappings=1.17.1+build.63 -loader_version=0.12.5 +minecraft_version=1.20.4 +yarn_mappings=1.20.4+build.3 +loader_version=0.15.6 # Mod Properties archives_base_name = marketcrates-common # Dependencies # check this on https://modmuss50.me/fabric.html -fabric_version=0.42.1+1.17 +fabric_version=0.94.1+1.20.4 diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java index 0c6fbcc..b130789 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java @@ -3,94 +3,91 @@ import com.lfaoanl.marketcrates.blocks.states.CrateType; import com.lfaoanl.marketcrates.blocks.states.CrateTypeProperty; import com.lfaoanl.marketcrates.common.ItemOrientation; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.NonNullList; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.Containers; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.AxeItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Explosion; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.BlockEntity; -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.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.pathfinder.PathComputationType; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.block.*; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.ai.pathing.NavigationType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.*; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameterSet; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.*; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.explosion.Explosion; +import net.minecraft.world.tick.OrderedTick; import java.util.List; -public abstract class AbstractCrateBlock extends BaseEntityBlock implements SimpleWaterloggedBlock { +public abstract class AbstractCrateBlock extends BlockWithEntity implements Waterloggable { - private static final Properties properties = Properties.of(Material.WOOD).strength(2.5F).sound(SoundType.WOOD); + public static final Settings properties = Settings.create().strength(2.5F).sounds(BlockSoundGroup.WOOD); - public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; public static final CrateTypeProperty TYPE = CrateTypeProperty.create("type"); - public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; private static final Item inclinable = Items.STICK; - private NonNullList oldItems; + private DefaultedList oldItems; public AbstractCrateBlock() { super(properties); - this.registerDefaultState(this.defaultBlockState() - .setValue(FACING, Direction.NORTH) - .setValue(TYPE, CrateType.DEFAULT) - .setValue(WATERLOGGED, false)); + this.setDefaultState(this.getDefaultState() + .with(FACING, Direction.NORTH) + .with(TYPE, CrateType.DEFAULT) + .with(WATERLOGGED, false)); } - protected void createBlockStateDefinition(StateDefinition.Builder builder) { + public AbstractCrateBlock(Settings settings) { + super(settings); + } + + protected void appendProperties(StateManager.Builder builder) { builder.add(FACING); builder.add(TYPE); builder.add(WATERLOGGED); } public FluidState getFluidState(BlockState state) { - return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); } - public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, LevelAccessor worldIn, BlockPos currentPos, BlockPos facingPos) { - if (stateIn.getValue(WATERLOGGED)) { - worldIn.getLiquidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(worldIn)); + public BlockState getStateForNeighborUpdate(BlockState stateIn, Direction facing, BlockState facingState, WorldAccess worldIn, BlockPos currentPos, BlockPos facingPos) { + if (stateIn.get(WATERLOGGED)) { + worldIn.getFluidTickScheduler().scheduleTick(OrderedTick.create(Fluids.WATER, currentPos)); } - return super.updateShape(stateIn, facing, facingState, worldIn, currentPos, facingPos); + return super.getStateForNeighborUpdate(stateIn, facing, facingState, worldIn, currentPos, facingPos); } @Override - public boolean isPathfindable(BlockState state, BlockGetter worldIn, BlockPos pos, PathComputationType type) { + public boolean canPathfindThrough(BlockState state, BlockView worldIn, BlockPos pos, NavigationType type) { return false; } @Override - public boolean useShapeForLightOcclusion(BlockState state) { + public boolean hasSidedTransparency(BlockState state) { return true; } @@ -103,120 +100,120 @@ public boolean useShapeForLightOcclusion(BlockState state) { * @return */ @Override - public int getLightBlock(BlockState state, BlockGetter worldIn, BlockPos pos) { + public int getOpacity(BlockState state, BlockView worldIn, BlockPos pos) { return 1; } - public BlockState getStateForPlacement(BlockPlaceContext context) { - FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); - boolean isWaterLogged = fluidstate.getType() == Fluids.WATER; - return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()).setValue(WATERLOGGED, isWaterLogged); + public BlockState getPlacementState(ItemPlacementContext context) { + FluidState fluidstate = context.getWorld().getFluidState(context.getBlockPos()); + boolean isWaterLogged = fluidstate.getFluid() == Fluids.WATER; + return this.getDefaultState().with(FACING, context.getHorizontalPlayerFacing().getOpposite()).with(WATERLOGGED, isWaterLogged); } @Override - public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { + public VoxelShape getOutlineShape(BlockState state, BlockView worldIn, BlockPos pos, ShapeContext context) { boolean horizontal = false; - if (state.getValue(FACING).getAxis() == Direction.Axis.X) { + if (state.get(FACING).getAxis() == Direction.Axis.X) { horizontal = true; } - return state.getValue(TYPE).getShape(horizontal); + return state.get(TYPE).getShape(horizontal); } - public BlockState rotate(BlockState state, Rotation rot) { - return state.setValue(FACING, rot.rotate(state.getValue(FACING))); + public BlockState rotate(BlockState state, BlockRotation rot) { + return state.with(FACING, rot.rotate(state.get(FACING))); } - public BlockState mirror(BlockState state, Mirror mirrorIn) { - return state.rotate(mirrorIn.getRotation(state.getValue(FACING))); + public BlockState mirror(BlockState state, BlockMirror mirrorIn) { + return state.rotate(mirrorIn.getRotation(state.get(FACING))); } @Override - public List getDrops(BlockState state, LootContext.Builder builder) { - return super.getDrops(state, builder); + public List getDroppedStacks(BlockState state, LootContextParameterSet.Builder builder) { + return super.getDroppedStacks(state, builder); } @Override - public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { if (state.getBlock() != newState.getBlock()) { // System.out.println("onReplaced"); BlockEntity tileentity = world.getBlockEntity(pos); if (tileentity instanceof AbstractCrateBlockEntity) { - if (state.getValue(TYPE).isDouble()) { - Containers.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), getBlockItem()); + if (state.get(TYPE).isDouble()) { + ItemScatterer.spawn(world, pos.getX(), pos.getY(), pos.getZ(), getBlockItem()); } - Containers.dropContents(world, pos, (AbstractCrateBlockEntity) tileentity); + ItemScatterer.spawn(world, pos, (AbstractCrateBlockEntity) tileentity); // worldIn.updateComparatorOutputLevel(pos, this); TODO this.oldItems = ((AbstractCrateBlockEntity) world.getBlockEntity(pos)).getItems(); } - super.onRemove(state, world, pos, newState, isMoving); + super.onStateReplaced(state, world, pos, newState, isMoving); } } public ItemStack getBlockItem() { - return new ItemStack(Item.byBlock(this)); + return new ItemStack(Item.fromBlock(this)); } //@Override - public void onBlockExploded(BlockState state, Level world, BlockPos pos, Explosion explosion) { - if (state.getValue(TYPE).isDouble()) { + public void onBlockExploded(BlockState state, World world, BlockPos pos, Explosion explosion) { + if (state.get(TYPE).isDouble()) { for (int i = 0; i < 12; i++) { - Containers.dropItemStack((Level) world, pos.getX(), pos.getY(), pos.getZ(), oldItems.get(i).getItemStack()); + ItemScatterer.spawn((World) world, pos.getX(), pos.getY(), pos.getZ(), oldItems.get(i).getItemStack()); } oldItems = null; } } @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockHitResult hit) { - CrateType crateType = state.getValue(TYPE); - ItemStack heldItem = player.getMainHandItem(); + CrateType crateType = state.get(TYPE); + ItemStack heldItem = player.getMainHandStack(); if (!crateType.isDouble() && player.isCreative() && heldItem.getItem() == inclinable) { - world.setBlockAndUpdate(pos, state.setValue(TYPE, crateType.opposite())); - return InteractionResult.CONSUME; + world.setBlockState(pos, state.with(TYPE, crateType.opposite())); + return ActionResult.CONSUME; } - if (!world.isClientSide) { + if (!world.isClient) { openGui(state, world, player, pos); - return InteractionResult.CONSUME; + return ActionResult.CONSUME; } - return InteractionResult.SUCCESS; + return ActionResult.SUCCESS; } - protected abstract void openGui(BlockState state, Level world, Player player, BlockPos pos); + protected abstract void openGui(BlockState state, World world, PlayerEntity player, BlockPos pos); @Override - public void attack(BlockState state, Level world, BlockPos pos, Player player) { - CrateType crateType = state.getValue(TYPE); - ItemStack heldItem = player.getMainHandItem(); + public void onBlockBreakStart(BlockState state, World world, BlockPos pos, PlayerEntity player) { + CrateType crateType = state.get(TYPE); + ItemStack heldItem = player.getMainHandStack(); if (!player.isCreative() && !crateType.isDouble() && hasProperItem(crateType, heldItem)) { - SoundEvent blockSound = SoundEvents.WOOD_BREAK; + SoundEvent blockSound = SoundEvents.BLOCK_WOOD_BREAK; // Checks to see the current state and switches it if (crateType == CrateType.DEFAULT) { // Crate becomes inclined heldItem.setCount(heldItem.getCount() - 1); - blockSound = SoundEvents.WOOD_PLACE; + blockSound = SoundEvents.BLOCK_WOOD_PLACE; } else { // Crate becomes default - player.drop(new ItemStack(inclinable), false); + player.dropItem(new ItemStack(inclinable), false); } playSound(world, pos, player, blockSound); - world.setBlockAndUpdate(pos, state.setValue(TYPE, crateType.opposite())); + world.setBlockState(pos, state.with(TYPE, crateType.opposite())); } } - public void playSound(Level world, BlockPos pos, Player player, SoundEvent blockSound) { - world.playSound(player, pos.getX(), pos.getY(), pos.getZ(), blockSound, SoundSource.BLOCKS, 0.8f, 1.5f); + public void playSound(World world, BlockPos pos, PlayerEntity player, SoundEvent blockSound) { + world.playSound(player, pos.getX(), pos.getY(), pos.getZ(), blockSound, SoundCategory.BLOCKS, 0.8f, 1.5f); } /** @@ -251,8 +248,8 @@ private boolean hasProperItem(CrateType type, ItemStack heldItem) { * @return */ @Override - public RenderShape getRenderShape(BlockState blockState) { - return RenderShape.MODEL; + public BlockRenderType getRenderType(BlockState blockState) { + return BlockRenderType.MODEL; } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlockEntity.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlockEntity.java index 9f8061f..13a941f 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlockEntity.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlockEntity.java @@ -2,24 +2,21 @@ import com.lfaoanl.marketcrates.common.ItemOrientation; import com.lfaoanl.marketcrates.common.MarketCrates; -import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; - -public abstract class AbstractCrateBlockEntity extends BaseContainerBlockEntity { +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.LockableContainerBlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventories; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.text.Text; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.BlockPos; + +public abstract class AbstractCrateBlockEntity extends LockableContainerBlockEntity { // private NonNullList stacks = NonNullList.withSize(6, ItemStack.EMPTY); - protected NonNullList stacks = NonNullList.withSize(12, ItemOrientation.EMPTY); + protected DefaultedList stacks = DefaultedList.ofSize(12, ItemOrientation.EMPTY); private boolean isDouble = false; @@ -28,104 +25,102 @@ protected AbstractCrateBlockEntity(BlockEntityType blockEntityType, BlockPos } - public NonNullList getItems() { + public DefaultedList getItems() { return stacks; } public boolean isDoubleCrate() { - if (getBlockState().isAir()) { + if (getCachedState().isAir()) { return this.isDouble; } // Store items to be able to retreive it after the block is broken - this.isDouble = getBlockState().getValue(AbstractCrateBlock.TYPE).isDouble(); + this.isDouble = getCachedState().get(AbstractCrateBlock.TYPE).isDouble(); return this.isDouble; } - public void setItem(int index, ItemStack stack) { + public void setStack(int index, ItemStack stack) { this.getItems().set(index, new ItemOrientation(stack)); - if (stack.getCount() > this.getMaxStackSize()) { - stack.setCount(this.getMaxStackSize()); + if (stack.getCount() > this.getMaxCountPerStack()) { + stack.setCount(this.getMaxCountPerStack()); } - this.setChanged(); + this.markDirty(); } public boolean isEmpty() { return this.getItems().stream().allMatch(ItemOrientation::isEmpty); } - public ItemStack getItem(int index) { + public ItemStack getStack(int index) { // TODO increase size of `stacks` and check if crateIsDouble to allow the supplied index return this.getItems().get(index).getItemStack(); } - public ItemStack removeItem(int index, int count) { - ItemStack itemstack = ContainerHelper.removeItem(ItemOrientation.toItemStack(stacks), index, count); + public ItemStack removeStack(int index, int count) { + ItemStack itemstack = Inventories.splitStack(ItemOrientation.toItemStack(stacks), index, count); if (!itemstack.isEmpty()) { - this.setChanged(); + this.markDirty(); } return itemstack; } @Override - public void setChanged() { - super.setChanged(); + public void markDirty() { + super.markDirty(); sendContents(); } - public ItemStack removeItemNoUpdate(int index) { + public ItemStack removeStack(int index) { ItemOrientation orientation = index >= 0 && index < stacks.size() ? stacks.set(index, ItemOrientation.EMPTY) : ItemOrientation.EMPTY; return orientation.getItemStack(); } @Override - protected Component getDefaultName() { - return new TranslatableComponent("container.crate"); + protected Text getContainerName() { + return Text.translatable("container.crate"); } @Override - public int getContainerSize() { + public int size() { // if (isDoubleCrate()) { return 12; // } // return 6; } - public boolean stillValid(Player player) { - if (this.level.getBlockEntity(this.worldPosition) != this) { + public boolean canPlayerUse(PlayerEntity player) { + if (this.world.getBlockEntity(this.pos) != this) { return false; } else { - return !(player.distanceToSqr((double) this.worldPosition.getX() + 0.5D, (double) this.worldPosition.getY() + 0.5D, (double) this.worldPosition.getZ() + 0.5D) > 64.0D); + return !(player.squaredDistanceTo((double) this.pos.getX() + 0.5D, (double) this.pos.getY() + 0.5D, (double) this.pos.getZ() + 0.5D) > 64.0D); } } - public void clearContent() { + public void clear() { this.getItems().clear(); } - public void load(CompoundTag nbt) { - super.load(nbt); + public void readNbt(NbtCompound nbt) { + super.readNbt(nbt); this.stacks = loadFromNbt(nbt); } - private NonNullList loadFromNbt(CompoundTag nbt) { - NonNullList items = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); - ContainerHelper.loadAllItems(nbt, items); + private DefaultedList loadFromNbt(NbtCompound nbt) { + DefaultedList items = DefaultedList.ofSize(size(), ItemStack.EMPTY); + Inventories.readNbt(nbt, items); return ItemOrientation.toItemOrientation(items); } - public CompoundTag save(CompoundTag compound) { - super.save(compound); + public void writeNbt(NbtCompound compound) { + super.writeNbt(compound); - ContainerHelper.saveAllItems(compound, ItemOrientation.toItemStack(this.stacks)); - - return compound; + Inventories.writeNbt(compound, ItemOrientation.toItemStack(this.stacks)); } - public void receiveContents(NonNullList stacks) { + public void receiveContents(DefaultedList stacks) { MarketCrates.LOGGER.debug("Received packets"); MarketCrates.LOGGER.debug(stacks.get(0)); @@ -135,10 +130,10 @@ public void receiveContents(NonNullList stacks) { public abstract void sendContents(); @Override - public CompoundTag getUpdateTag() { - CompoundTag updateTag = super.getUpdateTag(); + public NbtCompound toInitialChunkDataNbt() { + NbtCompound updateTag = super.toInitialChunkDataNbt(); - ContainerHelper.saveAllItems(updateTag, ItemOrientation.toItemStack(stacks)); + Inventories.writeNbt(updateTag, ItemOrientation.toItemStack(stacks)); return updateTag; } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateType.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateType.java index e3ed2fe..ab3df51 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateType.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateType.java @@ -1,13 +1,12 @@ package com.lfaoanl.marketcrates.blocks.states; -import net.minecraft.world.level.block.Block; -import net.minecraft.util.StringRepresentable; -import net.minecraft.world.phys.shapes.VoxelShape; - import java.util.Arrays; import java.util.Collection; +import net.minecraft.block.Block; +import net.minecraft.util.StringIdentifiable; +import net.minecraft.util.shape.VoxelShape; -public enum CrateType implements StringRepresentable { +public enum CrateType implements StringIdentifiable { DEFAULT("default", 8d, false), INCLINED("inclined", 14d, true), @@ -34,15 +33,15 @@ public static Collection allValues() { } @Override - public String getSerializedName() { + public String asString() { return this.name; } public VoxelShape getShape(boolean horizontal) { if (horizontal) { - return Block.box(0.0D, 0.0D, 2.0D, 16.0D, height, 14.0D); + return Block.createCuboidShape(0.0D, 0.0D, 2.0D, 16.0D, height, 14.0D); } - return Block.box(2.0D, 0.0D, 0.0D, 14.0D, height, 16.0D); + return Block.createCuboidShape(2.0D, 0.0D, 0.0D, 14.0D, height, 16.0D); } public boolean isDouble() { diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateTypeProperty.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateTypeProperty.java index c7c6900..4fdd5d2 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateTypeProperty.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/states/CrateTypeProperty.java @@ -1,8 +1,7 @@ package com.lfaoanl.marketcrates.blocks.states; -import net.minecraft.world.level.block.state.properties.EnumProperty; - import java.util.Collection; +import net.minecraft.state.property.EnumProperty; public class CrateTypeProperty extends EnumProperty { diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ClientProxy.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ClientProxy.java index 7d922d5..1d199b4 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ClientProxy.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ClientProxy.java @@ -1,12 +1,12 @@ package com.lfaoanl.marketcrates.common; -import net.minecraft.client.Minecraft; -import net.minecraft.world.level.Level; +import net.minecraft.client.MinecraftClient; +import net.minecraft.world.World; public class ClientProxy implements IMarketCratesProxy { @Override - public Level getWorld() { - return Minecraft.getInstance().level; + public World getWorld() { + return MinecraftClient.getInstance().world; } } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/CommonProxy.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/CommonProxy.java index 9779a4c..1cbf766 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/CommonProxy.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/CommonProxy.java @@ -1,11 +1,11 @@ package com.lfaoanl.marketcrates.common; import com.lfaoanl.marketcrates.common.IMarketCratesProxy; -import net.minecraft.world.level.Level; +import net.minecraft.world.World; public class CommonProxy implements IMarketCratesProxy { - public Level getWorld() { + public World getWorld() { return null; } } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/IMarketCratesProxy.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/IMarketCratesProxy.java index 886b38f..01c2467 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/IMarketCratesProxy.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/IMarketCratesProxy.java @@ -1,8 +1,8 @@ package com.lfaoanl.marketcrates.common; -import net.minecraft.world.level.Level; +import net.minecraft.world.World; public interface IMarketCratesProxy { - Level getWorld(); + World getWorld(); } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java index 637794d..cd457e0 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java @@ -1,41 +1,42 @@ package com.lfaoanl.marketcrates.common; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.block.model.ItemTransforms; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.core.NonNullList; -import com.mojang.math.Quaternion; +import net.minecraft.client.render.model.json.ModelTransformationMode; +import org.joml.Quaternionf; import java.util.Random; import java.util.function.Consumer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.model.json.ModelTransformation; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.collection.DefaultedList; public class ItemOrientation { private final ItemStack itemStack; private final float height; - private final Quaternion[] rotation = new Quaternion[3]; + private final Quaternionf[] rotation = new Quaternionf[3]; public static final ItemOrientation EMPTY = new ItemOrientation(ItemStack.EMPTY); - private static Quaternion HORIZONTAL; + private static Quaternionf HORIZONTAL; private boolean hasOrientations = false; @SuppressWarnings("unchecked") - private static final Consumer[] cratePositions = new Consumer[]{ - (Object m) -> ((PoseStack) m).translate(0.6, 0.1, 0.65), // Upper Left - (Object m) -> ((PoseStack) m).translate(0.6, 0.1, 0.4), // Middle left + private static final Consumer[] cratePositions = new Consumer[]{ + (Object m) -> ((MatrixStack) m).translate(0.6, 0.1, 0.65), // Upper Left + (Object m) -> ((MatrixStack) m).translate(0.6, 0.1, 0.4), // Middle left - (Object m) -> ((PoseStack) m).translate(0.6, 0.1, 0.12), // Lower left - (Object m) -> ((PoseStack) m).translate(0.4, 0.1, 0.65), // Upper right + (Object m) -> ((MatrixStack) m).translate(0.6, 0.1, 0.12), // Lower left + (Object m) -> ((MatrixStack) m).translate(0.4, 0.1, 0.65), // Upper right - (Object m) -> ((PoseStack) m).translate(0.4, 0.1, 0.4), // Middle right - (Object m) -> ((PoseStack) m).translate(0.4, 0.1, 0.12) // Lower right + (Object m) -> ((MatrixStack) m).translate(0.4, 0.1, 0.4), // Middle right + (Object m) -> ((MatrixStack) m).translate(0.4, 0.1, 0.12) // Lower right }; public ItemOrientation(ItemStack itemStack) { @@ -55,11 +56,11 @@ public Runnable generateOrientations() { int lowIncline = -10; int incline = 25; - rotation[0] = new Quaternion(randomInt(lowIncline, incline), randomInt(45), randomInt(incline), true); - rotation[1] = new Quaternion(randomInt(lowIncline, incline), randomInt(45), randomInt(incline), true); - rotation[2] = new Quaternion(randomInt(lowIncline, incline), randomInt(45), randomInt(incline), true); + rotation[0] = new Quaternionf().rotateXYZ(randomInt(lowIncline, incline), randomInt(45), randomInt(incline)); + rotation[1] = new Quaternionf().rotateXYZ(randomInt(lowIncline, incline), randomInt(45), randomInt(incline)); + rotation[2] = new Quaternionf().rotateXYZ(randomInt(lowIncline, incline), randomInt(45), randomInt(incline)); - HORIZONTAL = new Quaternion(85, 0, 0, true); + HORIZONTAL = new Quaternionf().rotateXYZ(85, 0, 0); hasOrientations = true; @@ -67,16 +68,16 @@ public Runnable generateOrientations() { }; } - public static NonNullList toItemOrientation(NonNullList stacks) { - NonNullList list = NonNullList.withSize(stacks.size(), ItemOrientation.EMPTY); + public static DefaultedList toItemOrientation(DefaultedList stacks) { + DefaultedList list = DefaultedList.ofSize(stacks.size(), ItemOrientation.EMPTY); for (int i = 0; i < stacks.size(); i++) { list.set(i, new ItemOrientation(stacks.get(i))); } return list; } - public static NonNullList toItemStack(NonNullList stacks) { - NonNullList list = NonNullList.withSize(stacks.size(), ItemStack.EMPTY); + public static DefaultedList toItemStack(DefaultedList stacks) { + DefaultedList list = DefaultedList.ofSize(stacks.size(), ItemStack.EMPTY); for (int i = 0; i < stacks.size(); i++) { list.set(i, stacks.get(i).itemStack); } @@ -91,8 +92,8 @@ private float randomInt(int min, int max) { return new Random().nextInt(max - min) + min; } - public void render(int index, PoseStack matrix, MultiBufferSource buffer, int light, int overlay) { - matrix.pushPose(); + public void render(int index, MatrixStack matrix, VertexConsumerProvider buffer, int light, int overlay) { + matrix.push(); cratePositions[index].accept(matrix); int round = Math.max(1, Math.round(itemStack.getCount() / 21f)); @@ -100,30 +101,31 @@ public void render(int index, PoseStack matrix, MultiBufferSource buffer, int li renderLayer(i, matrix, buffer, light, overlay); } - matrix.popPose(); + matrix.pop(); } - private void renderLayer(int layer, PoseStack matrix, MultiBufferSource buffer, int light, int overlay) { - matrix.pushPose(); + private void renderLayer(int layer, MatrixStack matrix, VertexConsumerProvider buffer, int light, int overlay) { + matrix.push(); matrix.translate(0, height * layer, 0); - matrix.mulPose(rotation[layer]); + matrix.multiply(rotation[layer]); renderItem(matrix, buffer, light, overlay); - matrix.popPose(); + matrix.pop(); } - private void renderItem(PoseStack matrix, MultiBufferSource buffer, int light, int overlay) { - matrix.mulPose(HORIZONTAL); + private void renderItem(MatrixStack matrix, VertexConsumerProvider buffer, int light, int overlay) { + matrix.multiply(HORIZONTAL); matrix.scale(0.75f, 0.75f, 0.75f); - Minecraft.getInstance().getItemRenderer().renderStatic( + MinecraftClient.getInstance().getItemRenderer().renderItem( itemStack, - ItemTransforms.TransformType.GROUND, + ModelTransformationMode.GROUND, light, overlay, matrix, buffer, + MarketCrates.proxy.getWorld(), 0 // (LivingEntity).getId() ); } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/OrientationList.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/OrientationList.java index 85a408e..9171f79 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/OrientationList.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/OrientationList.java @@ -1,10 +1,9 @@ package com.lfaoanl.marketcrates.common; -import net.minecraft.core.NonNullList; - import java.util.List; +import net.minecraft.util.collection.DefaultedList; -public class OrientationList extends NonNullList { +public class OrientationList extends DefaultedList { protected OrientationList(List p_122777_, ItemOrientation p_122778_) { diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateContainer.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateContainer.java index 7ae1946..4e88acb 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateContainer.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateContainer.java @@ -1,20 +1,20 @@ package com.lfaoanl.marketcrates.gui; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.Container; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.screen.slot.Slot; -public abstract class BaseCrateContainer extends AbstractContainerMenu { +public abstract class BaseCrateContainer extends ScreenHandler { - protected final Container inventory; + protected final Inventory inventory; private final int size; - public BaseCrateContainer(int id, Inventory playerInventory, Container inventory, int size, MenuType containerType, boolean isDouble) { + public BaseCrateContainer(int id, PlayerInventory playerInventory, Inventory inventory, int size, ScreenHandlerType containerType, boolean isDouble) { super(containerType, id); if (isDouble) { @@ -41,9 +41,9 @@ public BaseCrateContainer(int id, Inventory playerInventory, Container inventory this.size = size; - checkContainerSize(inventory, size); + checkSize(inventory, size); this.inventory = inventory; - inventory.startOpen(playerInventory.player); + inventory.onOpen(playerInventory.player); drawUserInventory(playerInventory); @@ -58,7 +58,7 @@ private void drawContainerSlots() { // } } - private void drawUserInventory(Inventory playerInventory) { + private void drawUserInventory(PlayerInventory playerInventory) { // Player inventory for (int k = 0; k < 3; ++k) { for (int i1 = 0; i1 < 9; ++i1) { @@ -75,15 +75,15 @@ private void drawUserInventory(Inventory playerInventory) { /** * Determines whether supplied player can use this container */ - public boolean stillValid(Player playerIn) { - return this.inventory.stillValid(playerIn); + public boolean canUse(PlayerEntity playerIn) { + return this.inventory.canPlayerUse(playerIn); } /** * Handle when the stack in slot {@code index} is shift-clicked. Normally this moves the stack between the player * inventory and the other inventory(s). */ - public ItemStack quickMoveStack(Player playerIn, int slotIndex) { + public ItemStack quickMove(PlayerEntity playerIn, int slotIndex) { // Init empty itemstack ItemStack copyStack = ItemStack.EMPTY; @@ -92,10 +92,10 @@ public ItemStack quickMoveStack(Player playerIn, int slotIndex) { Slot slot = this.slots.get(slotIndex); // If slot has stuff - if (slot != null && slot.hasItem()) { + if (slot != null && slot.hasStack()) { // Get stuff from slot - ItemStack stackFromSlot = slot.getItem(); + ItemStack stackFromSlot = slot.getStack(); copyStack = stackFromSlot.copy(); @@ -103,24 +103,24 @@ public ItemStack quickMoveStack(Player playerIn, int slotIndex) { if (slotIndex >= playerInventorySize) { // If slot is changed - if (!this.moveItemStackTo(stackFromSlot, 0, playerInventorySize, true)) { + if (!this.insertItem(stackFromSlot, 0, playerInventorySize, true)) { return ItemStack.EMPTY; } - } else if (!this.moveItemStackTo(stackFromSlot, playerInventorySize, this.slots.size(), false)) { + } else if (!this.insertItem(stackFromSlot, playerInventorySize, this.slots.size(), false)) { return ItemStack.EMPTY; } if (stackFromSlot.isEmpty()) { - slot.set(ItemStack.EMPTY); + slot.setStackNoCallbacks(ItemStack.EMPTY); } else { - slot.setChanged(); + slot.markDirty(); } if (stackFromSlot.getCount() == copyStack.getCount()) { return ItemStack.EMPTY; } - slot.onTake(playerIn, stackFromSlot); + slot.onTakeItem(playerIn, stackFromSlot); } return copyStack; @@ -129,9 +129,9 @@ public ItemStack quickMoveStack(Player playerIn, int slotIndex) { /** * Called when the container is closed. */ - public void removed(Player playerIn) { - super.removed(playerIn); - this.inventory.stopOpen(playerIn); + public void onClosed(PlayerEntity playerIn) { + super.onClosed(playerIn); + this.inventory.onClose(playerIn); } } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateScreen.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateScreen.java index 5579222..9bc0e52 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateScreen.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/BaseCrateScreen.java @@ -1,47 +1,48 @@ package com.lfaoanl.marketcrates.gui; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.Component; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; -abstract class BaseCrateScreen extends AbstractContainerScreen { +abstract class BaseCrateScreen extends HandledScreen { - public BaseCrateScreen(T container, Inventory inv, Component name) { + public BaseCrateScreen(T container, PlayerInventory inv, Text name) { super(container, inv, name); } @Override - protected void renderBg(PoseStack matrixStack, float partialTicks, int x, int y) { + protected void drawBackground(DrawContext context, float partialTicks, int x, int y) { RenderSystem.clearColor(1.0F, 1.0F, 1.0F, 1.0F); // this.minecraft.getTextureManager().bindForSetup(getGuiTexture()); - RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShader(GameRenderer::getPositionTexProgram); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.setShaderTexture(0, getGuiTexture()); - int relX = (this.width - this.imageWidth) / 2; - int relY = (this.height - this.imageHeight) / 2; - this.blit(matrixStack, relX, relY, 0, 0, this.imageWidth, this.imageHeight); + int relX = (this.width - this.backgroundWidth) / 2; + int relY = (this.height - this.backgroundHeight) / 2; + context.drawTexture(getGuiTexture(), relX, relY, 0, 0, this.backgroundWidth, this.backgroundHeight); } @Override - public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { - this.renderBackground(matrixStack); + public void render(DrawContext matrixStack, int mouseX, int mouseY, float partialTicks) { + this.renderBackground(matrixStack, mouseX, mouseY, partialTicks); super.render(matrixStack, mouseX, mouseY, partialTicks); - this.renderTooltip(matrixStack, mouseX, mouseY); + this.drawMouseoverTooltip(matrixStack, mouseX, mouseY); } @Override - protected void renderLabels(PoseStack matrixStack, int mouseX, int mouseY) { + protected void drawForeground(DrawContext context, int mouseX, int mouseY) { // drawString(Minecraft.getInstance().fontRenderer, "Energy: " + container.getEnergy(), 10, 10, 0xffffff); } - abstract ResourceLocation getGuiTexture(); + abstract Identifier getGuiTexture(); } \ No newline at end of file diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleScreen.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleScreen.java index 2101e8a..7474254 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleScreen.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleScreen.java @@ -1,20 +1,20 @@ package com.lfaoanl.marketcrates.gui; import com.lfaoanl.marketcrates.Ref; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.Component; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; public class CrateDoubleScreen extends BaseCrateScreen { - private ResourceLocation GUI = new ResourceLocation(Ref.MODID, "textures/gui/crate_double.png"); + private Identifier GUI = new Identifier(Ref.MODID, "textures/gui/crate_double.png"); - public CrateDoubleScreen(BaseCrateContainer container, Inventory inv, Component name) { + public CrateDoubleScreen(BaseCrateContainer container, PlayerInventory inv, Text name) { super(container, inv, name); } @Override - ResourceLocation getGuiTexture() { + Identifier getGuiTexture() { return GUI; } } \ No newline at end of file diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateScreen.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateScreen.java index 03ff252..50a6f2f 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateScreen.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/gui/CrateScreen.java @@ -1,20 +1,20 @@ package com.lfaoanl.marketcrates.gui; import com.lfaoanl.marketcrates.Ref; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Inventory; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; public class CrateScreen extends BaseCrateScreen { - private ResourceLocation GUI = new ResourceLocation(Ref.MODID, "textures/gui/crate.png"); + private Identifier GUI = new Identifier(Ref.MODID, "textures/gui/crate.png"); - public CrateScreen(BaseCrateContainer container, Inventory inv, Component name) { + public CrateScreen(BaseCrateContainer container, PlayerInventory inv, Text name) { super(container, inv, name); } @Override - ResourceLocation getGuiTexture() { + Identifier getGuiTexture() { return GUI; } } \ No newline at end of file diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/items/CrateItem.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/items/CrateItem.java index 8b6c8ea..7797794 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/items/CrateItem.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/items/CrateItem.java @@ -1,23 +1,23 @@ package com.lfaoanl.marketcrates.items; import com.lfaoanl.marketcrates.blocks.AbstractCrateBlock; -import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; +import net.minecraft.block.Block; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.util.ActionResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; public class CrateItem extends BlockItem { - public CrateItem(Block blockIn, Properties builder) { + public CrateItem(Block blockIn, Settings builder) { super(blockIn, builder); } @Override - public InteractionResult useOn(UseOnContext context) { - BlockPos pos = context.getClickedPos(); - Level world = context.getLevel(); + public ActionResult useOnBlock(ItemUsageContext context) { + BlockPos pos = context.getBlockPos(); + World world = context.getWorld(); // If item is same as BlockItem of targetted CrateBlock Block block = world.getBlockState(pos).getBlock(); @@ -41,6 +41,6 @@ public InteractionResult useOn(UseOnContext context) { // } } - return super.useOn(context); + return super.useOnBlock(context); } } diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java index 374e826..097e14b 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java @@ -4,48 +4,50 @@ import com.lfaoanl.marketcrates.blocks.AbstractCrateBlockEntity; import com.lfaoanl.marketcrates.blocks.states.CrateType; import com.lfaoanl.marketcrates.common.ItemOrientation; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Quaternion; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.core.Direction; -import net.minecraft.core.NonNullList; -import net.minecraft.world.level.block.state.BlockState; + +import org.joml.Quaternionf; + +import net.minecraft.block.BlockState; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.Direction; public class CrateBlockEntityRenderer implements BlockEntityRenderer { - private final Quaternion SOUTH = new Quaternion(0, 180, 0, true); - private final Quaternion EAST = new Quaternion(0, 270, 0, true); - private final Quaternion WEST = new Quaternion(0, 90, 0, true); - private final Quaternion INCLINED = new Quaternion(-22.5f, 0, 0, true); + private final Quaternionf SOUTH = new Quaternionf().rotateXYZ(0, 180, 0); + private final Quaternionf EAST = new Quaternionf().rotateXYZ(0, 270, 0); + private final Quaternionf WEST = new Quaternionf().rotateXYZ(0, 90, 0); + private final Quaternionf INCLINED = new Quaternionf().rotateXYZ(-22.5f, 0, 0); - public CrateBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) { + public CrateBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) { } @Override - public void render(H tileEntity, float partialTicks, PoseStack matrix, MultiBufferSource buffer, int light, int overlay) { - matrix.pushPose(); + public void render(H tileEntity, float partialTicks, MatrixStack matrix, VertexConsumerProvider buffer, int light, int overlay) { + matrix.push(); - BlockState blockState = tileEntity.getBlockState(); + BlockState blockState = tileEntity.getCachedState(); applyDirection(matrix, blockState); - if (blockState.getValue(AbstractCrateBlock.TYPE) == CrateType.INCLINED) { - matrix.mulPose(INCLINED); + if (blockState.get(AbstractCrateBlock.TYPE) == CrateType.INCLINED) { + matrix.multiply(INCLINED); matrix.translate(0, 0, 0.12); } else { matrix.translate(0, 0.1f, 0); } - NonNullList items = tileEntity.getItems(); + DefaultedList items = tileEntity.getItems(); for (int i = 0; i < 6; i++) { items.get(i).render(i, matrix, buffer, light, overlay); } if (tileEntity.isDoubleCrate()) { - matrix.pushPose(); + matrix.push(); matrix.translate(0, 0.5, 0); @@ -54,21 +56,21 @@ public void render(H tileEntity, float partialTicks, PoseStack matrix, MultiBuff items.get(i + 6).render(i, matrix, buffer, light, overlay); } - matrix.popPose(); + matrix.pop(); } - matrix.popPose(); + matrix.pop(); } - private void applyDirection(PoseStack matrix, BlockState blockState) { - if (blockState.getValue(AbstractCrateBlock.FACING) == Direction.SOUTH) { + private void applyDirection(MatrixStack matrix, BlockState blockState) { + if (blockState.get(AbstractCrateBlock.FACING) == Direction.SOUTH) { matrix.translate(1, 0, 1); - matrix.mulPose(SOUTH); - } else if (blockState.getValue(AbstractCrateBlock.FACING) == Direction.EAST) { - matrix.mulPose(EAST); + matrix.multiply(SOUTH); + } else if (blockState.get(AbstractCrateBlock.FACING) == Direction.EAST) { + matrix.multiply(EAST); matrix.translate(0, 0, -1); - } else if (blockState.getValue(AbstractCrateBlock.FACING) == Direction.WEST) { - matrix.mulPose(WEST); + } else if (blockState.get(AbstractCrateBlock.FACING) == Direction.WEST) { + matrix.multiply(WEST); matrix.translate(-1, 0, 0); } } diff --git a/marketcrates-fabric/build.gradle b/marketcrates-fabric/build.gradle index b8ece72..5a9ed73 100644 --- a/marketcrates-fabric/build.gradle +++ b/marketcrates-fabric/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '0.10-SNAPSHOT' + id 'fabric-loom' version '1.5-SNAPSHOT' id 'maven-publish' } @@ -14,8 +14,7 @@ repositories { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" -// mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - mappings loom.officialMojangMappings() + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" @@ -24,7 +23,7 @@ dependencies { // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. // You may need to force-disable transitiveness on them. -// api project(path: "marketcrates-common", configuration: 'default') + implementation project(':marketcrates-common') } @@ -37,7 +36,7 @@ processResources { } } -def targetJavaVersion = 16 +def targetJavaVersion = 17 tasks.withType(JavaCompile).configureEach { // ensure that the encoding is set to UTF-8, no matter what the system default is // this fixes some edge cases with special characters not displaying correctly @@ -97,4 +96,4 @@ sourceSets.main { resources.srcDirs += [ project(':marketcrates-common').sourceSets.main.resources, ] -} \ No newline at end of file +} diff --git a/marketcrates-fabric/gradle.properties b/marketcrates-fabric/gradle.properties index c78cd0a..6451036 100644 --- a/marketcrates-fabric/gradle.properties +++ b/marketcrates-fabric/gradle.properties @@ -2,14 +2,13 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties - # check these on https://modmuss50.me/fabric.html - minecraft_version=1.17.1 - yarn_mappings=1.17.1+build.63 - loader_version=0.12.5 +minecraft_version=1.20.4 +yarn_mappings=1.20.4+build.3 +loader_version=0.15.6 # Mod Properties - archives_base_name = marketcrates-fabric +archives_base_name = marketcrates-fabric # Dependencies - # check this on https://modmuss50.me/fabric.html - fabric_version=0.42.1+1.17 +fabric_version=0.94.1+1.20.4 + diff --git a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java index 60036da..5d65929 100644 --- a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java +++ b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java @@ -1,29 +1,41 @@ package com.lfaoanl.marketcrates.blocks; -import net.minecraft.core.BlockPos; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; +import com.mojang.serialization.MapCodec; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; public class CrateBlock extends AbstractCrateBlock { + public static final MapCodec CODEC = CrateBlock.createCodec(CrateBlock::new); + + public CrateBlock(Settings settings) { + super(settings); + } @Nullable @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { return new CrateBlockEntity(pos, state); } - protected void openGui(BlockState state, Level world, Player player, BlockPos pos) { + protected void openGui(BlockState state, World world, PlayerEntity player, BlockPos pos) { //This will call the createScreenHandlerFactory method from BlockWithEntity, which will return our blockEntity casted to //a namedScreenHandlerFactory. If your block class does not extend BlockWithEntity, it needs to implement createScreenHandlerFactory. - MenuProvider screenHandlerFactory = state.getMenuProvider(world, pos); + NamedScreenHandlerFactory screenHandlerFactory = state.createScreenHandlerFactory(world, pos); if (screenHandlerFactory != null) { //With this call the server will request the client to open the appropriate Screenhandler - player.openMenu(screenHandlerFactory); //openHandledScreen(screenHandlerFactory); + player.openHandledScreen(screenHandlerFactory); //openHandledScreen(screenHandlerFactory); } } + + @Override + protected MapCodec getCodec() { + return CODEC; + } } diff --git a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java index 6094b30..6e28729 100644 --- a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java +++ b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java @@ -6,14 +6,14 @@ import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.PlayerLookup; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; public class CrateBlockEntity extends AbstractCrateBlockEntity { @@ -23,22 +23,22 @@ public CrateBlockEntity(BlockPos pos, BlockState state) { @Override public void sendContents() { - if (!level.isClientSide()) { + if (!world.isClient) { // FORGE send packet to client // PacketDistributor.PacketTarget target = PacketDistributor.TRACKING_CHUNK.with(() -> (LevelChunk) this.getLevel().getChunk(this.getBlockPos())); // CratesPacketHandler.INSTANCE.send(target, new CrateItemsPacket(this.getBlockPos(), ItemOrientation.toItemStack(stacks))); - FriendlyByteBuf data = PacketByteBufs.create(); - BlockPos blockPos = this.getBlockPos(); + PacketByteBuf data = PacketByteBufs.create(); + BlockPos blockPos = getPos(); data.writeBlockPos(blockPos); data.writeInt(stacks.size()); for (ItemStack item : ItemOrientation.toItemStack(stacks)) { - data.writeItem(item); + data.writeItemStack(item); } // Iterate over all players tracking a position in the world and send the packet to each player - for (ServerPlayer player : PlayerLookup.tracking((ServerLevel) this.getLevel(), blockPos)) { + for (ServerPlayerEntity player : PlayerLookup.tracking((ServerWorld) world, blockPos)) { ServerPlayNetworking.send(player, CrateRegistry.CRATE_CHANNEL, data); } @@ -46,7 +46,7 @@ public void sendContents() { } @Override - protected AbstractContainerMenu createMenu(int id, Inventory player) { + protected ScreenHandler createScreenHandler(int id, PlayerInventory player) { if (isDoubleCrate()) { return new CrateDoubleContainer(id, player, this); } diff --git a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/client/MarketCratesFabricClient.java b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/client/MarketCratesFabricClient.java index 85d2dd6..e9da930 100644 --- a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/client/MarketCratesFabricClient.java +++ b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/client/MarketCratesFabricClient.java @@ -13,11 +13,11 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry; import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; -import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; @Environment(EnvType.CLIENT) public class MarketCratesFabricClient extends ClientProxy implements ClientModInitializer { @@ -41,14 +41,14 @@ private void registerClientPacketReceiver() { // Read packet data on the event loop BlockPos target = buf.readBlockPos(); int itemsSize = buf.readInt(); - NonNullList items = NonNullList.create(); + DefaultedList items = DefaultedList.of(); for (int i = 0; i < itemsSize; i++) { - items.add(i, buf.readItem()); + items.add(i, buf.readItemStack()); } client.execute(() -> { // Everything in this lambda is run on the render thread - Level world = MarketCrates.proxy.getWorld(); + World world = MarketCrates.proxy.getWorld(); if (world != null) { BlockEntity tile = world.getBlockEntity(target); diff --git a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java index dfc5229..353152f 100644 --- a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java +++ b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java @@ -13,23 +13,18 @@ import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; -import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; - +import net.minecraft.block.Block; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.util.Identifier; import java.util.HashMap; public class CrateRegistry { - public static final ResourceLocation CRATE_CHANNEL = new ResourceLocation(Ref.MODID, "crate_channel"); + public static final Identifier CRATE_CHANNEL = new Identifier(Ref.MODID, "crate_channel"); // public static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, References.MODID); // public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, References.MODID); @@ -50,35 +45,35 @@ public class CrateRegistry { public static BlockEntityType CRATE_BLOCK_ENTITY; - public static MenuType CRATE_DOUBLE_SCREEN; - public static MenuType CRATE_SCREEN; + public static ScreenHandlerType CRATE_DOUBLE_SCREEN; + public static ScreenHandlerType CRATE_SCREEN; public static void preInit() { for (String type : woodTypes) { - AbstractCrateBlock block = new CrateBlock(); + AbstractCrateBlock block = new CrateBlock(AbstractCrateBlock.properties); blocks.put(type, block); - items.put(type, new CrateItem(block, new FabricItemSettings().group(CreativeModeTab.TAB_DECORATIONS))); + items.put(type, new CrateItem(block, new FabricItemSettings())); } - CRATE_DOUBLE_SCREEN = ScreenHandlerRegistry.registerSimple(new ResourceLocation(Ref.MODID, "crate_double"), CrateDoubleContainer::new); - CRATE_SCREEN = ScreenHandlerRegistry.registerSimple(new ResourceLocation(Ref.MODID, "crate"), CrateContainer::new); + CRATE_DOUBLE_SCREEN = ScreenHandlerRegistry.registerSimple(new Identifier(Ref.MODID, "crate_double"), CrateDoubleContainer::new); + CRATE_SCREEN = ScreenHandlerRegistry.registerSimple(new Identifier(Ref.MODID, "crate"), CrateContainer::new); } public static void init() { for (String type : woodTypes) { - ResourceLocation resourceLocation = new ResourceLocation(Ref.MODID, type + "_crate"); - Registry.register(Registry.BLOCK, resourceLocation, blocks.get(type)); - Registry.register(Registry.ITEM, resourceLocation, items.get(type)); + Identifier resourceLocation = new Identifier(Ref.MODID, type + "_crate"); + Registry.register(Registries.BLOCK, resourceLocation, blocks.get(type)); + Registry.register(Registries.ITEM, resourceLocation, items.get(type)); } - ResourceLocation rlCrateBlockEntity = new ResourceLocation(Ref.MODID, "crate"); + Identifier rlCrateBlockEntity = new Identifier(Ref.MODID, "crate"); Block[] blocksArray = blocks.values().toArray(new Block[blocks.size()]); BlockEntityType beBuilder = FabricBlockEntityTypeBuilder.create(CrateBlockEntity::new, blocksArray).build(null); - CRATE_BLOCK_ENTITY = Registry.register(Registry.BLOCK_ENTITY_TYPE, rlCrateBlockEntity, beBuilder); + CRATE_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, rlCrateBlockEntity, beBuilder); } } diff --git a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java index 225c9fb..58479da 100644 --- a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java +++ b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java @@ -1,24 +1,23 @@ package com.lfaoanl.marketcrates.gui; import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.screen.ScreenHandlerType; public class CrateContainer extends BaseCrateContainer { - private static final MenuType CONTAINER_REGISTRY = CrateRegistry.CRATE_SCREEN; + private static final ScreenHandlerType CONTAINER_REGISTRY = CrateRegistry.CRATE_SCREEN; - public CrateContainer(int id, Inventory playerInventory) { - this(id, playerInventory, new SimpleContainer(6)); + public CrateContainer(int id, PlayerInventory playerInventory) { + this(id, playerInventory, new SimpleInventory(6)); } - public CrateContainer(int id, Inventory playerInventory, Container inventory) { + public CrateContainer(int id, PlayerInventory playerInventory, Inventory inventory) { super(id, playerInventory, inventory, 6, CONTAINER_REGISTRY, false); } diff --git a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java index aea41fa..fa51ce3 100644 --- a/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java +++ b/marketcrates-fabric/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java @@ -1,21 +1,21 @@ package com.lfaoanl.marketcrates.gui; import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.screen.ScreenHandlerType; public class CrateDoubleContainer extends BaseCrateContainer { - private static final MenuType CONTAINER_REGISTRY = CrateRegistry.CRATE_DOUBLE_SCREEN; + private static final ScreenHandlerType CONTAINER_REGISTRY = CrateRegistry.CRATE_DOUBLE_SCREEN; - public CrateDoubleContainer(int id, Inventory playerInventory) { - this(id, playerInventory, new SimpleContainer(12)); + public CrateDoubleContainer(int id, PlayerInventory playerInventory) { + this(id, playerInventory, new SimpleInventory(12)); } - public CrateDoubleContainer(int id, Inventory playerInventory, Container inventory) { + public CrateDoubleContainer(int id, PlayerInventory playerInventory, Inventory inventory) { super(id, playerInventory, inventory, 12, CONTAINER_REGISTRY, true); } } \ No newline at end of file diff --git a/marketcrates-fabric/src/main/resources/fabric.mod.json b/marketcrates-fabric/src/main/resources/fabric.mod.json index 7dfc726..54c5843 100644 --- a/marketcrates-fabric/src/main/resources/fabric.mod.json +++ b/marketcrates-fabric/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "marketcrates", - "version": "1.3", + "version": "1.4", "name": "Marketcrates", "description": "Some crates to spice up your towns, markets, fishing docs, you name it!\n- Available in all different wood types\n- Shows their inventory contents\n- You can stack them\n- You can put a stick under it to give the crate in incline\nShift click the crate to place stack crates in the same block space.\nHit the crate with a stick to incline the crate. Hit it once with an axe to retrieve the stick (For creative mode right clicking with a stick toggles it)\n", @@ -30,8 +30,8 @@ }, "depends": { - "fabricloader": ">=0.12.5", + "fabricloader": ">=0.0.94.1", "fabric": "*", - "minecraft": "1.17.1" + "minecraft": ">=1.20.4" } } diff --git a/marketcrates-forge/LICENSE b/marketcrates-forge/LICENSE deleted file mode 100644 index 34122cb..0000000 --- a/marketcrates-forge/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2021 lfaoanl - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/marketcrates-forge/build.gradle b/marketcrates-forge/build.gradle deleted file mode 100644 index 78ce9f8..0000000 --- a/marketcrates-forge/build.gradle +++ /dev/null @@ -1,173 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - } -} -apply plugin: 'net.minecraftforge.gradle' - -java { - archivesBaseName = 'marketcrates-forge' - toolchain.languageVersion = JavaLanguageVersion.of(16) -} - -minecraft { - // The mappings can be changed at any time and must be in the following format. - // Channel: Version: - // snapshot YYYYMMDD Snapshot are built nightly. - // stable # Stables are built at the discretion of the MCP team. - // official MCVersion Official field/method names from Mojang mapping files - // - // You must be aware of the Mojang license when using the 'official' mappings. - // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md - // - // Use non-default mappings at your own risk. They may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'official', version: '1.17.1' - - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/removed as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - mods { - marketcrates { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/removed as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - mods { - marketcrates { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/removed as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', 'marketcrates', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - - mods { - marketcrates { - source sourceSets.main - } - } - } - } -} - -// Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - // Put repositories for dependencies here - // ForgeGradle automatically adds the Forge maven and Maven Central for you - - // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: - // flatDir { - // dir 'libs' - // } -} - -dependencies { - // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft' it is assumed - // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. - // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.17.1-37.0.109' - - api project(":marketcrates-common") - - // Real mod deobf dependency examples - these get remapped to your current mappings - // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency - // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency - // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency - - // Examples using mod jars from ./libs - // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") - - // For more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html - -} - -// Example for how to get properties into the manifest for reading at runtime. -jar { - manifest { - attributes([ - "Specification-Title" : "marketcrates", - "Specification-Vendor" : "lfaoanl", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "lfaoanl", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } - -} - - - -tasks.withType(JavaCompile).configureEach { - options.release = 16 -} - -jar.finalizedBy('reobfJar') - -sourceSets.main { - java.srcDirs += [ - project(':marketcrates-common').sourceSets.main.java, - ] - resources.srcDirs += [ - project(':marketcrates-common').sourceSets.main.resources, - ] -} \ No newline at end of file diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/MarketCratesForge.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/MarketCratesForge.java deleted file mode 100644 index 476ea7b..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/MarketCratesForge.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.lfaoanl.marketcrates; - -import com.lfaoanl.marketcrates.common.CommonProxy; -import com.lfaoanl.marketcrates.common.MarketCrates; -import com.lfaoanl.marketcrates.core.CrateRegistry; -import com.lfaoanl.marketcrates.core.ForgeClientProxy; -import com.lfaoanl.marketcrates.data.CrateDataGenerator; -import com.lfaoanl.marketcrates.network.CratesPacketHandler; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; - -@Mod(Ref.MODID) -public class MarketCratesForge { - - public MarketCratesForge() { - - MarketCrates.proxy = DistExecutor.runForDist(() -> ForgeClientProxy::new, () -> CommonProxy::new); - - // Register ourselves for server and other game events we are interested in - MinecraftForge.EVENT_BUS.register(this); - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - - MarketCrates.LOGGER.debug("Init CrateRegistry"); - CrateRegistry.init(); - MarketCrates.LOGGER.debug("Done initialising CrateRegistry"); - - MarketCrates.LOGGER.debug("ClientOnly registry"); - DistExecutor.runWhenOn(Dist.CLIENT, MarketCratesForge::clientInit); - modEventBus.addListener(this::entityRenderersEvent); - MarketCrates.LOGGER.debug("Done! - ClientOnly registry"); - - MarketCrates.LOGGER.debug("Init CratePacketHandler"); - modEventBus.addListener(CratesPacketHandler::init); - MarketCrates.LOGGER.debug("Done! - Init CratePacketHandler"); - - MarketCrates.LOGGER.debug("Init CrateDataGenerator"); - modEventBus.addListener(CrateDataGenerator::init); - MarketCrates.LOGGER.debug("Init CrateDataGenerator"); - } - - private static Runnable clientInit() { - return () -> FMLJavaModLoadingContext.get().getModEventBus().addListener(ForgeClientProxy::init); - } - - private void entityRenderersEvent(EntityRenderersEvent.RegisterRenderers event) { - ((ForgeClientProxy) MarketCrates.proxy).registerBlockEntityRenderer(event); - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java deleted file mode 100644 index 4ed860d..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlock.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.lfaoanl.marketcrates.blocks; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.fmllegacy.network.NetworkHooks; - -public class CrateBlock extends AbstractCrateBlock { - - @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new CrateBlockEntity(pos, state); - } - - @Override - protected void openGui(BlockState state, Level world, Player player, BlockPos pos) { - // FORGE open inventory - BlockEntity tile = world.getBlockEntity(pos); - if (tile instanceof CrateBlockEntity) { - NetworkHooks.openGui((ServerPlayer) player, (CrateBlockEntity) tile, tile.getBlockPos()); - } - - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java deleted file mode 100644 index db4c86e..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/blocks/CrateBlockEntity.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.lfaoanl.marketcrates.blocks; - -import com.lfaoanl.marketcrates.common.ItemOrientation; -import com.lfaoanl.marketcrates.core.CrateRegistry; -import com.lfaoanl.marketcrates.gui.CrateContainer; -import com.lfaoanl.marketcrates.gui.CrateDoubleContainer; -import com.lfaoanl.marketcrates.network.CratesPacketHandler; -import com.lfaoanl.marketcrates.network.packets.CrateItemsPacket; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraftforge.fmllegacy.network.PacketDistributor; - -public class CrateBlockEntity extends AbstractCrateBlockEntity { - - public CrateBlockEntity(BlockPos pos, BlockState state) { - super(CrateRegistry.CRATE_TILE.get(), pos, state); - } - - @Override - public void sendContents() { - if (!level.isClientSide()) { - // FORGE send packet to client - PacketDistributor.PacketTarget target = PacketDistributor.TRACKING_CHUNK.with(() -> (LevelChunk) this.getLevel().getChunk(this.getBlockPos())); - CratesPacketHandler.INSTANCE.send(target, new CrateItemsPacket(this.getBlockPos(), ItemOrientation.toItemStack(stacks))); - } - } - - @Override - protected AbstractContainerMenu createMenu(int id, Inventory player) { - //TODO Make CrateDoubleContainer to include isDoubleCrate as parameter maybe the abstract classes not needed anymore - if (isDoubleCrate()) { - return new CrateDoubleContainer(id, player, this); - } - return new CrateContainer(id, player, this); - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java deleted file mode 100644 index c147278..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/CrateRegistry.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.lfaoanl.marketcrates.core; - -import com.lfaoanl.marketcrates.Ref; -import com.lfaoanl.marketcrates.blocks.CrateBlock; -import com.lfaoanl.marketcrates.blocks.CrateBlockEntity; -import com.lfaoanl.marketcrates.gui.CrateContainer; -import com.lfaoanl.marketcrates.gui.CrateDoubleContainer; -import com.lfaoanl.marketcrates.items.CrateItem; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraftforge.common.extensions.IForgeContainerType; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fmllegacy.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.HashMap; - -public class CrateRegistry { - - public static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, Ref.MODID); - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Ref.MODID); - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Ref.MODID); - public static final DeferredRegister> TILES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITIES, Ref.MODID); - - - public static final RegistryObject> CONTAINER_CRATE = CONTAINERS.register("crate", () -> IForgeContainerType.create((windowId, inv, data) -> new CrateContainer(windowId, inv))); - public static final RegistryObject> CONTAINER_CRATE_DOUBLE = CONTAINERS.register("crate_double", () -> IForgeContainerType.create((windowId, inv, data) -> new CrateDoubleContainer(windowId, inv))); - - - public static String[] woodTypes = new String[]{"oak", "spruce", "birch", "jungle", "acacia", "dark_oak", "crimson", "warped"}; - - public static final RegistryObject> CRATE_TILE = TILES.register("crate", () -> BlockEntityType.Builder.of(CrateBlockEntity::new, CrateRegistry.validCrates()).build(null)); - - public static final HashMap> items = new HashMap<>(); - public static final HashMap> blocks = new HashMap<>(); - - - public static void init() { - - for (String type : woodTypes) { - // System.out.println("Register: " + type); - RegistryObject block = BLOCKS.register(type + "_crate", CrateBlock::new); - RegistryObject item = ITEMS.register(type + "_crate", () -> new CrateItem(block.get(), new Item.Properties().tab(CreativeModeTab.TAB_DECORATIONS))); - - blocks.put(type, block); - items.put(type, item); - } - - BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus()); - ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus()); - TILES.register(FMLJavaModLoadingContext.get().getModEventBus()); - CONTAINERS.register(FMLJavaModLoadingContext.get().getModEventBus()); - - } - - private static Block[] validCrates() { - Block[] b = new Block[woodTypes.length]; - - for (int i = 0; i < woodTypes.length; i++) { - String type = woodTypes[i]; - b[i] = blocks.get(type).get(); - } - - return b; - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/ForgeClientProxy.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/ForgeClientProxy.java deleted file mode 100644 index 8c28b52..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/core/ForgeClientProxy.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.lfaoanl.marketcrates.core; - -import com.lfaoanl.marketcrates.common.ClientProxy; -import com.lfaoanl.marketcrates.gui.CrateDoubleScreen; -import com.lfaoanl.marketcrates.gui.CrateScreen; -import com.lfaoanl.marketcrates.render.CrateBlockEntityRenderer; -import net.minecraft.client.gui.screens.MenuScreens; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; - -public class ForgeClientProxy extends ClientProxy { - - @SuppressWarnings({"unchecked", "rawtypes"}) - public static void init(final FMLClientSetupEvent event) { - - MenuScreens.register(CrateRegistry.CONTAINER_CRATE.get(), CrateScreen::new); - MenuScreens.register(CrateRegistry.CONTAINER_CRATE_DOUBLE.get(), CrateDoubleScreen::new); - } - - public void registerBlockEntityRenderer(EntityRenderersEvent.RegisterRenderers event) { - event.registerBlockEntityRenderer(CrateRegistry.CRATE_TILE.get(), CrateBlockEntityRenderer::new); - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateBlockStates.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateBlockStates.java deleted file mode 100644 index 5dfb2a7..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateBlockStates.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.lfaoanl.marketcrates.data; - -import com.lfaoanl.marketcrates.Ref; -import com.lfaoanl.marketcrates.blocks.CrateBlock; -import com.lfaoanl.marketcrates.blocks.states.CrateType; -import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.core.Direction; -import net.minecraft.data.DataGenerator; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.client.model.generators.ConfiguredModel; -import net.minecraftforge.client.model.generators.VariantBlockStateBuilder; -import net.minecraftforge.common.data.ExistingFileHelper; - -import java.util.HashMap; -import java.util.Map; - -public class CrateBlockStates extends BlockStateProvider { - - - public CrateBlockStates(DataGenerator dataGenerator, ExistingFileHelper helper) { - super(dataGenerator, Ref.MODID, helper); - } - - @Override - protected void registerStatesAndModels() { - // System.out.println("Start registering things"); - for (String material : CrateRegistry.woodTypes) { - // System.out.println(material); - Block block = CrateRegistry.blocks.get(material).get(); - - - simpleBlockItem(block, getModel(block, material, CrateType.DEFAULT).model); - VariantBlockStateBuilder builder = getVariantBuilder(block); - - for (CrateType crateType : CrateType.all()) { - for (Map.Entry entry : getRotations().entrySet()) { - builder.partialState() - .with(CrateBlock.TYPE, crateType) - .with(CrateBlock.FACING, entry.getKey()) - .modelForState() - .modelFile(getModel(block, material, crateType).model) - .rotationY((int) entry.getValue()) - .addModel(); - - } - } - } - } - - private ConfiguredModel getModel(Block block, String woodType, CrateType crateType) { - String texture = String.format("minecraft:block/%s_planks", woodType); - - return new ConfiguredModel(models().withExistingParent(woodType + "_" + crateType.getResource(), modLoc(crateType.getResource())) - .texture("particle", texture) - .texture("material", texture)); - } - - private HashMap getRotations() { - HashMap rot = new HashMap<>(); - - rot.put(Direction.NORTH, 0); - rot.put(Direction.EAST, 90); - rot.put(Direction.SOUTH, 180); - rot.put(Direction.WEST, 270); - - return rot; - } - -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateDataGenerator.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateDataGenerator.java deleted file mode 100644 index b257494..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateDataGenerator.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.lfaoanl.marketcrates.data; - -import net.minecraft.data.DataGenerator; -import net.minecraftforge.forge.event.lifecycle.GatherDataEvent; - -public class CrateDataGenerator { - - public static void init(GatherDataEvent event) { - - - DataGenerator generator = event.getGenerator(); - - if (event.includeServer()) { - // Recipes - generator.addProvider(new CrateRecipeProvider(generator)); - // LootTable - generator.addProvider(new CrateLootTableProvider(generator)); - } - if (event.includeClient()) { - // BlockStates - // System.out.println("LFAOANL: Data generator"); - generator.addProvider(new CrateBlockStates(generator, event.getExistingFileHelper())); - - // Items - generator.addProvider(new CrateItemModelProvider(generator, event.getExistingFileHelper())); - } - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateItemModelProvider.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateItemModelProvider.java deleted file mode 100644 index 987b432..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateItemModelProvider.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.lfaoanl.marketcrates.data; - -import com.lfaoanl.marketcrates.Ref; -import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.data.DataGenerator; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraftforge.client.model.generators.ItemModelProvider; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; - -public class CrateItemModelProvider extends ItemModelProvider { - - - public CrateItemModelProvider(DataGenerator generator, ExistingFileHelper existingFileHelper) { - super(generator, Ref.MODID, existingFileHelper); - } - - @Override - protected void registerModels() { - for (String material : CrateRegistry.woodTypes) { - // System.out.println(material); - Item crateItem = CrateRegistry.items.get(material).get(); - ResourceLocation resourceLocation = crateItem.getRegistryName(); - - getBuilder(resourceLocation.getPath()) - .parent(new ModelFile.UncheckedModelFile("block/block")) - .texture("particle", "minecraft:block/" + material + "_planks") - .texture("material", "minecraft:block/" + material + "_planks") - - .element() - .from(0, 0, 0) - .to(16, 16, 16); - } - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateLootTableProvider.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateLootTableProvider.java deleted file mode 100644 index e52d10e..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateLootTableProvider.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.lfaoanl.marketcrates.data; - -import com.google.common.collect.Multimap; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.lfaoanl.marketcrates.Ref; -import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.DataProvider; -import net.minecraft.data.HashCache; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.storage.loot.LootPool; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.LootTables; -import net.minecraft.world.level.storage.loot.ValidationContext; -import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition; -import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; - -class CrateLootTableProvider implements DataProvider { - - private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create(); - protected final Map lootTables = new HashMap<>(); - - private final DataGenerator generator; - - protected CrateLootTableProvider(DataGenerator generator) { - this.generator = generator; - } - - - protected void createLootTables() { - for (String material : CrateRegistry.woodTypes) { - Block block = CrateRegistry.blocks.get(material).get(); - - registerSelfDrop(block); - } - } - - - @Override - public void run(HashCache cache) { - lootTables.clear(); - Path outFolder = generator.getOutputFolder(); - - createLootTables(); - - ValidationContext validator = new ValidationContext(LootContextParamSets.ALL_PARAMS, function -> null, lootTables::get); - lootTables.forEach((name, table) -> LootTables.validate(validator, name, table)); - Multimap problems = validator.getProblems(); - if (!problems.isEmpty()) { - problems.forEach((name, table) -> System.out.println("Found validation problem in " + name + ": " + table)); - throw new IllegalStateException("Failed to validate loot tables, see logs"); - } else { - lootTables.forEach((name, table) -> { - Path out = getPath(outFolder, name); - - try { - DataProvider.save(GSON, cache, LootTables.serialize(table), out); - } catch (IOException e) { - // System.out.println("Couldn't save loot table " + out); - // System.out.println(Arrays.toString(e.getStackTrace())); - } - }); - } - } - - @Override - public String getName() { - return "Loot Tables: " + Ref.MODID; - } - - protected LootPool.Builder createLootPoolBuilder() { - return LootPool.lootPool().when(ExplosionCondition.survivesExplosion()); - } - - protected void register(Block block, LootPool.Builder... pools) { - LootTable.Builder builder = LootTable.lootTable(); - for (LootPool.Builder pool : pools) { - builder.withPool(pool); - } - register(block, builder); - } - - protected void registerSelfDrop(Block block) { - register(block, singleItem(block)); - } - - private Path getPath(Path outFolder, ResourceLocation name) { - return outFolder.resolve("data/" + name.getNamespace() + "/loot_tables/" + name.getPath() + ".json"); - } - - private void register(Block block, LootTable.Builder table) { - register(block.getRegistryName(), table); - } - - private void register(ResourceLocation registryName, LootTable.Builder table) { - if (lootTables.put(toTableLoc(registryName), table.setParamSet(LootContextParamSets.BLOCK).build()) != null) { - throw new IllegalStateException("Duplicate loot table: " + table); - } - } - - private LootPool.Builder singleItem(ItemLike in) { - return createLootPoolBuilder().setRolls(ConstantValue.exactly(1)).add(LootItem.lootTableItem(in)); - } - - private ResourceLocation toTableLoc(ResourceLocation registryName) { - return new ResourceLocation(registryName.getNamespace(), "blocks/" + registryName.getPath()); - } -} \ No newline at end of file diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateRecipeProvider.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateRecipeProvider.java deleted file mode 100644 index 0638d5d..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/data/CrateRecipeProvider.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.lfaoanl.marketcrates.data; - -import com.lfaoanl.marketcrates.Ref; -import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.data.recipes.RecipeProvider; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.fmllegacy.RegistryObject; - -import java.util.function.Consumer; - -public class CrateRecipeProvider extends RecipeProvider { - - private final Blocks facadeBlocks = new Blocks(); - - public CrateRecipeProvider(DataGenerator generator) { - super(generator); - } - - @Override - @SuppressWarnings("ConstantConditions") - protected void buildCraftingRecipes(Consumer consumer) { - - for (String material : CrateRegistry.woodTypes) { - RegistryObject registry = CrateRegistry.blocks.get(material); - Block block = registry.get(); - - ShapedRecipeBuilder.shaped(block) - .pattern("FFF") - .pattern("SSS") - .define('F', getBlock(material, "fence")) - .define('S', getBlock(material, "slab")) - .group(Ref.MODID) - .unlockedBy("has_wood_slab", has(getBlock(material, "slab"))) - .save(consumer, resourceLocation(registry.getId())); - - } - - } - - - protected ResourceLocation resourceLocation(ResourceLocation location) { - return new ResourceLocation(location.getNamespace(), location.getPath()); - } - - private Block getBlock(String material, String name) { - // System.out.println(material + " - " + name); - String finalName = String.format("%s_%s", material.toUpperCase(), name.toUpperCase()); - // System.out.println(finalName); - try { - return (Block) Blocks.class.getDeclaredField(finalName).get(facadeBlocks); - } catch (IllegalAccessException | NoSuchFieldException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java deleted file mode 100644 index d13ab59..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateContainer.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.lfaoanl.marketcrates.gui; - -import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; - -public class CrateContainer extends BaseCrateContainer { - - - private static final MenuType CONTAINER_REGISTRY = CrateRegistry.CONTAINER_CRATE.get(); - - public CrateContainer(int id, Inventory playerInventory) { - this(id, playerInventory, new SimpleContainer(6)); - - } - - public CrateContainer(int id, Inventory playerInventory, Container inventory) { - super(id, playerInventory, inventory, 6, CONTAINER_REGISTRY, false); - } - -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java deleted file mode 100644 index 95fe4c8..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/gui/CrateDoubleContainer.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.lfaoanl.marketcrates.gui; - -import com.lfaoanl.marketcrates.core.CrateRegistry; -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; - -public class CrateDoubleContainer extends BaseCrateContainer { - - private static final MenuType CONTAINER_REGISTRY = CrateRegistry.CONTAINER_CRATE_DOUBLE.get(); - - public CrateDoubleContainer(int id, Inventory playerInventory) { - this(id, playerInventory, new SimpleContainer(12)); - - } - - public CrateDoubleContainer(int id, Inventory playerInventory, Container inventory) { - super(id, playerInventory, inventory, 12, CONTAINER_REGISTRY, true); - } -} \ No newline at end of file diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/CratesPacketHandler.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/CratesPacketHandler.java deleted file mode 100644 index 99ad351..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/CratesPacketHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.lfaoanl.marketcrates.network; - -import com.lfaoanl.marketcrates.Ref; -import com.lfaoanl.marketcrates.blocks.CrateBlockEntity; -import com.lfaoanl.marketcrates.common.MarketCrates; -import com.lfaoanl.marketcrates.network.packets.CrateItemsPacket; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fmllegacy.network.NetworkEvent; -import net.minecraftforge.fmllegacy.network.NetworkRegistry; -import net.minecraftforge.fmllegacy.network.simple.SimpleChannel; - -import java.util.function.Supplier; - -public class CratesPacketHandler { - - - private static final String PROTOCOL_VERSION = "1"; - public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( - new ResourceLocation(Ref.MODID, "main"), - () -> PROTOCOL_VERSION, - PROTOCOL_VERSION::equals, - PROTOCOL_VERSION::equals - ); - - public static void init(FMLCommonSetupEvent event) { - INSTANCE.registerMessage(0, CrateItemsPacket.class, CrateItemsPacket::encode, CrateItemsPacket::decode, CratesPacketHandler::handle); - } - - public static void handle(final CrateItemsPacket msg, Supplier ctx) { - ctx.get().enqueueWork(() -> { - - Level world = MarketCrates.proxy.getWorld(); - - if (world != null) { - BlockEntity tile = world.getBlockEntity(msg.getPosition()); - - if (tile instanceof CrateBlockEntity) { - ((CrateBlockEntity) tile).receiveContents(msg.items); - } - } - }); - - ctx.get().setPacketHandled(true); - } - - -} diff --git a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/packets/CrateItemsPacket.java b/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/packets/CrateItemsPacket.java deleted file mode 100644 index 1125350..0000000 --- a/marketcrates-forge/src/main/java/com/lfaoanl/marketcrates/network/packets/CrateItemsPacket.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.lfaoanl.marketcrates.network.packets; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; - -public class CrateItemsPacket { - - public final NonNullList items; - private final BlockPos position; - - public CrateItemsPacket(BlockPos position, NonNullList items) { - this.items = items; - this.position = position; - } - - public static void encode(CrateItemsPacket msg, FriendlyByteBuf buf) { - buf.writeInt(msg.position.getX()); - buf.writeInt(msg.position.getY()); - buf.writeInt(msg.position.getZ()); - - buf.writeInt(msg.items.size()); - - for (ItemStack stack : msg.items) { - buf.writeItem(stack); - } - } - - public BlockPos getPosition() { - return position; - } - - public static CrateItemsPacket decode(FriendlyByteBuf buf) { - int x = buf.readInt(); - int y = buf.readInt(); - int z = buf.readInt(); - BlockPos blockPos = new BlockPos(x, y, z); - - int size = buf.readInt(); - NonNullList items = NonNullList.withSize(size, ItemStack.EMPTY); - - for (int i = 0; i < size; i++) { - ItemStack itemStack = buf.readItem(); - items.set(i, itemStack); - } - - return new CrateItemsPacket(blockPos, items); - } -} diff --git a/marketcrates-forge/src/main/resources/META-INF/mods.toml b/marketcrates-forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 676d619..0000000 --- a/marketcrates-forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,39 +0,0 @@ - -modLoader="javafml" #mandatory -loaderVersion="[37,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. -license="Apache-2.0 License" -issueTrackerURL="https://github.com/lfaoanl/MarketCrates/issues" #optional - -[[mods]] #mandatory -modId="marketcrates" #mandatory -version="${file.jarVersion}" #mandatory -displayName="Market Crates" #mandatory - -updateJSONURL="http://lfaoanl.space/mc/marketcrates/update.json" #optional -displayURL="https://github.com/lfaoanl/MarketCrates/" #optional -logoFile="marketcrates_logo.png" #optional -# A text field displayed in the mod UI -authors="Lfaoanl" #optional -# The description text for the mod (multi line!) (#mandatory) -description=''' -Some crates to spice up your towns, markets, fishing docs, you name it! -- Available in all different wood types -- Shows their inventory contents -- You can stack them -- You can put a stick under it to give the crate in incline -Shift click the crate to place stack crates in the same block space. -Hit the crate with a stick to incline the crate. Hit it once with an axe to retrieve the stick (For creative mode right clicking with a stick toggles it) -''' -[[dependencies.marketcrates]] #optional - modId="forge" #mandatory - mandatory=true #mandatory - versionRange="[37,)" #mandatory - ordering="NONE" - side="BOTH" -# Here's another dependency -[[dependencies.marketcrates]] - modId="minecraft" - mandatory=true - versionRange="[1.17.1,)" - ordering="NONE" - side="BOTH" \ No newline at end of file diff --git a/marketcrates-forge/src/main/resources/pack.mcmeta b/marketcrates-forge/src/main/resources/pack.mcmeta deleted file mode 100644 index f3bb292..0000000 --- a/marketcrates-forge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,7 +0,0 @@ -{ - "pack": { - "description": "marketcrates-forge resources", - "pack_format": 7, - "_comment": "" - } -} diff --git a/settings.gradle b/settings.gradle index 9fd8089..e8ead9c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,9 +4,6 @@ pluginManagement { name = 'Fabric' url = 'https://maven.fabricmc.net/' } - maven { - url = 'https://maven.minecraftforge.net' - } mavenCentral() gradlePluginPortal() } @@ -14,4 +11,4 @@ pluginManagement { rootProject.name = 'marketcrates' -include 'marketcrates-common', 'marketcrates-forge', 'marketcrates-fabric' +include 'marketcrates-common', 'marketcrates-fabric' From da373788cb9e0661c090bfea0cd293f4e1b19487 Mon Sep 17 00:00:00 2001 From: Carlos Hugo Date: Fri, 19 Jan 2024 17:44:22 +0100 Subject: [PATCH 2/3] restored double-crate placement --- .../blocks/AbstractCrateBlock.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java index b130789..ab1b7ff 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/blocks/AbstractCrateBlock.java @@ -5,6 +5,7 @@ import com.lfaoanl.marketcrates.common.ItemOrientation; import net.minecraft.block.*; import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.enums.SlabType; import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; @@ -105,8 +106,14 @@ public int getOpacity(BlockState state, BlockView worldIn, BlockPos pos) { } public BlockState getPlacementState(ItemPlacementContext context) { + BlockPos blockPos = context.getBlockPos(); + BlockState blockState = context.getWorld().getBlockState(blockPos); FluidState fluidstate = context.getWorld().getFluidState(context.getBlockPos()); boolean isWaterLogged = fluidstate.getFluid() == Fluids.WATER; + + if (blockState.isOf(this)) { + return (BlockState)((BlockState)blockState.with(TYPE, CrateType.DOUBLE)).with(WATERLOGGED, isWaterLogged); + } return this.getDefaultState().with(FACING, context.getHorizontalPlayerFacing().getOpposite()).with(WATERLOGGED, isWaterLogged); } @@ -134,6 +141,24 @@ public List getDroppedStacks(BlockState state, LootContextParameterSe return super.getDroppedStacks(state, builder); } + @Override + public boolean canReplace(BlockState state, ItemPlacementContext context) { + ItemStack itemStack = context.getStack(); + CrateType crateType = state.get(TYPE); + if (crateType == CrateType.DOUBLE || !itemStack.isOf(this.asItem())) { + return false; + } + if (context.canReplaceExisting()) { + boolean bl = context.getHitPos().y - (double)context.getBlockPos().getY() > 0.5; + Direction direction = context.getSide(); + if (crateType == CrateType.DEFAULT) { + return direction == Direction.UP || bl && direction.getAxis().isHorizontal(); + } + return direction == Direction.DOWN || !bl && direction.getAxis().isHorizontal(); + } + return true; + } + @Override public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { if (state.getBlock() != newState.getBlock()) { @@ -149,8 +174,8 @@ public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockSt this.oldItems = ((AbstractCrateBlockEntity) world.getBlockEntity(pos)).getItems(); } - super.onStateReplaced(state, world, pos, newState, isMoving); } + super.onStateReplaced(state, world, pos, newState, isMoving); } public ItemStack getBlockItem() { From e13137466bde73f5454ab67d17e1e527b13b1764 Mon Sep 17 00:00:00 2001 From: Carlos Hugo Date: Fri, 19 Jan 2024 18:34:27 +0100 Subject: [PATCH 3/3] fix rotations for joml Quaternionf (uses radians instead of degrees) --- .../lfaoanl/marketcrates/common/ItemOrientation.java | 10 ++++++---- .../marketcrates/render/CrateBlockEntityRenderer.java | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java index cd457e0..57801bf 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/common/ItemOrientation.java @@ -13,6 +13,8 @@ import net.minecraft.item.Items; import net.minecraft.util.collection.DefaultedList; +import static org.joml.Math.toRadians; + public class ItemOrientation { private final ItemStack itemStack; @@ -56,11 +58,11 @@ public Runnable generateOrientations() { int lowIncline = -10; int incline = 25; - rotation[0] = new Quaternionf().rotateXYZ(randomInt(lowIncline, incline), randomInt(45), randomInt(incline)); - rotation[1] = new Quaternionf().rotateXYZ(randomInt(lowIncline, incline), randomInt(45), randomInt(incline)); - rotation[2] = new Quaternionf().rotateXYZ(randomInt(lowIncline, incline), randomInt(45), randomInt(incline)); + rotation[0] = new Quaternionf().rotateXYZ(toRadians(randomInt(lowIncline, incline)), toRadians(randomInt(45)), toRadians(randomInt(incline))); + rotation[1] = new Quaternionf().rotateXYZ(toRadians(randomInt(lowIncline, incline)), toRadians(randomInt(45)), toRadians(randomInt(incline))); + rotation[2] = new Quaternionf().rotateXYZ(toRadians(randomInt(lowIncline, incline)), toRadians(randomInt(45)), toRadians(randomInt(incline))); - HORIZONTAL = new Quaternionf().rotateXYZ(85, 0, 0); + HORIZONTAL = new Quaternionf().rotateXYZ(toRadians(85), 0, 0); hasOrientations = true; diff --git a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java index 097e14b..d689b32 100644 --- a/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java +++ b/marketcrates-common/src/main/java/com/lfaoanl/marketcrates/render/CrateBlockEntityRenderer.java @@ -15,12 +15,14 @@ import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.Direction; +import static org.joml.Math.toRadians; + public class CrateBlockEntityRenderer implements BlockEntityRenderer { - private final Quaternionf SOUTH = new Quaternionf().rotateXYZ(0, 180, 0); - private final Quaternionf EAST = new Quaternionf().rotateXYZ(0, 270, 0); - private final Quaternionf WEST = new Quaternionf().rotateXYZ(0, 90, 0); - private final Quaternionf INCLINED = new Quaternionf().rotateXYZ(-22.5f, 0, 0); + private final Quaternionf SOUTH = new Quaternionf().rotateXYZ(0, toRadians(180), 0); + private final Quaternionf EAST = new Quaternionf().rotateXYZ(0, toRadians(270), 0); + private final Quaternionf WEST = new Quaternionf().rotateXYZ(0, toRadians(90), 0); + private final Quaternionf INCLINED = new Quaternionf().rotateXYZ(toRadians(-22.5f), 0, 0); public CrateBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) { }