添加集装箱内容注册事件

This commit is contained in:
Light_Quanta 2025-05-06 15:36:55 +08:00
parent 31e53fa409
commit 1a7d9b467e
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
4 changed files with 77 additions and 24 deletions

View file

@ -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();
}

View file

@ -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<ItemStack> containers = new ArrayList<>();
public <T extends Entity> void add(DeferredHolder<EntityType<?>, EntityType<T>> type) {
add(type.get(), false);
}
public <T extends Entity> void add(DeferredHolder<EntityType<?>, EntityType<T>> type, boolean canBePlacedAboveWater) {
add(type.get(), canBePlacedAboveWater);
}
public <T extends Entity> void add(EntityType<T> type) {
add(type, false);
}
public <T extends Entity> void add(EntityType<T> 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));
}
}

View file

@ -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);

View file

@ -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<Supplier<ItemStack>> 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);