From b12b2633614de5282bda060e04bf1eb8a8795cdd Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sun, 13 Jul 2025 21:04:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=B9=B8=E8=BF=90=E9=9B=86?= =?UTF-8?q?=E8=A3=85=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/event/RegisterContainersEvent.java | 2 +- .../block/LuckyContainerBlock.java | 114 ++++++++++++++++ .../entity/LuckyContainerBlockEntity.java | 105 +++++++++++++++ .../client/ClientRenderHandler.java | 6 +- .../client/ContainerItemDecorator.java | 2 +- .../model/block/LuckyContainerBlockModel.java | 24 ++++ .../client/model/item/ContainerItemModel.java | 2 +- .../model/item/LuckyContainerItemModel.java | 24 ++++ .../model/item/SmallContainerItemModel.java | 2 +- .../LuckyContainerBlockEntityRenderer.java | 20 +++ .../item/ContainerBlockItemRenderer.java | 2 +- .../item/LuckyContainerBlockItemRenderer.java | 20 +++ .../item/SmallContainerBlockItemRenderer.java | 2 +- .../entity/vehicle/Hpj11Entity.java | 2 +- .../entity/vehicle/LaserTowerEntity.java | 2 +- .../entity/vehicle/Type63Entity.java | 2 +- .../entity/vehicle/base/VehicleEntity.java | 2 +- .../superbwarfare/init/ModBlockEntities.java | 2 + .../superbwarfare/init/ModBlocks.java | 3 +- .../superbwarfare/init/ModItems.java | 10 +- .../atsuishio/superbwarfare/init/ModTabs.java | 8 +- .../superbwarfare/init/ModVillagers.java | 2 +- .../container}/ContainerBlockItem.java | 2 +- .../container/LuckyContainerBlockItem.java | 86 ++++++++++++ .../container}/SmallContainerBlockItem.java | 2 +- .../models/item/lucky_container.json | 124 ++++++++++++++++++ ...ndom_container.png => lucky_container.png} | Bin 27 files changed, 551 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/block/LuckyContainerBlock.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/block/LuckyContainerBlockModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/LuckyContainerItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/block/LuckyContainerBlockEntityRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/LuckyContainerBlockItemRenderer.java rename src/main/java/com/atsuishio/superbwarfare/item/{ => common/container}/ContainerBlockItem.java (99%) create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/common/container/LuckyContainerBlockItem.java rename src/main/java/com/atsuishio/superbwarfare/item/{ => common/container}/SmallContainerBlockItem.java (98%) create mode 100644 src/main/resources/assets/superbwarfare/models/item/lucky_container.json rename src/main/resources/assets/superbwarfare/textures/block/{random_container.png => lucky_container.png} (100%) diff --git a/src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java b/src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java index e35475502..a31abab8d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java +++ b/src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java @@ -1,6 +1,6 @@ package com.atsuishio.superbwarfare.api.event; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/atsuishio/superbwarfare/block/LuckyContainerBlock.java b/src/main/java/com/atsuishio/superbwarfare/block/LuckyContainerBlock.java new file mode 100644 index 000000000..79707b463 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/block/LuckyContainerBlock.java @@ -0,0 +1,114 @@ +package com.atsuishio.superbwarfare.block; + +import com.atsuishio.superbwarfare.block.entity.LuckyContainerBlockEntity; +import com.atsuishio.superbwarfare.init.ModBlockEntities; +import com.atsuishio.superbwarfare.init.ModTags; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +@SuppressWarnings("deprecation") +public class LuckyContainerBlock extends BaseEntityBlock { + + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + public static final BooleanProperty OPENED = BooleanProperty.create("opened"); + + public LuckyContainerBlock() { + this(BlockBehaviour.Properties.of().sound(SoundType.METAL).strength(3.0f).noOcclusion().requiresCorrectToolForDrops()); + } + + public LuckyContainerBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(OPENED, false)); + } + + @Override + @ParametersAreNonnullByDefault + protected @NotNull ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { + if (level.isClientSide + || state.getValue(OPENED) + || !(level.getBlockEntity(pos) instanceof LuckyContainerBlockEntity) + ) return ItemInteractionResult.FAIL; + + if (!stack.is(ModTags.Items.CROWBAR)) { + player.displayClientMessage(Component.translatable("des.superbwarfare.container.fail.crowbar"), true); + return ItemInteractionResult.FAIL; + } + + return ItemInteractionResult.FAIL; + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, @NotNull BlockState pState, @NotNull BlockEntityType pBlockEntityType) { + if (!pLevel.isClientSide) { + return createTickerHelper(pBlockEntityType, ModBlockEntities.LUCKY_CONTAINER.get(), LuckyContainerBlockEntity::serverTick); + } + return null; + } + + @Override + @ParametersAreNonnullByDefault + public @NotNull VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return state.getValue(OPENED) ? box(1, 0, 1, 15, 14, 15) : box(0, 0, 0, 16, 15, 16); + } + + @Override + protected @NotNull MapCodec codec() { + return simpleCodec(LuckyContainerBlock::new); + } + + @Override + public @NotNull RenderShape getRenderShape(@NotNull BlockState state) { + return RenderShape.ENTITYBLOCK_ANIMATED; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockState blockState) { + return new LuckyContainerBlockEntity(blockPos, blockState); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING).add(OPENED); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()).setValue(OPENED, false); + } + + @Override + @ParametersAreNonnullByDefault + public @NotNull ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state) { + ItemStack itemstack = super.getCloneItemStack(level, pos, state); + level.getBlockEntity(pos, ModBlockEntities.LUCKY_CONTAINER.get()).ifPresent((blockEntity) -> blockEntity.saveToItem(itemstack, level.registryAccess())); + return itemstack; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java new file mode 100644 index 000000000..2e2948146 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java @@ -0,0 +1,105 @@ +package com.atsuishio.superbwarfare.block.entity; + +import com.atsuishio.superbwarfare.block.ContainerBlock; +import com.atsuishio.superbwarfare.init.ModBlockEntities; +import com.atsuishio.superbwarfare.tools.ParticleTool; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; + +public class LuckyContainerBlockEntity extends BlockEntity implements GeoBlockEntity { + + public int tick = 0; + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public LuckyContainerBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.CONTAINER.get(), pos, state); + } + + public static void serverTick(Level pLevel, BlockPos pPos, BlockState pState, LuckyContainerBlockEntity blockEntity) { + if (!pState.getValue(ContainerBlock.OPENED)) { + return; + } + + if (blockEntity.tick < 20) { + blockEntity.tick++; + blockEntity.setChanged(); + + if (blockEntity.tick == 18) { + ParticleTool.sendParticle((ServerLevel) pLevel, ParticleTypes.EXPLOSION, pPos.getX(), pPos.getY() + 1, pPos.getZ(), 40, 1.5, 1.5, 1.5, 1, false); + pLevel.playSound(null, pPos, SoundEvents.GENERIC_EXPLODE.value(), SoundSource.BLOCKS, 4.0F, (1.0F + (pLevel.random.nextFloat() - pLevel.random.nextFloat()) * 0.2F) * 0.7F); + } + } else { + var direction = pState.getValue(ContainerBlock.FACING); + + pLevel.setBlockAndUpdate(pPos, Blocks.AIR.defaultBlockState()); + } + } + + private PlayState predicate(AnimationState event) { + if (this.getBlockState().getValue(ContainerBlock.OPENED)) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.container.open")); + } + return PlayState.STOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + data.add(new AnimationController<>(this, "controller", 0, this::predicate)); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + @ParametersAreNonnullByDefault + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + this.tick = tag.getInt("Tick"); + } + + @Override + @ParametersAreNonnullByDefault + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + tag.putInt("Tick", this.tick); + } + + @Override + public ClientboundBlockEntityDataPacket getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public @NotNull CompoundTag getUpdateTag(HolderLookup.@NotNull Provider registries) { + return this.saveWithFullMetadata(registries); + } + + @Override + @ParametersAreNonnullByDefault + public void saveToItem(ItemStack stack, HolderLookup.Provider registries) { + CompoundTag tag = new CompoundTag(); + BlockItem.setBlockEntityData(stack, this.getType(), tag); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java index 41052ad51..5099b83d6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java @@ -1,10 +1,7 @@ package com.atsuishio.superbwarfare.client; import com.atsuishio.superbwarfare.client.overlay.*; -import com.atsuishio.superbwarfare.client.renderer.block.ChargingStationBlockEntityRenderer; -import com.atsuishio.superbwarfare.client.renderer.block.ContainerBlockEntityRenderer; -import com.atsuishio.superbwarfare.client.renderer.block.FuMO25BlockEntityRenderer; -import com.atsuishio.superbwarfare.client.renderer.block.SmallContainerBlockEntityRenderer; +import com.atsuishio.superbwarfare.client.renderer.block.*; import com.atsuishio.superbwarfare.client.tooltip.*; import com.atsuishio.superbwarfare.client.tooltip.component.*; import com.atsuishio.superbwarfare.init.ModBlockEntities; @@ -39,6 +36,7 @@ public class ClientRenderHandler { event.registerBlockEntityRenderer(ModBlockEntities.FUMO_25.get(), context -> new FuMO25BlockEntityRenderer()); event.registerBlockEntityRenderer(ModBlockEntities.CHARGING_STATION.get(), context -> new ChargingStationBlockEntityRenderer()); event.registerBlockEntityRenderer(ModBlockEntities.SMALL_CONTAINER.get(), context -> new SmallContainerBlockEntityRenderer()); + event.registerBlockEntityRenderer(ModBlockEntities.LUCKY_CONTAINER.get(), context -> new LuckyContainerBlockEntityRenderer()); } @SubscribeEvent diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ContainerItemDecorator.java b/src/main/java/com/atsuishio/superbwarfare/client/ContainerItemDecorator.java index 67a43849d..244f3c5bc 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ContainerItemDecorator.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ContainerItemDecorator.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.client; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/block/LuckyContainerBlockModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/block/LuckyContainerBlockModel.java new file mode 100644 index 000000000..129ff5d5a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/block/LuckyContainerBlockModel.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.block; + +import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.block.entity.LuckyContainerBlockEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class LuckyContainerBlockModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(LuckyContainerBlockEntity animatable) { + return Mod.loc("animations/container.animation.json"); + } + + @Override + public ResourceLocation getModelResource(LuckyContainerBlockEntity animatable) { + return Mod.loc("geo/container.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(LuckyContainerBlockEntity animatable) { + return Mod.loc("textures/block/lucky_container.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/ContainerItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/ContainerItemModel.java index f4465b9de..a416baf54 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/ContainerItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/ContainerItemModel.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.client.model.item; import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.model.GeoModel; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/LuckyContainerItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/LuckyContainerItemModel.java new file mode 100644 index 000000000..8369b38c4 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/LuckyContainerItemModel.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.item.common.container.LuckyContainerBlockItem; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class LuckyContainerItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(LuckyContainerBlockItem animatable) { + return Mod.loc("animations/container.animation.json"); + } + + @Override + public ResourceLocation getModelResource(LuckyContainerBlockItem animatable) { + return Mod.loc("geo/container.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(LuckyContainerBlockItem animatable) { + return Mod.loc("textures/block/lucky_container.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/SmallContainerItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SmallContainerItemModel.java index 7f5feabb1..03397f326 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/SmallContainerItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SmallContainerItemModel.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.client.model.item; import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.item.SmallContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.SmallContainerBlockItem; import net.minecraft.resources.ResourceLocation; import software.bernie.geckolib.model.GeoModel; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/block/LuckyContainerBlockEntityRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/block/LuckyContainerBlockEntityRenderer.java new file mode 100644 index 000000000..bf0094fbc --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/block/LuckyContainerBlockEntityRenderer.java @@ -0,0 +1,20 @@ +package com.atsuishio.superbwarfare.client.renderer.block; + +import com.atsuishio.superbwarfare.block.entity.LuckyContainerBlockEntity; +import com.atsuishio.superbwarfare.client.model.block.LuckyContainerBlockModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class LuckyContainerBlockEntityRenderer extends GeoBlockRenderer { + + public LuckyContainerBlockEntityRenderer() { + super(new LuckyContainerBlockModel()); + } + + @Override + public RenderType getRenderType(LuckyContainerBlockEntity animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/ContainerBlockItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/ContainerBlockItemRenderer.java index e3bea4df9..50566e9c4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/ContainerBlockItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/ContainerBlockItemRenderer.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.client.renderer.item; import com.atsuishio.superbwarfare.client.model.item.ContainerItemModel; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/LuckyContainerBlockItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/LuckyContainerBlockItemRenderer.java new file mode 100644 index 000000000..c2df316ef --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/LuckyContainerBlockItemRenderer.java @@ -0,0 +1,20 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.model.item.LuckyContainerItemModel; +import com.atsuishio.superbwarfare.item.common.container.LuckyContainerBlockItem; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class LuckyContainerBlockItemRenderer extends GeoItemRenderer { + + public LuckyContainerBlockItemRenderer() { + super(new LuckyContainerItemModel()); + } + + @Override + public RenderType getRenderType(LuckyContainerBlockItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SmallContainerBlockItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SmallContainerBlockItemRenderer.java index 1b96504c5..af6112fe1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SmallContainerBlockItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SmallContainerBlockItemRenderer.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.client.renderer.item; import com.atsuishio.superbwarfare.client.model.item.SmallContainerItemModel; -import com.atsuishio.superbwarfare.item.SmallContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.SmallContainerBlockItem; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java index 296cfb180..1cf6a7db4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java @@ -12,7 +12,7 @@ import com.atsuishio.superbwarfare.event.ClientMouseHandler; import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModTags; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import com.atsuishio.superbwarfare.tools.*; import com.mojang.math.Axis; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java index 9ba25cad2..ecdc57e83 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java @@ -9,7 +9,7 @@ import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.ParticleTool; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java index 3d31e855b..12af9aab1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java @@ -8,7 +8,7 @@ import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModSerializers; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.OBB; import com.atsuishio.superbwarfare.tools.ParticleTool; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java index a0e9123b9..5ca0495d5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java @@ -9,7 +9,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.DroneEntity; import com.atsuishio.superbwarfare.entity.vehicle.damage.DamageModifier; import com.atsuishio.superbwarfare.entity.vehicle.weapon.VehicleWeapon; import com.atsuishio.superbwarfare.init.*; -import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage; import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.InventoryTool; diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModBlockEntities.java b/src/main/java/com/atsuishio/superbwarfare/init/ModBlockEntities.java index c1f6f5c0b..eaef9ae46 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModBlockEntities.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModBlockEntities.java @@ -30,4 +30,6 @@ public class ModBlockEntities { () -> BlockEntityType.Builder.of(VehicleDeployerBlockEntity::new, ModBlocks.VEHICLE_DEPLOYER.get()).build(null)); public static final DeferredHolder, BlockEntityType> SUPERB_ITEM_INTERFACE = REGISTRY.register("superb_item_interface", () -> BlockEntityType.Builder.of(SuperbItemInterfaceBlockEntity::new, ModBlocks.SUPERB_ITEM_INTERFACE.get()).build(null)); + public static final DeferredHolder, BlockEntityType> LUCKY_CONTAINER = REGISTRY.register("lucky_container", + () -> BlockEntityType.Builder.of(LuckyContainerBlockEntity::new, ModBlocks.LUCKY_CONTAINER.get()).build(null)); } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModBlocks.java b/src/main/java/com/atsuishio/superbwarfare/init/ModBlocks.java index 5c9ebd68e..76ce48e32 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModBlocks.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModBlocks.java @@ -50,5 +50,6 @@ public class ModBlocks { public static final DeferredHolder SMALL_CONTAINER = REGISTRY.register("small_container", () -> new SmallContainerBlock()); public static final DeferredHolder VEHICLE_DEPLOYER = REGISTRY.register("vehicle_deployer", VehicleDeployerBlock::new); public static final DeferredHolder AIRCRAFT_CATAPULT = REGISTRY.register("aircraft_catapult", AircraftCatapultBlock::new); - public static final DeferredHolder SUPERB_ITEM_INTERFACE = REGISTRY.register("superb_item_interface", () -> new SuperbItemInterfaceBlock()); + public static final DeferredHolder SUPERB_ITEM_INTERFACE = REGISTRY.register("superb_item_interface", SuperbItemInterfaceBlock::new); + public static final DeferredHolder LUCKY_CONTAINER = REGISTRY.register("lucky_container", () -> new LuckyContainerBlock()); } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index 39f962888..9fae9d1c7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -8,6 +8,9 @@ import com.atsuishio.superbwarfare.item.common.BlueprintItem; import com.atsuishio.superbwarfare.item.common.MaterialPack; import com.atsuishio.superbwarfare.item.common.ammo.*; import com.atsuishio.superbwarfare.item.common.ammo.box.AmmoBox; +import com.atsuishio.superbwarfare.item.common.container.ContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.LuckyContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.SmallContainerBlockItem; import com.atsuishio.superbwarfare.item.gun.handgun.*; import com.atsuishio.superbwarfare.item.gun.heavy.Ntw20Item; import com.atsuishio.superbwarfare.item.gun.launcher.JavelinItem; @@ -288,12 +291,15 @@ public class ModItems { public static final DeferredHolder SILVER_BLOCK = block(ModBlocks.SILVER_BLOCK); public static final DeferredHolder CEMENTED_CARBIDE_BLOCK = block(ModBlocks.CEMENTED_CARBIDE_BLOCK); public static final DeferredHolder FUMO_25 = block(ModBlocks.FUMO_25); - public static final DeferredHolder CONTAINER = BLOCKS.register("container", ContainerBlockItem::new); - public static final DeferredHolder SMALL_CONTAINER = BLOCKS.register("small_container", SmallContainerBlockItem::new); public static final DeferredHolder VEHICLE_DEPLOYER = BLOCKS.register("vehicle_deployer", VehicleDeployerBlockItem::new); public static final DeferredHolder AIRCRAFT_CATAPULT = block(ModBlocks.AIRCRAFT_CATAPULT); public static final DeferredHolder SUPERB_ITEM_INTERFACE = block(ModBlocks.SUPERB_ITEM_INTERFACE); + public static final DeferredHolder CONTAINER = BLOCKS.register("container", ContainerBlockItem::new); + public static final DeferredHolder SMALL_CONTAINER = BLOCKS.register("small_container", SmallContainerBlockItem::new); + public static final DeferredHolder LUCKY_CONTAINER = BLOCKS.register("lucky_container", LuckyContainerBlockItem::new); + + public record Materials( String name, DeferredHolder barrel, diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java index 1bfe37024..862f8a037 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java @@ -2,7 +2,11 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.api.event.RegisterContainersEvent; -import com.atsuishio.superbwarfare.item.*; +import com.atsuishio.superbwarfare.item.ArmorPlate; +import com.atsuishio.superbwarfare.item.BatteryItem; +import com.atsuishio.superbwarfare.item.C4BombItem; +import com.atsuishio.superbwarfare.item.ElectricBaton; +import com.atsuishio.superbwarfare.item.common.container.SmallContainerBlockItem; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -105,6 +109,8 @@ public class ModTabs { .displayItems((param, output) -> ModItems.BLOCKS.getEntries().forEach(registryObject -> { if (registryObject.get() == ModItems.CONTAINER.get()) { RegisterContainersEvent.containers.forEach(output::accept); + } else if (registryObject.get() == ModItems.LUCKY_CONTAINER.get()) { + output.accept(registryObject.get()); } else if (registryObject.get() == ModItems.SMALL_CONTAINER.get()) { output.accept(registryObject.get()); SmallContainerBlockItem.SMALL_CONTAINER_LOOT_TABLES.stream().map(Supplier::get).forEach(output::accept); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java b/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java index 5b73af736..7952a76aa 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModVillagers.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.item.SmallContainerBlockItem; +import com.atsuishio.superbwarfare.item.common.container.SmallContainerBlockItem; import com.google.common.collect.ImmutableSet; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.core.Holder; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java b/src/main/java/com/atsuishio/superbwarfare/item/common/container/ContainerBlockItem.java similarity index 99% rename from src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java rename to src/main/java/com/atsuishio/superbwarfare/item/common/container/ContainerBlockItem.java index 243f7ad99..a47136b05 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/container/ContainerBlockItem.java @@ -1,4 +1,4 @@ -package com.atsuishio.superbwarfare.item; +package com.atsuishio.superbwarfare.item.common.container; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.api.event.RegisterContainersEvent; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/common/container/LuckyContainerBlockItem.java b/src/main/java/com/atsuishio/superbwarfare/item/common/container/LuckyContainerBlockItem.java new file mode 100644 index 000000000..73f881907 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/container/LuckyContainerBlockItem.java @@ -0,0 +1,86 @@ +package com.atsuishio.superbwarfare.item.common.container; + +import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.client.renderer.item.LuckyContainerBlockItemRenderer; +import com.atsuishio.superbwarfare.init.ModBlocks; +import com.atsuishio.superbwarfare.init.ModItems; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; + +@EventBusSubscriber(modid = Mod.MODID, bus = EventBusSubscriber.Bus.MOD) +public class LuckyContainerBlockItem extends BlockItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public LuckyContainerBlockItem() { + super(ModBlocks.LUCKY_CONTAINER.get(), new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public @NotNull InteractionResult useOn(@NotNull UseOnContext context) { + return InteractionResult.PASS; + } + + @Override + @ParametersAreNonnullByDefault + public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + BlockHitResult playerPOVHitResult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.WATER); + if (playerPOVHitResult.getType() == HitResult.Type.MISS) { + return super.use(level, player, hand); + } + BlockHitResult blockHitResult = playerPOVHitResult.withPosition(playerPOVHitResult.getBlockPos().above()); + InteractionResult interactionresult = super.useOn(new UseOnContext(player, hand, blockHitResult)); + return new InteractionResultHolder<>(interactionresult, player.getItemInHand(hand)); + } + + private PlayState predicate(AnimationState event) { + return PlayState.CONTINUE; + } + + @SubscribeEvent + private static void registerItemExtensions(RegisterClientExtensionsEvent event) { + event.registerItem(new IClientItemExtensions() { + private final BlockEntityWithoutLevelRenderer renderer = new LuckyContainerBlockItemRenderer(); + + @Override + public @NotNull BlockEntityWithoutLevelRenderer getCustomRenderer() { + return renderer; + } + }, ModItems.LUCKY_CONTAINER); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + data.add(new AnimationController<>(this, "controller", 0, this::predicate)); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/SmallContainerBlockItem.java b/src/main/java/com/atsuishio/superbwarfare/item/common/container/SmallContainerBlockItem.java similarity index 98% rename from src/main/java/com/atsuishio/superbwarfare/item/SmallContainerBlockItem.java rename to src/main/java/com/atsuishio/superbwarfare/item/common/container/SmallContainerBlockItem.java index 952a80ce2..84615bdeb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/SmallContainerBlockItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/container/SmallContainerBlockItem.java @@ -1,4 +1,4 @@ -package com.atsuishio.superbwarfare.item; +package com.atsuishio.superbwarfare.item.common.container; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.renderer.item.SmallContainerBlockItemRenderer; diff --git a/src/main/resources/assets/superbwarfare/models/item/lucky_container.json b/src/main/resources/assets/superbwarfare/models/item/lucky_container.json new file mode 100644 index 000000000..18f715db5 --- /dev/null +++ b/src/main/resources/assets/superbwarfare/models/item/lucky_container.json @@ -0,0 +1,124 @@ +{ + "credit": "Made with Blockbench", + "parent": "builtin/entity", + "texture_size": [ + 128, + 128 + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 90, + 0, + 0 + ], + "translation": [ + 0, + -2, + -6 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 90, + 0, + 0 + ], + "translation": [ + 0, + -2, + -6 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "firstperson_righthand": { + "rotation": [ + -176.35, + 27.92, + -176.98 + ], + "translation": [ + -2, + 0, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "firstperson_lefthand": { + "rotation": [ + -176.35, + 27.92, + -176.98 + ], + "translation": [ + -2, + 0, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "ground": { + "translation": [ + 0, + -1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + -155, + -45, + 180 + ], + "translation": [ + 0, + -4.5, + 0 + ], + "scale": [ + 0.65, + 0.65, + 0.65 + ] + }, + "head": { + "translation": [ + 0, + -7, + 0 + ] + }, + "fixed": { + "translation": [ + 0, + -7.75, + 1 + ] + } + }, + "textures": { + "particle": "superbwarfare:block/container" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/textures/block/random_container.png b/src/main/resources/assets/superbwarfare/textures/block/lucky_container.png similarity index 100% rename from src/main/resources/assets/superbwarfare/textures/block/random_container.png rename to src/main/resources/assets/superbwarfare/textures/block/lucky_container.png