From 1a7d9b467e2deee9bbcdc06d1e8e549ef883ddd4 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Tue, 6 May 2025 15:36:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9B=86=E8=A3=85=E7=AE=B1?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=B3=A8=E5=86=8C=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/atsuishio/superbwarfare/Mod.java | 7 +++ .../api/event/RegisterContainersEvent.java | 45 +++++++++++++++++++ .../atsuishio/superbwarfare/init/ModTabs.java | 8 +++- .../item/ContainerBlockItem.java | 41 ++++++++--------- 4 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java diff --git a/src/main/java/com/atsuishio/superbwarfare/Mod.java b/src/main/java/com/atsuishio/superbwarfare/Mod.java index 11f9709c4..d0bca7cb5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/Mod.java +++ b/src/main/java/com/atsuishio/superbwarfare/Mod.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare; +import com.atsuishio.superbwarfare.api.event.RegisterContainersEvent; import com.atsuishio.superbwarfare.client.MouseMovementHandler; import com.atsuishio.superbwarfare.compat.CompatHolder; import com.atsuishio.superbwarfare.compat.clothconfig.ClothConfigHelper; @@ -16,6 +17,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.common.NeoForge; @@ -63,6 +65,7 @@ public class Mod { ModAttachments.ATTACHMENT_TYPES.register(bus); bus.addListener(this::onClientSetup); + bus.addListener(FMLCommonSetupEvent.class, event -> onCommonSetup(bus)); bus.addListener(ModItems::registerDispenserBehavior); bus.addListener(NetworkRegistry::register); @@ -111,6 +114,10 @@ public class Mod { workQueueC.removeAll(actions); } + public void onCommonSetup(IEventBus bus) { + bus.post(new RegisterContainersEvent()); + } + public void onClientSetup(final FMLClientSetupEvent event) { MouseMovementHandler.init(); } diff --git a/src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java b/src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java new file mode 100644 index 000000000..010f7bd51 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/api/event/RegisterContainersEvent.java @@ -0,0 +1,45 @@ +package com.atsuishio.superbwarfare.api.event; + +import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.ItemStack; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; +import net.neoforged.neoforge.registries.DeferredHolder; +import org.jetbrains.annotations.ApiStatus; + +import java.util.ArrayList; +import java.util.List; + +/** + * Register Entities as a container + */ +@ApiStatus.AvailableSince("0.7.7") +public class RegisterContainersEvent extends Event implements IModBusEvent { + public static final List containers = new ArrayList<>(); + + public void add(DeferredHolder, EntityType> type) { + add(type.get(), false); + } + + public void add(DeferredHolder, EntityType> type, boolean canBePlacedAboveWater) { + add(type.get(), canBePlacedAboveWater); + } + + public void add(EntityType type) { + add(type, false); + } + + public void add(EntityType type, boolean canBePlacedAboveWater) { + containers.add(ContainerBlockItem.createInstance(type, canBePlacedAboveWater)); + } + + public void add(Entity entity) { + add(entity, false); + } + + public void add(Entity entity, boolean canBePlacedAboveWater) { + containers.add(ContainerBlockItem.createInstance(entity, canBePlacedAboveWater)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java index 59a417b7d..429bd1544 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java @@ -1,7 +1,11 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.item.*; +import com.atsuishio.superbwarfare.api.event.RegisterContainersEvent; +import com.atsuishio.superbwarfare.item.ArmorPlate; +import com.atsuishio.superbwarfare.item.BatteryItem; +import com.atsuishio.superbwarfare.item.C4Bomb; +import com.atsuishio.superbwarfare.item.SmallContainerBlockItem; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -100,7 +104,7 @@ public class ModTabs { .withTabsBefore(ITEM_TAB.getKey()) .displayItems((param, output) -> ModItems.BLOCKS.getEntries().forEach(registryObject -> { if (registryObject.get() == ModItems.CONTAINER.get()) { - ContainerBlockItem.CONTAINER_ENTITIES.stream().map(Supplier::get).forEach(output::accept); + RegisterContainersEvent.containers.forEach(output::accept); } 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/item/ContainerBlockItem.java b/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java index 10bea4209..22255c436 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.item; import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.api.event.RegisterContainersEvent; import com.atsuishio.superbwarfare.client.renderer.item.ContainerBlockItemRenderer; import com.atsuishio.superbwarfare.init.ModBlockEntities; import com.atsuishio.superbwarfare.init.ModBlocks; @@ -24,6 +25,7 @@ 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.EventPriority; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; @@ -37,31 +39,26 @@ import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -import java.util.List; -import java.util.function.Supplier; - @EventBusSubscriber(modid = Mod.MODID, bus = EventBusSubscriber.Bus.MOD) public class ContainerBlockItem extends BlockItem implements GeoItem { - /** - * 集装箱可用实体列表 - */ - public static final List> CONTAINER_ENTITIES = List.of( - () -> ContainerBlockItem.createInstance(ModEntities.MK_42.get()), - () -> ContainerBlockItem.createInstance(ModEntities.MLE_1934.get()), - () -> ContainerBlockItem.createInstance(ModEntities.HPJ_11.get()), - () -> ContainerBlockItem.createInstance(ModEntities.ANNIHILATOR.get()), - () -> ContainerBlockItem.createInstance(ModEntities.LASER_TOWER.get()), - () -> ContainerBlockItem.createInstance(ModEntities.SPEEDBOAT.get(), true), - () -> ContainerBlockItem.createInstance(ModEntities.AH_6.get()), - () -> ContainerBlockItem.createInstance(ModEntities.LAV_150.get(), true), - () -> ContainerBlockItem.createInstance(ModEntities.BMP_2.get(), true), - () -> ContainerBlockItem.createInstance(ModEntities.PRISM_TANK.get(), true), - () -> ContainerBlockItem.createInstance(ModEntities.YX_100.get()), - () -> ContainerBlockItem.createInstance(ModEntities.WHEEL_CHAIR.get()), - () -> ContainerBlockItem.createInstance(ModEntities.TOM_6.get()), - () -> ContainerBlockItem.createInstance(ModEntities.A_10A.get()) - ); + @SubscribeEvent(priority = EventPriority.HIGH) + public static void registerContainers(RegisterContainersEvent event) { + event.add(ModEntities.MK_42); + event.add(ModEntities.MLE_1934); + event.add(ModEntities.HPJ_11); + event.add(ModEntities.ANNIHILATOR); + event.add(ModEntities.LASER_TOWER); + event.add(ModEntities.SPEEDBOAT, true); + event.add(ModEntities.AH_6); + event.add(ModEntities.LAV_150, true); + event.add(ModEntities.BMP_2, true); + event.add(ModEntities.PRISM_TANK); + event.add(ModEntities.YX_100); + event.add(ModEntities.WHEEL_CHAIR); + event.add(ModEntities.TOM_6); + event.add(ModEntities.A_10A); + } private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);