This commit is contained in:
skippyall
2026-05-31 15:06:34 +02:00
parent d3c84ac000
commit 948741f663
18 changed files with 337 additions and 185 deletions
@@ -1,11 +1,10 @@
package io.github.skippyall.minions; package io.github.skippyall.minions;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import io.github.skippyall.minions.command.MinionsCommand; import io.github.skippyall.minions.command.MinionsCommand;
import io.github.skippyall.minions.docs.DocsManager; import io.github.skippyall.minions.docs.DocsManager;
import io.github.skippyall.minions.minion.MinionPersistentState; import io.github.skippyall.minions.minion.MinionPersistentState;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.polymer.VersionSync; import io.github.skippyall.minions.polymer.PolymerRegistration;
import io.github.skippyall.minions.registration.MinionRegistration; import io.github.skippyall.minions.registration.MinionRegistration;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
@@ -27,8 +26,6 @@ public class Minions implements ModInitializer {
MinionRegistration.register(); MinionRegistration.register();
VersionSync.register();
ServerLifecycleEvents.SERVER_STARTED.register(server -> { ServerLifecycleEvents.SERVER_STARTED.register(server -> {
MinionPersistentState.get(server).getMinionData().forEach((uuid, data) -> { MinionPersistentState.get(server).getMinionData().forEach((uuid, data) -> {
if(data.isSpawned()) { if(data.isSpawned()) {
@@ -39,7 +36,7 @@ public class Minions implements ModInitializer {
CommandRegistrationCallback.EVENT.register(MinionsCommand::register); CommandRegistrationCallback.EVENT.register(MinionsCommand::register);
PolymerResourcePackUtils.addModAssets(Minions.MOD_ID); PolymerRegistration.register();
ResourceLoader.get(PackType.SERVER_DATA).registerReloadListener(Identifier.fromNamespaceAndPath(Minions.MOD_ID, "docs"), new DocsManager()); ResourceLoader.get(PackType.SERVER_DATA).registerReloadListener(Identifier.fromNamespaceAndPath(Minions.MOD_ID, "docs"), new DocsManager());
} }
@@ -1,36 +0,0 @@
package io.github.skippyall.minions.block;
import eu.pb4.polymer.core.api.item.PolymerBlockItem;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import io.github.skippyall.minions.polymer.VersionSync;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.HolderLookup;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import org.jspecify.annotations.Nullable;
public class MinionsBlockItem extends PolymerBlockItem {
public MinionsBlockItem(Block block, Properties settings, Item polymerItem) {
super(block, settings, polymerItem, true);
}
@Override
public Item getPolymerItem(ItemStack itemStack, PacketContext context) {
if(VersionSync.isOnClient(context)) {
return this;
} else {
return super.getPolymerItem(itemStack, context);
}
}
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
if(PolymerResourcePackUtils.hasMainPack(context)) {
return super.getPolymerItemModel(stack, context, lookup);
} else {
return null;
}
}
}
@@ -1,32 +1,14 @@
package io.github.skippyall.minions.block.miniontrigger; package io.github.skippyall.minions.block.miniontrigger;
import com.mojang.serialization.MapCodec; import com.mojang.serialization.MapCodec;
import eu.pb4.polymer.core.api.block.PolymerBlock;
import eu.pb4.polymer.core.api.utils.PolymerClientDecoded;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder;
import eu.pb4.polymer.virtualentity.api.ElementHolder;
import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement;
import io.github.skippyall.minions.Minions;
import io.github.skippyall.minions.block.instruction_bound.InstructionBoundBlock; import io.github.skippyall.minions.block.instruction_bound.InstructionBoundBlock;
import io.github.skippyall.minions.polymer.VersionSync;
import io.github.skippyall.minions.registration.MinionBlocks; import io.github.skippyall.minions.registration.MinionBlocks;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.Identifier;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.DiodeBlock;
import net.minecraft.world.level.block.SupportType; import net.minecraft.world.level.block.SupportType;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
@@ -39,7 +21,7 @@ import net.minecraft.world.phys.shapes.VoxelShape;
import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
public class MinionTriggerBlock extends InstructionBoundBlock implements PolymerBlock, PolymerClientDecoded, BlockWithElementHolder { public class MinionTriggerBlock extends InstructionBoundBlock {
public static final MapCodec<MinionTriggerBlock> CODEC = simpleCodec(MinionTriggerBlock::new); public static final MapCodec<MinionTriggerBlock> CODEC = simpleCodec(MinionTriggerBlock::new);
public static final BooleanProperty POWERED = BooleanProperty.create("powered"); public static final BooleanProperty POWERED = BooleanProperty.create("powered");
@@ -105,35 +87,4 @@ public class MinionTriggerBlock extends InstructionBoundBlock implements Polymer
protected BlockEntityType<MinionTriggerBlockEntity> getBlockEntityType() { protected BlockEntityType<MinionTriggerBlockEntity> getBlockEntityType() {
return MinionBlocks.MINION_TRIGGER_BE_TYPE; return MinionBlocks.MINION_TRIGGER_BE_TYPE;
} }
@Override
public BlockState getPolymerBlockState(BlockState state, @Nullable PacketContext context) {
return VersionSync.isOnClient(context) ? state : net.minecraft.world.level.block.Blocks.COMPARATOR.defaultBlockState().setValue(DiodeBlock.POWERED, state.getValue(POWERED));
}
@Override
public boolean handleMiningOnServer(ItemStack tool, BlockState state, BlockPos pos, ServerPlayer player) {
return false;
}
@Override
public @Nullable ElementHolder createElementHolder(ServerLevel world, BlockPos pos, BlockState initialBlockState) {
ElementHolder holder = new ElementHolder() {
@Override
public boolean startWatching(ServerGamePacketListenerImpl player) {
if(PolymerResourcePackUtils.hasMainPack(player) && !VersionSync.isOnClient(player)) {
return super.startWatching(player);
} else {
return false;
}
}
};
ItemStack stack = new ItemStack(Items.BARRIER);
stack.set(DataComponents.ITEM_MODEL, Identifier.fromNamespaceAndPath(Minions.MOD_ID, "minion_trigger_no_plate_" + (initialBlockState.getValue(MinionTriggerBlock.POWERED) ? "active" : "inactive")));
ItemDisplayElement element = new ItemDisplayElement(stack);
element.setItemDisplayContext(ItemDisplayContext.NONE);
holder.addElement(element);
return holder;
}
} }
@@ -1,42 +1,13 @@
package io.github.skippyall.minions.clipboard; package io.github.skippyall.minions.clipboard;
import eu.pb4.polymer.core.api.item.PolymerItem;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.registration.MinionComponentTypes; import io.github.skippyall.minions.registration.MinionComponentTypes;
import io.github.skippyall.minions.registration.MinionItems; import io.github.skippyall.minions.registration.MinionItems;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import org.jspecify.annotations.Nullable;
public class ClipboardItem extends Item implements PolymerItem { public class ClipboardItem {
public ClipboardItem(Properties settings) {
super(settings);
}
@Override
public Item getPolymerItem(ItemStack itemStack, PacketContext context) {
return /*VersionSync.isOnClient(context) ? this : */Items.PAPER;
}
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
return null;
}
@Override
public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipFlag tooltipType, PacketContext context, HolderLookup.Provider lookup) {
ItemStack stack = PolymerItem.super.getPolymerItemStack(itemStack, tooltipType, context, lookup);
stack.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true);
return stack;
}
public static ItemStack createInstructionReference(MinionFakePlayer minion, String instructionName) { public static ItemStack createInstructionReference(MinionFakePlayer minion, String instructionName) {
ItemStack stack = new ItemStack(MinionItems.REFERENCE_ITEM); ItemStack stack = new ItemStack(MinionItems.REFERENCE_ITEM);
@@ -1,13 +1,8 @@
package io.github.skippyall.minions.minion; package io.github.skippyall.minions.minion;
import eu.pb4.polymer.core.api.item.PolymerItem;
import io.github.skippyall.minions.gui.MinionLookGui; import io.github.skippyall.minions.gui.MinionLookGui;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.registration.MinionComponentTypes; import io.github.skippyall.minions.registration.MinionComponentTypes;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.Identifier;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@@ -16,35 +11,16 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec2;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
public class MinionItem extends Item implements PolymerItem { public class MinionItem extends Item {
public MinionItem(Properties settings) { public MinionItem(Properties settings) {
super(settings); super(settings);
} }
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
return null;
}
@Override
public Item getPolymerItem(ItemStack itemStack, PacketContext player) {
return Items.ARMOR_STAND;
}
@Override
public ItemStack getPolymerItemStack(ItemStack stack, TooltipFlag tooltipType, PacketContext player, HolderLookup.Provider lookup) {
ItemStack out = PolymerItem.super.getPolymerItemStack(stack, tooltipType, player, lookup);
out.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true);
return out;
}
/*@Override /*@Override
public void appendHoverText(ItemStack stack, TooltipContext context, TooltipDisplay component, Consumer<Component> tooltip, TooltipFlag type) { public void appendHoverText(ItemStack stack, TooltipContext context, TooltipDisplay component, Consumer<Component> tooltip, TooltipFlag type) {
//MinionData data = getData(stack); //MinionData data = getData(stack);
@@ -0,0 +1,67 @@
package io.github.skippyall.minions.polymer;
import eu.pb4.polymer.core.api.block.PolymerBlock;
import eu.pb4.polymer.core.api.block.PolymerBlockUtils;
import eu.pb4.polymer.core.api.item.PolymerCreativeModeTabUtils;
import eu.pb4.polymer.core.api.item.PolymerItem;
import eu.pb4.polymer.core.api.other.PolymerComponent;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder;
import io.github.skippyall.minions.Minions;
import io.github.skippyall.minions.polymer.block.AnalogInputBlockOverlay;
import io.github.skippyall.minions.polymer.block.MinionTriggerBlockOverlay;
import io.github.skippyall.minions.polymer.item.ClipboardItemOverlay;
import io.github.skippyall.minions.polymer.item.MinionItemOverlay;
import io.github.skippyall.minions.polymer.item.MinionsBlockItemOverlay;
import io.github.skippyall.minions.polymer.item.SimpleItemOverlay;
import io.github.skippyall.minions.registration.MinionBlocks;
import io.github.skippyall.minions.registration.MinionComponentTypes;
import io.github.skippyall.minions.registration.MinionCreativeTab;
import io.github.skippyall.minions.registration.MinionItems;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block;
public class PolymerRegistration {
public static void register() {
VersionSync.register();
PolymerResourcePackUtils.addModAssets(Minions.MOD_ID);
registerBlockOverlay(MinionBlocks.MINION_TRIGGER_BLOCK, new MinionTriggerBlockOverlay());
PolymerBlockUtils.registerBlockEntity(MinionBlocks.MINION_TRIGGER_BE_TYPE);
registerBlockOverlay(MinionBlocks.ANALOG_INPUT_BLOCK, new AnalogInputBlockOverlay());
registerItemOverlay(MinionItems.MINION_TRIGGER_ITEM, new MinionsBlockItemOverlay(MinionItems.MINION_TRIGGER_ITEM, Items.COMPARATOR));
registerItemOverlay(MinionItems.ANALOG_INPUT_ITEM, new MinionsBlockItemOverlay(MinionItems.ANALOG_INPUT_ITEM, Items.REPEATER));
registerItemOverlay(MinionItems.REFERENCE_ITEM, new ClipboardItemOverlay());
registerItemOverlay(MinionItems.MINION_ITEM, new MinionItemOverlay());
registerSimpleItemOverlay(MinionItems.BASIC_UPGRADE_BASE, Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE);
registerSimpleItemOverlay(MinionItems.ADVANCED_UPGRADE_BASE, Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE);
registerSimpleItemOverlay(MinionItems.MOVE_MODULE, Items.IRON_BOOTS);
registerSimpleItemOverlay(MinionItems.ATTACK_MODULE, Items.IRON_PICKAXE);
registerSimpleItemOverlay(MinionItems.INTERACT_MODULE, Items.LEVER);
registerSimpleItemOverlay(MinionItems.MOB_SPAWNING_MODULE, Items.SPAWNER);
PolymerComponent.registerDataComponent(MinionComponentTypes.MINION_DATA, MinionComponentTypes.REFERENCE, MinionComponentTypes.MODULE);
PolymerCreativeModeTabUtils.registerPolymerCreativeModeTab(Identifier.fromNamespaceAndPath(Minions.MOD_ID, "main"), MinionCreativeTab.group);
}
private static void registerBlockOverlay(Block block, PolymerBlock overlay) {
PolymerBlock.registerOverlay(block, overlay);
if(overlay instanceof BlockWithElementHolder elementHolderOverlay) {
BlockWithElementHolder.registerOverlay(block, elementHolderOverlay);
}
}
private static void registerItemOverlay(Item item, PolymerItem overlay) {
PolymerItem.registerOverlay(item, overlay);
}
private static void registerSimpleItemOverlay(Item serverItem, Item polymerItem) {
registerItemOverlay(serverItem, SimpleItemOverlay.withoutModel(serverItem, polymerItem));
}
}
@@ -0,0 +1,14 @@
package io.github.skippyall.minions.polymer.block;
import eu.pb4.polymer.core.api.block.PolymerBlock;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import org.jspecify.annotations.Nullable;
public class AnalogInputBlockOverlay implements PolymerBlock {
@Override
public BlockState getPolymerBlockState(BlockState blockState, @Nullable PacketContext packetContext) {
return Blocks.AMETHYST_BLOCK.defaultBlockState();
}
}
@@ -0,0 +1,57 @@
package io.github.skippyall.minions.polymer.block;
import eu.pb4.polymer.core.api.block.PolymerBlock;
import eu.pb4.polymer.core.api.utils.PolymerClientDecoded;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder;
import eu.pb4.polymer.virtualentity.api.ElementHolder;
import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement;
import io.github.skippyall.minions.Minions;
import io.github.skippyall.minions.block.miniontrigger.MinionTriggerBlock;
import io.github.skippyall.minions.polymer.VersionSync;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.BlockPos;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.Identifier;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.DiodeBlock;
import net.minecraft.world.level.block.state.BlockState;
import org.jspecify.annotations.Nullable;
public class MinionTriggerBlockOverlay implements PolymerBlock, PolymerClientDecoded, BlockWithElementHolder {
@Override
public BlockState getPolymerBlockState(BlockState state, @Nullable PacketContext context) {
return VersionSync.isOnClient(context) ? state : net.minecraft.world.level.block.Blocks.COMPARATOR.defaultBlockState().setValue(DiodeBlock.POWERED, state.getValue(MinionTriggerBlock.POWERED));
}
@Override
public boolean handleMiningOnServer(ItemStack tool, BlockState state, BlockPos pos, ServerPlayer player) {
return false;
}
@Override
public @Nullable ElementHolder createElementHolder(ServerLevel world, BlockPos pos, BlockState initialBlockState) {
ElementHolder holder = new ElementHolder() {
@Override
public boolean startWatching(ServerGamePacketListenerImpl player) {
if(PolymerResourcePackUtils.hasMainPack(player) && !VersionSync.isOnClient(player)) {
return super.startWatching(player);
} else {
return false;
}
}
};
ItemStack stack = new ItemStack(Items.BARRIER);
stack.set(DataComponents.ITEM_MODEL, Identifier.fromNamespaceAndPath(Minions.MOD_ID, "minion_trigger_no_plate_" + (initialBlockState.getValue(MinionTriggerBlock.POWERED) ? "active" : "inactive")));
ItemDisplayElement element = new ItemDisplayElement(stack);
element.setItemDisplayContext(ItemDisplayContext.NONE);
holder.addElement(element);
return holder;
}
}
@@ -0,0 +1,4 @@
@NullMarked
package io.github.skippyall.minions.polymer.block;
import org.jspecify.annotations.NullMarked;
@@ -0,0 +1,31 @@
package io.github.skippyall.minions.polymer.item;
import eu.pb4.polymer.core.api.item.PolymerItem;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag;
import org.jspecify.annotations.Nullable;
public class ClipboardItemOverlay implements PolymerItem {
@Override
public Item getPolymerItem(ItemStack itemStack, PacketContext context) {
return /*VersionSync.isOnClient(context) ? this : */Items.PAPER;
}
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
return null;
}
@Override
public ItemStack getPolymerItemStack(ItemStack itemStack, TooltipFlag tooltipType, PacketContext context, HolderLookup.Provider lookup) {
ItemStack stack = PolymerItem.super.getPolymerItemStack(itemStack, tooltipType, context, lookup);
stack.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true);
return stack;
}
}
@@ -0,0 +1,31 @@
package io.github.skippyall.minions.polymer.item;
import eu.pb4.polymer.core.api.item.PolymerItem;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag;
import org.jspecify.annotations.Nullable;
public class MinionItemOverlay implements PolymerItem {
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
return null;
}
@Override
public Item getPolymerItem(ItemStack itemStack, PacketContext player) {
return Items.ARMOR_STAND;
}
@Override
public ItemStack getPolymerItemStack(ItemStack stack, TooltipFlag tooltipType, PacketContext player, HolderLookup.Provider lookup) {
ItemStack out = PolymerItem.super.getPolymerItemStack(stack, tooltipType, player, lookup);
out.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true);
return out;
}
}
@@ -0,0 +1,55 @@
package io.github.skippyall.minions.polymer.item;
import eu.pb4.polymer.core.api.item.PolymerItem;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import io.github.skippyall.minions.polymer.VersionSync;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.HolderLookup;
import net.minecraft.resources.Identifier;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import org.jspecify.annotations.Nullable;
public class MinionsBlockItemOverlay implements PolymerItem {
private final Item serverItem;
private final Item polymerItem;
public MinionsBlockItemOverlay(Item serverItem, Item polymerItem) {
this.serverItem = serverItem;
this.polymerItem = polymerItem;
}
@Override
public Item getPolymerItem(ItemStack itemStack, PacketContext context) {
if(VersionSync.isOnClient(context)) {
return serverItem;
} else {
return polymerItem;
}
}
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
if(PolymerResourcePackUtils.hasMainPack(context)) {
return PolymerItem.super.getPolymerItemModel(stack, context, lookup);
} else {
return null;
}
}
@Override
public boolean isPolymerBlockInteraction(BlockState state, ServerPlayer player, InteractionHand hand, ItemStack stack, ServerLevel world, BlockHitResult blockHitResult, InteractionResult actionResult) {
return true;
}
@Override
public boolean isIgnoringBlockInteractionPlaySoundExceptedEntity(BlockState state, ServerPlayer player, InteractionHand hand, ItemStack stack, ServerLevel world, BlockHitResult blockHitResult) {
return true;
}
}
@@ -0,0 +1,48 @@
package io.github.skippyall.minions.polymer.item;
import eu.pb4.polymer.core.api.item.PolymerItem;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import io.github.skippyall.minions.polymer.VersionSync;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.HolderLookup;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import org.jspecify.annotations.Nullable;
public class SimpleItemOverlay implements PolymerItem {
private final Item serverItem;
private final Item polymerItem;
private final boolean useModel;
private SimpleItemOverlay(Item serverItem, Item polymerItem, boolean useModel) {
this.serverItem = serverItem;
this.polymerItem = polymerItem;
this.useModel = useModel;
}
public static SimpleItemOverlay withModel(Item serverItem, Item polymerItem) {
return new SimpleItemOverlay(serverItem, polymerItem, true);
}
public static SimpleItemOverlay withoutModel(Item serverItem, Item polymerItem) {
return new SimpleItemOverlay(serverItem, polymerItem, false);
}
public Item getPolymerItem(ItemStack itemStack, PacketContext context) {
if(useModel && VersionSync.isOnClient(context)) {
return serverItem;
} else {
return polymerItem;
}
}
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
if(PolymerResourcePackUtils.hasMainPack(context) && useModel) {
return PolymerItem.super.getPolymerItemModel(stack, context, lookup);
} else {
return null;
}
}
}
@@ -0,0 +1,4 @@
@NullMarked
package io.github.skippyall.minions.polymer.item;
import org.jspecify.annotations.NullMarked;
@@ -1,6 +1,5 @@
package io.github.skippyall.minions.registration; package io.github.skippyall.minions.registration;
import eu.pb4.polymer.core.api.block.PolymerBlockUtils;
import io.github.skippyall.minions.Minions; import io.github.skippyall.minions.Minions;
import io.github.skippyall.minions.block.input.AnalogInputBlock; import io.github.skippyall.minions.block.input.AnalogInputBlock;
import io.github.skippyall.minions.block.miniontrigger.MinionTriggerBlock; import io.github.skippyall.minions.block.miniontrigger.MinionTriggerBlock;
@@ -47,6 +46,6 @@ public class MinionBlocks {
); );
public static void register() { public static void register() {
PolymerBlockUtils.registerBlockEntity(MINION_TRIGGER_BE_TYPE);
} }
} }
@@ -1,6 +1,5 @@
package io.github.skippyall.minions.registration; package io.github.skippyall.minions.registration;
import eu.pb4.polymer.core.api.other.PolymerComponent;
import io.github.skippyall.minions.Minions; import io.github.skippyall.minions.Minions;
import io.github.skippyall.minions.clipboard.Clipboard; import io.github.skippyall.minions.clipboard.Clipboard;
import io.github.skippyall.minions.module.MinionModule; import io.github.skippyall.minions.module.MinionModule;
@@ -19,7 +18,6 @@ public class MinionComponentTypes {
private static <T extends DataComponentType<?>> T register(String name, T type) { private static <T extends DataComponentType<?>> T register(String name, T type) {
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, Identifier.fromNamespaceAndPath(Minions.MOD_ID, name), type); Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, Identifier.fromNamespaceAndPath(Minions.MOD_ID, name), type);
PolymerComponent.registerDataComponent(type);
return type; return type;
} }
@@ -1,10 +1,7 @@
package io.github.skippyall.minions.registration; package io.github.skippyall.minions.registration;
import eu.pb4.polymer.core.api.item.PolymerCreativeModeTabUtils;
import io.github.skippyall.minions.Minions;
import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab; import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
@@ -34,6 +31,6 @@ public class MinionCreativeTab {
.icon(MinionItems.MINION_ITEM::getDefaultInstance) .icon(MinionItems.MINION_ITEM::getDefaultInstance)
.displayItems(MinionCreativeTab::collectEntries) .displayItems(MinionCreativeTab::collectEntries)
.build(); .build();
PolymerCreativeModeTabUtils.registerPolymerCreativeModeTab(Identifier.fromNamespaceAndPath(Minions.MOD_ID, "main"), group);
} }
} }
@@ -1,8 +1,5 @@
package io.github.skippyall.minions.registration; package io.github.skippyall.minions.registration;
import eu.pb4.polymer.core.api.item.SimplePolymerItem;
import io.github.skippyall.minions.block.MinionsBlockItem;
import io.github.skippyall.minions.clipboard.ClipboardItem;
import io.github.skippyall.minions.minion.MinionItem; import io.github.skippyall.minions.minion.MinionItem;
import io.github.skippyall.minions.minion.MinionRuntime; import io.github.skippyall.minions.minion.MinionRuntime;
import io.github.skippyall.minions.module.MinionModule; import io.github.skippyall.minions.module.MinionModule;
@@ -16,8 +13,8 @@ import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.damagesource.DamageType;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.component.DamageResistant; import net.minecraft.world.item.component.DamageResistant;
import java.util.List; import java.util.List;
@@ -32,55 +29,43 @@ public class MinionItems {
settings -> new MinionItem(settings.delayedComponent(DataComponents.DAMAGE_RESISTANT, context -> new DamageResistant(context.getOrThrow(MINION_ITEM_RESISTS)))) settings -> new MinionItem(settings.delayedComponent(DataComponents.DAMAGE_RESISTANT, context -> new DamageResistant(context.getOrThrow(MINION_ITEM_RESISTS))))
); );
public static final SimplePolymerItem BASIC_UPGRADE_BASE = registerItem( public static final Item BASIC_UPGRADE_BASE = registerSimpleItem(Identifier.fromNamespaceAndPath(MOD_ID, "basic_upgrade_base"));
Identifier.fromNamespaceAndPath(MOD_ID, "basic_upgrade_base"), public static final Item ADVANCED_UPGRADE_BASE = registerSimpleItem(Identifier.fromNamespaceAndPath(MOD_ID, "advanced_upgrade_base"));
settings -> new SimplePolymerItem(settings, Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE)
);
public static final SimplePolymerItem ADVANCED_UPGRADE_BASE = registerItem( public static final Item MOVE_MODULE = registerModule(
Identifier.fromNamespaceAndPath(MOD_ID, "advanced_upgrade_base"),
settings -> new SimplePolymerItem(settings, Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE)
);
public static final SimplePolymerItem MOVE_MODULE = registerModule(
Identifier.fromNamespaceAndPath(MOD_ID, "move_module"), Identifier.fromNamespaceAndPath(MOD_ID, "move_module"),
Items.IRON_BOOTS,
List.of(Instructions.WALK, Instructions.WALK_CONTINUOUS, Instructions.TURN, Instructions.TURN_VECTOR) List.of(Instructions.WALK, Instructions.WALK_CONTINUOUS, Instructions.TURN, Instructions.TURN_VECTOR)
); );
public static final SimplePolymerItem ATTACK_MODULE = registerModule( public static final Item ATTACK_MODULE = registerModule(
Identifier.fromNamespaceAndPath(MOD_ID, "attack_module"), Identifier.fromNamespaceAndPath(MOD_ID, "attack_module"),
Items.IRON_PICKAXE,
List.of(Instructions.ATTACK, Instructions.MINE_BLOCK) List.of(Instructions.ATTACK, Instructions.MINE_BLOCK)
); );
public static final SimplePolymerItem INTERACT_MODULE = registerModule( public static final Item INTERACT_MODULE = registerModule(
Identifier.fromNamespaceAndPath(MOD_ID, "interact_module"), Identifier.fromNamespaceAndPath(MOD_ID, "interact_module"),
Items.LEVER,
List.of(Instructions.USE) List.of(Instructions.USE)
); );
public static final SimplePolymerItem MOB_SPAWNING_MODULE = registerModule( public static final Item MOB_SPAWNING_MODULE = registerModule(
Identifier.fromNamespaceAndPath(MOD_ID, "mob_spawning_module"), Identifier.fromNamespaceAndPath(MOD_ID, "mob_spawning_module"),
Items.SPAWNER,
List.of(), List.of(),
List.of(SpecialAbilities.MOB_SPAWNING) List.of(SpecialAbilities.MOB_SPAWNING)
); );
public static final MinionsBlockItem MINION_TRIGGER_ITEM = registerItem( public static final BlockItem MINION_TRIGGER_ITEM = registerItem(
MinionBlocks.MINION_TRIGGER_ID, MinionBlocks.MINION_TRIGGER_ID,
settings -> new MinionsBlockItem(MinionBlocks.MINION_TRIGGER_BLOCK, settings, Items.COMPARATOR), settings -> new BlockItem(MinionBlocks.MINION_TRIGGER_BLOCK, settings),
new Item.Properties().useBlockDescriptionPrefix() new Item.Properties().useBlockDescriptionPrefix()
); );
public static final MinionsBlockItem ANALOG_INPUT_ITEM = registerItem( public static final BlockItem ANALOG_INPUT_ITEM = registerItem(
MinionBlocks.ANALOG_INPUT_BLOCK_ID, MinionBlocks.ANALOG_INPUT_BLOCK_ID,
settings -> new MinionsBlockItem(MinionBlocks.ANALOG_INPUT_BLOCK, settings, Items.REPEATER), settings -> new BlockItem(MinionBlocks.ANALOG_INPUT_BLOCK, settings),
new Item.Properties().useBlockDescriptionPrefix() new Item.Properties().useBlockDescriptionPrefix()
); );
public static final ClipboardItem REFERENCE_ITEM = registerItem(Identifier.fromNamespaceAndPath(MOD_ID, "clipboard"), ClipboardItem::new); public static final Item REFERENCE_ITEM = registerItem(Identifier.fromNamespaceAndPath(MOD_ID, "clipboard"), Item::new);
public static <T extends Item> T registerItem(Identifier identifier, Function<Item.Properties, T> constructor, Item.Properties settings) { public static <T extends Item> T registerItem(Identifier identifier, Function<Item.Properties, T> constructor, Item.Properties settings) {
T item = constructor.apply(settings.setId(ResourceKey.create(Registries.ITEM, identifier))); T item = constructor.apply(settings.setId(ResourceKey.create(Registries.ITEM, identifier)));
@@ -94,18 +79,21 @@ public class MinionItems {
return registerItem(identifier, constructor, new Item.Properties()); return registerItem(identifier, constructor, new Item.Properties());
} }
public static SimplePolymerItem registerModule(Identifier identifier, Item vanillaItem, List<InstructionType<MinionRuntime>> instructionTypes, List<SpecialAbility> specialAbilities) { public static Item registerSimpleItem(Identifier identifier) {
return registerItem(identifier, Item::new);
}
public static Item registerModule(Identifier identifier, List<InstructionType<MinionRuntime>> instructionTypes, List<SpecialAbility> specialAbilities) {
return registerItem( return registerItem(
identifier, identifier,
settings -> new SimplePolymerItem(settings, vanillaItem), Item::new,
new Item.Properties().component(MinionComponentTypes.MODULE, new MinionModule(instructionTypes, specialAbilities)) new Item.Properties().component(MinionComponentTypes.MODULE, new MinionModule(instructionTypes, specialAbilities))
); );
} }
public static SimplePolymerItem registerModule(Identifier identifier, Item vanillaItem, List<InstructionType<MinionRuntime>> instructionTypes) { public static Item registerModule(Identifier identifier, List<InstructionType<MinionRuntime>> instructionTypes) {
return registerModule( return registerModule(
identifier, identifier,
vanillaItem,
instructionTypes, instructionTypes,
List.of() List.of()
); );