From 023d2155452a06b83df66466388688005e4e8dc3 Mon Sep 17 00:00:00 2001 From: 90 <90@national.shitposting.agency> Date: Wed, 11 Jan 2023 21:55:09 +0000 Subject: [PATCH] Add MEGA Pattern Provider (#28) --- .../block/MEGAPatternProviderBlock.java | 102 ++++ .../MEGAPatternProviderBlockEntity.java | 49 ++ .../datagen/CommonRecipeSupplier.java | 77 ++- .../definition/MEGABlockEntities.java | 3 + .../_90/megacells/definition/MEGABlocks.java | 8 +- .../_90/megacells/definition/MEGAParts.java | 36 ++ .../_90/megacells/definition/MEGATags.java | 14 + .../menu/MEGAPatternProviderMenu.java | 25 + .../part/MEGAPatternProviderPart.java | 74 +++ .../megacells/mega_pattern_provider.json | 59 ++ .../assets/ae2/screens/megacells/schema.json | 548 ++++++++++++++++++ .../guis/megacells/mega_pattern_provider.png | Bin 0 -> 721 bytes .../block/drive/cells/mega_mana_cell.png | Bin 5841 -> 469 bytes .../textures/block/mega_pattern_provider.png | Bin 0 -> 281 bytes .../block/mega_pattern_provider_alternate.png | Bin 0 -> 281 bytes .../mega_pattern_provider_alternate_arrow.png | Bin 0 -> 301 bytes .../mega_pattern_provider_alternate_front.png | Bin 0 -> 252 bytes .../textures/part/mega_monitor_back.png | Bin 0 -> 236 bytes .../textures/part/mega_monitor_sides.png | Bin 0 -> 212 bytes .../part/mega_monitor_sides_status.png | Bin 0 -> 143 bytes .../textures/part/mega_pattern_provider.png | Bin 0 -> 202 bytes fabric/build.gradle.kts | 2 + fabric/gradle.properties | 5 +- .../gripe/_90/megacells/MEGACellsFabric.java | 10 + .../_90/megacells/datagen/ModelProvider.java | 56 ++ .../_90/megacells/datagen/TagProvider.java | 10 +- .../megacells/init/client/InitScreens.java | 19 + fabric/src/main/resources/fabric.mod.json | 2 +- fabric/src/main/resources/icon.png | Bin 2330 -> 677 bytes .../datagen/forge/BlockStateProvider.java | 33 +- .../datagen/forge/ItemModelProvider.java | 7 + .../datagen/forge/MEGADataGenerators.java | 1 + .../datagen/forge/PartModelProvider.java | 37 ++ .../megacells/datagen/forge/TagProvider.java | 10 +- .../_90/megacells/forge/MEGACellsForge.java | 12 + .../init/forge/client/InitScreens.java | 22 + forge/src/main/resources/META-INF/mods.toml | 10 +- forge/src/main/resources/logo.png | Bin 2053 -> 641 bytes gradle.properties | 2 +- 39 files changed, 1171 insertions(+), 62 deletions(-) create mode 100644 common/src/main/java/gripe/_90/megacells/block/MEGAPatternProviderBlock.java create mode 100644 common/src/main/java/gripe/_90/megacells/block/entity/MEGAPatternProviderBlockEntity.java create mode 100644 common/src/main/java/gripe/_90/megacells/definition/MEGAParts.java create mode 100644 common/src/main/java/gripe/_90/megacells/definition/MEGATags.java create mode 100644 common/src/main/java/gripe/_90/megacells/menu/MEGAPatternProviderMenu.java create mode 100644 common/src/main/java/gripe/_90/megacells/part/MEGAPatternProviderPart.java create mode 100644 common/src/main/resources/assets/ae2/screens/megacells/mega_pattern_provider.json create mode 100644 common/src/main/resources/assets/ae2/screens/megacells/schema.json create mode 100644 common/src/main/resources/assets/ae2/textures/guis/megacells/mega_pattern_provider.png create mode 100644 common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider.png create mode 100644 common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider_alternate.png create mode 100644 common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider_alternate_arrow.png create mode 100644 common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider_alternate_front.png create mode 100644 common/src/main/resources/assets/megacells/textures/part/mega_monitor_back.png create mode 100644 common/src/main/resources/assets/megacells/textures/part/mega_monitor_sides.png create mode 100644 common/src/main/resources/assets/megacells/textures/part/mega_monitor_sides_status.png create mode 100644 common/src/main/resources/assets/megacells/textures/part/mega_pattern_provider.png create mode 100644 fabric/src/main/java/gripe/_90/megacells/init/client/InitScreens.java create mode 100644 forge/src/main/java/gripe/_90/megacells/datagen/forge/PartModelProvider.java create mode 100644 forge/src/main/java/gripe/_90/megacells/init/forge/client/InitScreens.java diff --git a/common/src/main/java/gripe/_90/megacells/block/MEGAPatternProviderBlock.java b/common/src/main/java/gripe/_90/megacells/block/MEGAPatternProviderBlock.java new file mode 100644 index 00000000..3d41994f --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/block/MEGAPatternProviderBlock.java @@ -0,0 +1,102 @@ +package gripe._90.megacells.block; + +import java.util.List; + +import org.jetbrains.annotations.Nullable; + +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.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +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.phys.BlockHitResult; + +import appeng.api.util.IOrientable; +import appeng.block.AEBaseBlockItem; +import appeng.block.AEBaseEntityBlock; +import appeng.core.localization.Tooltips; +import appeng.menu.locator.MenuLocators; +import appeng.util.InteractionUtil; + +import gripe._90.megacells.block.entity.MEGAPatternProviderBlockEntity; + +public class MEGAPatternProviderBlock extends AEBaseEntityBlock { + public static final BooleanProperty OMNIDIRECTIONAL = BooleanProperty.create("omnidirectional"); + + public MEGAPatternProviderBlock(Properties props) { + super(props); + registerDefaultState(defaultBlockState().setValue(OMNIDIRECTIONAL, true)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(OMNIDIRECTIONAL); + } + + @Override + protected BlockState updateBlockStateFromBlockEntity(BlockState currentState, MEGAPatternProviderBlockEntity be) { + return currentState.setValue(OMNIDIRECTIONAL, be.isOmniDirectional()); + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, + boolean isMoving) { + var be = this.getBlockEntity(level, pos); + if (be != null) { + be.getLogic().updateRedstoneState(); + } + } + + @Override + public InteractionResult onActivated(Level level, BlockPos pos, Player p, + InteractionHand hand, + @Nullable ItemStack heldItem, BlockHitResult hit) { + if (InteractionUtil.isInAlternateUseMode(p)) { + return InteractionResult.PASS; + } + + var be = this.getBlockEntity(level, pos); + + if (be != null) { + if (!level.isClientSide()) { + be.openMenu(p, MenuLocators.forBlockEntity(be)); + } + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + return InteractionResult.PASS; + } + + @Override + protected boolean hasCustomRotation() { + return true; + } + + @Override + protected void customRotateBlock(IOrientable rotatable, Direction axis) { + if (rotatable instanceof MEGAPatternProviderBlockEntity patternProvider) { + patternProvider.setSide(axis); + } + } + + public static class Item extends AEBaseBlockItem { + public Item(Block id, Properties props) { + super(id, props); + } + + @Override + public void addCheckedInformation(ItemStack stack, Level level, List tooltip, TooltipFlag flag) { + tooltip.add(Tooltips.of("Supports processing patterns only.")); + } + } +} diff --git a/common/src/main/java/gripe/_90/megacells/block/entity/MEGAPatternProviderBlockEntity.java b/common/src/main/java/gripe/_90/megacells/block/entity/MEGAPatternProviderBlockEntity.java new file mode 100644 index 00000000..9c9c0ae4 --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/block/entity/MEGAPatternProviderBlockEntity.java @@ -0,0 +1,49 @@ +package gripe._90.megacells.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import appeng.api.stacks.AEItemKey; +import appeng.blockentity.crafting.PatternProviderBlockEntity; +import appeng.helpers.iface.PatternProviderLogic; +import appeng.menu.ISubMenu; +import appeng.menu.MenuOpener; +import appeng.menu.locator.MenuLocator; + +import gripe._90.megacells.definition.MEGABlocks; +import gripe._90.megacells.menu.MEGAPatternProviderMenu; + +public class MEGAPatternProviderBlockEntity extends PatternProviderBlockEntity { + + public MEGAPatternProviderBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState blockState) { + super(blockEntityType, pos, blockState); + } + + @Override + public PatternProviderLogic createLogic() { + return new PatternProviderLogic(this.getMainNode(), this, 18); + } + + @Override + public void openMenu(Player player, MenuLocator locator) { + MenuOpener.open(MEGAPatternProviderMenu.TYPE, player, locator); + } + + @Override + public void returnToMainMenu(Player player, ISubMenu subMenu) { + MenuOpener.returnTo(MEGAPatternProviderMenu.TYPE, player, subMenu.getLocator()); + } + + @Override + public AEItemKey getTerminalIcon() { + return AEItemKey.of(MEGABlocks.MEGA_PATTERN_PROVIDER.stack()); + } + + @Override + public ItemStack getMainMenuIcon() { + return MEGABlocks.MEGA_PATTERN_PROVIDER.stack(); + } +} diff --git a/common/src/main/java/gripe/_90/megacells/datagen/CommonRecipeSupplier.java b/common/src/main/java/gripe/_90/megacells/datagen/CommonRecipeSupplier.java index 331962f9..d2d61d7e 100644 --- a/common/src/main/java/gripe/_90/megacells/datagen/CommonRecipeSupplier.java +++ b/common/src/main/java/gripe/_90/megacells/datagen/CommonRecipeSupplier.java @@ -29,6 +29,7 @@ import gripe._90.megacells.definition.MEGABlocks; import gripe._90.megacells.definition.MEGAItems; +import gripe._90.megacells.definition.MEGAParts; import gripe._90.megacells.integration.appbot.AppBotItems; import gripe._90.megacells.util.Utils; @@ -44,50 +45,31 @@ public static void buildRecipes(Consumer consumer) { housing(consumer, MEGAItems.MEGA_ITEM_CELL_HOUSING, ConventionTags.IRON_INGOT); housing(consumer, MEGAItems.MEGA_FLUID_CELL_HOUSING, ConventionTags.COPPER_INGOT); - cell(consumer, MEGAItems.ITEM_CELL_1M, MEGAItems.CELL_COMPONENT_1M, MEGAItems.MEGA_ITEM_CELL_HOUSING, - ConventionTags.IRON_INGOT); - cell(consumer, MEGAItems.ITEM_CELL_4M, MEGAItems.CELL_COMPONENT_4M, MEGAItems.MEGA_ITEM_CELL_HOUSING, - ConventionTags.IRON_INGOT); - cell(consumer, MEGAItems.ITEM_CELL_16M, MEGAItems.CELL_COMPONENT_16M, MEGAItems.MEGA_ITEM_CELL_HOUSING, - ConventionTags.IRON_INGOT); - cell(consumer, MEGAItems.ITEM_CELL_64M, MEGAItems.CELL_COMPONENT_64M, MEGAItems.MEGA_ITEM_CELL_HOUSING, - ConventionTags.IRON_INGOT); - cell(consumer, MEGAItems.ITEM_CELL_256M, MEGAItems.CELL_COMPONENT_256M, MEGAItems.MEGA_ITEM_CELL_HOUSING, - ConventionTags.IRON_INGOT); - cell(consumer, MEGAItems.FLUID_CELL_1M, MEGAItems.CELL_COMPONENT_1M, MEGAItems.MEGA_FLUID_CELL_HOUSING, - ConventionTags.COPPER_INGOT); - cell(consumer, MEGAItems.FLUID_CELL_4M, MEGAItems.CELL_COMPONENT_4M, MEGAItems.MEGA_FLUID_CELL_HOUSING, - ConventionTags.COPPER_INGOT); - cell(consumer, MEGAItems.FLUID_CELL_16M, MEGAItems.CELL_COMPONENT_16M, MEGAItems.MEGA_FLUID_CELL_HOUSING, - ConventionTags.COPPER_INGOT); - cell(consumer, MEGAItems.FLUID_CELL_64M, MEGAItems.CELL_COMPONENT_64M, MEGAItems.MEGA_FLUID_CELL_HOUSING, - ConventionTags.COPPER_INGOT); - cell(consumer, MEGAItems.FLUID_CELL_256M, MEGAItems.CELL_COMPONENT_256M, MEGAItems.MEGA_FLUID_CELL_HOUSING, - ConventionTags.COPPER_INGOT); + cell(consumer, MEGAItems.ITEM_CELL_1M, MEGAItems.CELL_COMPONENT_1M, MEGAItems.MEGA_ITEM_CELL_HOUSING, ConventionTags.IRON_INGOT); + cell(consumer, MEGAItems.ITEM_CELL_4M, MEGAItems.CELL_COMPONENT_4M, MEGAItems.MEGA_ITEM_CELL_HOUSING, ConventionTags.IRON_INGOT); + cell(consumer, MEGAItems.ITEM_CELL_16M, MEGAItems.CELL_COMPONENT_16M, MEGAItems.MEGA_ITEM_CELL_HOUSING, ConventionTags.IRON_INGOT); + cell(consumer, MEGAItems.ITEM_CELL_64M, MEGAItems.CELL_COMPONENT_64M, MEGAItems.MEGA_ITEM_CELL_HOUSING, ConventionTags.IRON_INGOT); + cell(consumer, MEGAItems.ITEM_CELL_256M, MEGAItems.CELL_COMPONENT_256M, MEGAItems.MEGA_ITEM_CELL_HOUSING, ConventionTags.IRON_INGOT); + cell(consumer, MEGAItems.FLUID_CELL_1M, MEGAItems.CELL_COMPONENT_1M, MEGAItems.MEGA_FLUID_CELL_HOUSING, ConventionTags.COPPER_INGOT); + cell(consumer, MEGAItems.FLUID_CELL_4M, MEGAItems.CELL_COMPONENT_4M, MEGAItems.MEGA_FLUID_CELL_HOUSING, ConventionTags.COPPER_INGOT); + cell(consumer, MEGAItems.FLUID_CELL_16M, MEGAItems.CELL_COMPONENT_16M, MEGAItems.MEGA_FLUID_CELL_HOUSING, ConventionTags.COPPER_INGOT); + cell(consumer, MEGAItems.FLUID_CELL_64M, MEGAItems.CELL_COMPONENT_64M, MEGAItems.MEGA_FLUID_CELL_HOUSING, ConventionTags.COPPER_INGOT); + cell(consumer, MEGAItems.FLUID_CELL_256M, MEGAItems.CELL_COMPONENT_256M, MEGAItems.MEGA_FLUID_CELL_HOUSING, ConventionTags.COPPER_INGOT); + + portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_1M, MEGAItems.CELL_COMPONENT_1M, MEGAItems.MEGA_ITEM_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_4M, MEGAItems.CELL_COMPONENT_4M, MEGAItems.MEGA_ITEM_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_16M, MEGAItems.CELL_COMPONENT_16M, MEGAItems.MEGA_ITEM_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_64M, MEGAItems.CELL_COMPONENT_64M, MEGAItems.MEGA_ITEM_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_256M, MEGAItems.CELL_COMPONENT_256M, MEGAItems.MEGA_ITEM_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_1M, MEGAItems.CELL_COMPONENT_1M, MEGAItems.MEGA_FLUID_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_4M, MEGAItems.CELL_COMPONENT_4M, MEGAItems.MEGA_FLUID_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_16M, MEGAItems.CELL_COMPONENT_16M, MEGAItems.MEGA_FLUID_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_64M, MEGAItems.CELL_COMPONENT_64M, MEGAItems.MEGA_FLUID_CELL_HOUSING); + portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_256M, MEGAItems.CELL_COMPONENT_256M, MEGAItems.MEGA_FLUID_CELL_HOUSING); + + specialisedComponent(consumer, MEGAItems.CELL_COMPONENT_16M, AEItems.SPATIAL_16_CELL_COMPONENT, MEGAItems.BULK_CELL_COMPONENT); + // spotless:on - portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_1M, MEGAItems.CELL_COMPONENT_1M, - MEGAItems.MEGA_ITEM_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_4M, MEGAItems.CELL_COMPONENT_4M, - MEGAItems.MEGA_ITEM_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_16M, MEGAItems.CELL_COMPONENT_16M, - MEGAItems.MEGA_ITEM_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_64M, MEGAItems.CELL_COMPONENT_64M, - MEGAItems.MEGA_ITEM_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_ITEM_CELL_256M, MEGAItems.CELL_COMPONENT_256M, - MEGAItems.MEGA_ITEM_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_1M, MEGAItems.CELL_COMPONENT_1M, - MEGAItems.MEGA_FLUID_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_4M, MEGAItems.CELL_COMPONENT_4M, - MEGAItems.MEGA_FLUID_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_16M, MEGAItems.CELL_COMPONENT_16M, - MEGAItems.MEGA_FLUID_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_64M, MEGAItems.CELL_COMPONENT_64M, - MEGAItems.MEGA_FLUID_CELL_HOUSING); - portable(consumer, MEGAItems.PORTABLE_FLUID_CELL_256M, MEGAItems.CELL_COMPONENT_256M, - MEGAItems.MEGA_FLUID_CELL_HOUSING); - - specialisedComponent(consumer, MEGAItems.CELL_COMPONENT_16M, AEItems.SPATIAL_16_CELL_COMPONENT, - MEGAItems.BULK_CELL_COMPONENT); ShapedRecipeBuilder.shaped(MEGAItems.BULK_ITEM_CELL) .pattern("aba") .pattern("bcb") @@ -147,6 +129,15 @@ public static void buildRecipes(Consumer consumer) { .unlockedBy("has_matter_ball", has(AEItems.MATTER_BALL)) .save(consumer, Utils.makeId("crafting/compression_card")); + ShapelessRecipeBuilder.shapeless(MEGAParts.MEGA_PATTERN_PROVIDER) + .requires(MEGABlocks.MEGA_PATTERN_PROVIDER) + .unlockedBy("has_mega_pattern_provider", has(MEGABlocks.MEGA_PATTERN_PROVIDER)) + .save(consumer, Utils.makeId("network/mega_pattern_provider_part")); + ShapelessRecipeBuilder.shapeless(MEGABlocks.MEGA_PATTERN_PROVIDER) + .requires(MEGAParts.MEGA_PATTERN_PROVIDER) + .unlockedBy("has_cable_mega_pattern_provider", has(MEGAParts.MEGA_PATTERN_PROVIDER)) + .save(consumer, Utils.makeId("network/mega_pattern_provider_block")); + manaCells(consumer, AppBotItems.MANA_CELL_1M, AppBotItems.PORTABLE_MANA_CELL_1M, MEGAItems.TIER_1M); manaCells(consumer, AppBotItems.MANA_CELL_4M, AppBotItems.PORTABLE_MANA_CELL_4M, MEGAItems.TIER_4M); manaCells(consumer, AppBotItems.MANA_CELL_16M, AppBotItems.PORTABLE_MANA_CELL_16M, MEGAItems.TIER_16M); diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGABlockEntities.java b/common/src/main/java/gripe/_90/megacells/definition/MEGABlockEntities.java index 6ce8998a..3ad4f204 100644 --- a/common/src/main/java/gripe/_90/megacells/definition/MEGABlockEntities.java +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGABlockEntities.java @@ -20,6 +20,7 @@ import appeng.blockentity.networking.EnergyCellBlockEntity; import appeng.core.definitions.BlockDefinition; +import gripe._90.megacells.block.entity.MEGAPatternProviderBlockEntity; import gripe._90.megacells.util.Utils; @SuppressWarnings({ "unused", "unchecked" }) @@ -41,6 +42,8 @@ public static Map> getBlockEntityTypes() { public static final BlockEntityType MEGA_CRAFTING_UNIT = create("mega_crafting_unit", CraftingBlockEntity.class, CraftingBlockEntity::new, MEGABlocks.MEGA_CRAFTING_UNIT, MEGABlocks.CRAFTING_ACCELERATOR); public static final BlockEntityType MEGA_CRAFTING_STORAGE = create("mega_crafting_storage", CraftingBlockEntity.class, CraftingBlockEntity::new, MEGABlocks.CRAFTING_STORAGE_1M, MEGABlocks.CRAFTING_STORAGE_4M, MEGABlocks.CRAFTING_STORAGE_16M, MEGABlocks.CRAFTING_STORAGE_64M, MEGABlocks.CRAFTING_STORAGE_256M); public static final BlockEntityType MEGA_CRAFTING_MONITOR = create("mega_crafting_monitor", CraftingMonitorBlockEntity.class, CraftingMonitorBlockEntity::new, MEGABlocks.CRAFTING_MONITOR); + + public static final BlockEntityType MEGA_PATTERN_PROVIDER = create("mega_pattern_provider", MEGAPatternProviderBlockEntity.class, MEGAPatternProviderBlockEntity::new, MEGABlocks.MEGA_PATTERN_PROVIDER); // spotless:on @SafeVarargs diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGABlocks.java b/common/src/main/java/gripe/_90/megacells/definition/MEGABlocks.java index fb08aa99..1d8c57fc 100644 --- a/common/src/main/java/gripe/_90/megacells/definition/MEGABlocks.java +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGABlocks.java @@ -14,6 +14,8 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.Material; +import appeng.block.AEBaseBlock; +import appeng.block.AEBaseBlockItem; import appeng.block.crafting.CraftingMonitorBlock; import appeng.block.crafting.CraftingUnitBlock; import appeng.block.networking.EnergyCellBlock; @@ -24,6 +26,7 @@ import gripe._90.megacells.block.MEGACraftingBlockItem; import gripe._90.megacells.block.MEGACraftingUnitType; +import gripe._90.megacells.block.MEGAPatternProviderBlock; import gripe._90.megacells.util.Utils; public final class MEGABlocks { @@ -53,6 +56,8 @@ public static List> getBlocks() { public static final BlockDefinition CRAFTING_STORAGE_64M = craftingBlock("64M MEGA Crafting Storage", "64m_crafting_storage", () -> new CraftingUnitBlock(props, MEGACraftingUnitType.STORAGE_64M), () -> MEGAItems.CELL_COMPONENT_64M); public static final BlockDefinition CRAFTING_STORAGE_256M = craftingBlock("256M MEGA Crafting Storage", "256m_crafting_storage", () -> new CraftingUnitBlock(props, MEGACraftingUnitType.STORAGE_256M), () -> MEGAItems.CELL_COMPONENT_256M); public static final BlockDefinition CRAFTING_MONITOR = craftingBlock("MEGA Crafting Monitor", "mega_crafting_monitor", () -> new CraftingMonitorBlock(props, MEGACraftingUnitType.MONITOR), () -> AEParts.STORAGE_MONITOR); + + public static final BlockDefinition MEGA_PATTERN_PROVIDER = block("MEGA Pattern Provider", "mega_pattern_provider", () -> new MEGAPatternProviderBlock(props), MEGAPatternProviderBlock.Item::new); // spotless:on private static BlockDefinition craftingBlock(String englishName, String id, @@ -76,12 +81,13 @@ private static BlockDefinition block(String englishName, St if (item == null) { throw new IllegalArgumentException("BlockItem factory for " + id + " returned null"); } + } else if (block instanceof AEBaseBlock) { + item = new AEBaseBlockItem(block, itemProperties); } else { item = new BlockItem(block, itemProperties); } BlockDefinition definition = new BlockDefinition<>(englishName, Utils.makeId(id), block, item); - BLOCKS.add(definition); return definition; } diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGAParts.java b/common/src/main/java/gripe/_90/megacells/definition/MEGAParts.java new file mode 100644 index 00000000..c6180441 --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGAParts.java @@ -0,0 +1,36 @@ +package gripe._90.megacells.definition; + +import java.util.function.Function; + +import net.minecraft.world.item.Item; + +import appeng.api.parts.IPart; +import appeng.api.parts.IPartItem; +import appeng.api.parts.PartModels; +import appeng.core.definitions.ItemDefinition; +import appeng.items.parts.PartItem; +import appeng.items.parts.PartModelsHelper; + +import gripe._90.megacells.part.MEGAPatternProviderPart; + +public final class MEGAParts { + + public static void init() { + // controls static load order + } + + // spotless:off + public static final ItemDefinition> MEGA_PATTERN_PROVIDER = customPart("MEGA Pattern Provider", "cable_mega_pattern_provider", MEGAPatternProviderPart.class, MEGAPatternProviderPart.Item::new); + // spotless:on + + private static ItemDefinition> part(String englishName, String id, Class partClass, + Function, T> factory) { + return customPart(englishName, id, partClass, props -> new PartItem<>(props, partClass, factory)); + } + + private static ItemDefinition> customPart(String englishName, String id, + Class partClass, Function> itemFactory) { + PartModels.registerModels(PartModelsHelper.createModels(partClass)); + return MEGAItems.item(englishName, id, itemFactory); + } +} diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGATags.java b/common/src/main/java/gripe/_90/megacells/definition/MEGATags.java new file mode 100644 index 00000000..e5672a54 --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGATags.java @@ -0,0 +1,14 @@ +package gripe._90.megacells.definition; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; + +public final class MEGATags { + public static final TagKey MEGA_PATTERN_PROVIDER = itemTag("megacells:mega_pattern_provider"); + + private static TagKey itemTag(String name) { + return TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(name)); + } +} diff --git a/common/src/main/java/gripe/_90/megacells/menu/MEGAPatternProviderMenu.java b/common/src/main/java/gripe/_90/megacells/menu/MEGAPatternProviderMenu.java new file mode 100644 index 00000000..d6b9f90a --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/menu/MEGAPatternProviderMenu.java @@ -0,0 +1,25 @@ +package gripe._90.megacells.menu; + +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; + +import appeng.api.config.SecurityPermissions; +import appeng.core.definitions.AEItems; +import appeng.helpers.iface.PatternProviderLogicHost; +import appeng.menu.implementations.MenuTypeBuilder; +import appeng.menu.implementations.PatternProviderMenu; +import appeng.util.inv.AppEngInternalInventory; +import appeng.util.inv.filter.AEItemDefinitionFilter; + +public class MEGAPatternProviderMenu extends PatternProviderMenu { + public static final MenuType TYPE = MenuTypeBuilder + .create(MEGAPatternProviderMenu::new, PatternProviderLogicHost.class) + .requirePermission(SecurityPermissions.BUILD) + .build("mega_pattern_provider"); + + public MEGAPatternProviderMenu(int id, Inventory playerInventory, PatternProviderLogicHost host) { + super(TYPE, id, playerInventory, host); + ((AppEngInternalInventory) logic.getPatternInv()) + .setFilter(new AEItemDefinitionFilter(AEItems.PROCESSING_PATTERN)); + } +} diff --git a/common/src/main/java/gripe/_90/megacells/part/MEGAPatternProviderPart.java b/common/src/main/java/gripe/_90/megacells/part/MEGAPatternProviderPart.java new file mode 100644 index 00000000..3528225e --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/part/MEGAPatternProviderPart.java @@ -0,0 +1,74 @@ +package gripe._90.megacells.part; + +import java.util.List; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import appeng.api.parts.IPartItem; +import appeng.api.parts.IPartModel; +import appeng.core.AppEng; +import appeng.core.localization.Tooltips; +import appeng.helpers.iface.PatternProviderLogic; +import appeng.items.parts.PartItem; +import appeng.items.parts.PartModels; +import appeng.parts.PartModel; +import appeng.parts.crafting.PatternProviderPart; + +import gripe._90.megacells.definition.MEGAParts; +import gripe._90.megacells.util.Utils; + +public class MEGAPatternProviderPart extends PatternProviderPart { + + public static final ResourceLocation MODEL_BASE = Utils.makeId("part/mega_pattern_provider"); + + @PartModels + public static final PartModel MODELS_OFF = new PartModel(MODEL_BASE, AppEng.makeId("part/interface_off")); + + @PartModels + public static final PartModel MODELS_ON = new PartModel(MODEL_BASE, AppEng.makeId("part/interface_on")); + + @PartModels + public static final PartModel MODELS_HAS_CHANNEL = new PartModel(MODEL_BASE, + AppEng.makeId("part/interface_has_channel")); + + public MEGAPatternProviderPart(IPartItem partItem) { + super(partItem); + } + + @Override + public PatternProviderLogic createLogic() { + return new PatternProviderLogic(this.getMainNode(), this, 18); + } + + @Override + public IPartModel getStaticModels() { + if (this.isActive() && this.isPowered()) { + return MODELS_HAS_CHANNEL; + } else if (this.isPowered()) { + return MODELS_ON; + } else { + return MODELS_OFF; + } + } + + @Override + public ItemStack getMainMenuIcon() { + return MEGAParts.MEGA_PATTERN_PROVIDER.stack(); + } + + public static class Item extends PartItem { + public Item(Properties properties) { + super(properties, MEGAPatternProviderPart.class, MEGAPatternProviderPart::new); + } + + @Override + public void appendHoverText(ItemStack stack, Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + tooltip.add(Tooltips.of("Supports processing patterns only.")); + } + } +} diff --git a/common/src/main/resources/assets/ae2/screens/megacells/mega_pattern_provider.json b/common/src/main/resources/assets/ae2/screens/megacells/mega_pattern_provider.json new file mode 100644 index 00000000..dd730b88 --- /dev/null +++ b/common/src/main/resources/assets/ae2/screens/megacells/mega_pattern_provider.json @@ -0,0 +1,59 @@ +{ + "$schema": "schema.json", + "includes": ["../common/common.json", "../common/player_inventory.json"], + "background": { + "texture": "guis/megacells/mega_pattern_provider.png", + "srcRect": [0, 0, 176, 213] + }, + "slots": { + "ENCODED_PATTERN": { + "left": 8, + "top": 45, + "grid": "BREAK_AFTER_9COLS" + }, + "STORAGE": { + "left": 8, + "top": 97, + "grid": "HORIZONTAL" + } + }, + "text": { + "dialog_title": { + "text": { + "translate": "block.megacells.mega_pattern_provider" + }, + "position": { + "left": 8, + "top": 6 + } + }, + "interface_config": { + "text": { + "translate": "gui.ae2.Patterns" + }, + "position": { + "left": 8, + "top": 34 + } + }, + "interface_stored_items": { + "text": { + "translate": "gui.ae2.ReturnInventory" + }, + "position": { + "left": 8, + "top": 86 + } + } + }, + "widgets": { + "openPriority": { + "left": 154, + "top": 0 + }, + "lockReason": { + "left": 5, + "top": 15 + } + } +} diff --git a/common/src/main/resources/assets/ae2/screens/megacells/schema.json b/common/src/main/resources/assets/ae2/screens/megacells/schema.json new file mode 100644 index 00000000..87d2e3e4 --- /dev/null +++ b/common/src/main/resources/assets/ae2/screens/megacells/schema.json @@ -0,0 +1,548 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://appliedenergistics.github.io/screen_style", + "type": "object", + "title": "AE2 Screen Style", + "description": "Provides styling information for an AE2 UI screen", + "required": [], + "definitions": { + "position": { + "$comment": "Used to position an element in relationship to the size of the current dialog", + "$id": "Position", + "type": "object", + "properties": { + "left": { + "type": "number", + "description": "Positions the content to the right (positive) or left (negative) of the left screen edge." + }, + "top": { + "type": "number", + "description": "Positions the content to the bottom (positive) or top (negative) of the top screen edge." + }, + "right": { + "type": "number", + "description": "Positions the content to the left (positive) or right (negative) of the right screen edge." + }, + "bottom": { + "type": "number", + "description": "Positions the content to the top (positive) or bottom (negative) of the bottom screen edge." + } + } + }, + "color": { + "$comment": "Definition of a color using a fake HTML notation", + "type": "string", + "pattern": "^#([0-9a-fA-F]{2}){3,4}$" + }, + "text": { + "$comment": "JSON schema definition of Minecraft text https://minecraft.fandom.com/wiki/Raw_JSON_text_format", + "type": "object", + "properties": { + "extra": { + "description": "Text that is displayed after this text, but that inherits this texts properties.", + "type": "array", + "items": { + "$ref": "#/definitions/text" + } + }, + "color": { + "type": "string", + "pattern": "^#([0-9a-fA-F]{6})$" + }, + "font": { + "type": "string", + "default": "minecraft:default", + "description": "Font in assets//font" + }, + "bold": { + "type": "boolean", + "default": false + }, + "italic": { + "type": "boolean", + "default": false + }, + "underlined": { + "type": "boolean", + "default": false + }, + "strikethrough": { + "type": "boolean", + "default": false + }, + "obfuscated": { + "type": "boolean", + "default": false + }, + "insertion": { + "type": "string", + "description": "When shift-clicked while the chat is open, the text of this property will be inserted." + }, + "clickEvent": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "open_url", + "open_file", + "run_command", + "suggest_command", + "change_page", + "copy_to_clipboard" + ] + }, + "value": { + "type": "string" + } + }, + "required": ["action", "value"] + }, + "hoverEvent": { + "type": "object", + "oneOf": [ + { + "properties": { + "action": { + "const": "show_text" + }, + "contents": { + "$ref": "#/definitions/text" + } + } + }, + { + "properties": { + "action": { + "const": "show_item" + }, + "contents": { + "type": "object", + "properties": { + "id": { + "type": "string", + "default": "minecraft:air", + "description": "The item to show" + }, + "count": { + "type": "integer", + "default": 1, + "description": "The item stack size" + }, + "tag": { + "type": "string", + "description": "NBT of the item, serialized as string. See https://minecraft.fandom.com/wiki/Player.dat_format#Item_structure" + } + }, + "required": ["id"] + } + } + }, + { + "properties": { + "action": { + "const": "show_entity" + }, + "contents": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/text" + }, + "type": { + "type": "string", + "default": "minecraft:pig", + "description": "The entity type id to show" + }, + "id": { + "type": "string", + "description": "UUID of the entity to show" + } + } + } + } + } + ] + } + }, + "oneOf": [ + { + "properties": { + "text": { + "description": "Display simple text", + "type": "string" + } + }, + "required": ["text"] + }, + { + "properties": { + "translate": { + "description": "The ID of a translation key", + "type": "string" + }, + "with": { + "type": "array", + "items": { + "$ref": "#/definitions/text" + } + } + }, + "required": ["translate"] + }, + { + "properties": { + "keybind": { + "type": "string", + "description": "A keybind identifier" + } + }, + "required": ["keybind"] + } + ] + }, + "rect": { + "oneOf": [ + { + "type": "array", + "items": [ + { + "type": "integer", + "description": "x" + }, + { + "type": "integer", + "description": "y" + }, + { + "type": "integer", + "description": "width" + }, + { + "type": "integer", + "description": "height" + } + ], + "additionalItems": false + }, + { + "type": "object", + "properties": { + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + } + }, + "additionalProperties": false + } + ] + }, + "blitter": { + "type": "object", + "properties": { + "texture": { + "type": "string" + }, + "textureWidth": { + "type": "integer", + "default": 256 + }, + "textureHeight": { + "type": "integer", + "default": 256 + }, + "srcRect": { + "$ref": "#/definitions/rect" + } + }, + "required": ["texture"] + }, + "generatedBackground": { + "type": "object", + "properties": { + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + } + }, + "required": ["width", "height"] + } + }, + "properties": { + "includes": { + "description": "Relative path to other files to include before processing this one.", + "type": "array", + "items": { + "type": "string" + } + }, + "palette": { + "$comment": "See PaletteColor enum", + "type": "object", + "description": "Defines colors used through the UI screen", + "properties": { + "DEFAULT_TEXT_COLOR": { + "$ref": "#/definitions/color" + }, + "MUTED_TEXT_COLOR": { + "$ref": "#/definitions/color" + }, + "SELECTION_COLOR": { + "$ref": "#/definitions/color" + }, + "TEXTFIELD_PLACEHOLDER": { + "$ref": "#/definitions/color" + }, + "TEXTFIELD_SELECTION": { + "$ref": "#/definitions/color" + }, + "TEXTFIELD_ERROR": { + "$ref": "#/definitions/color" + }, + "TEXTFIELD_TEXT": { + "$ref": "#/definitions/color" + }, + "ERROR": { + "$ref": "#/definitions/color" + } + } + }, + "background": { + "$ref": "#/definitions/blitter" + }, + "generatedBackground": { + "$ref": "#/definitions/generatedBackground" + }, + "slots": { + "type": "object", + "description": "Defines positions for slots and their grid alignment", + "additionalProperties": { + "type": "object", + "allOf": [ + { + "properties": { + "grid": { + "$comment": "Configures the slots with this semantic in a grid", + "enum": [ + "IO_BUS_CONFIG", + "BREAK_AFTER_9COLS", + "BREAK_AFTER_2COLS", + "BREAK_AFTER_3COLS", + "HORIZONTAL", + "VERTICAL" + ] + } + } + }, + { + "$ref": "#/definitions/position" + } + ] + }, + "propertyNames": { + "$comment": "List SlotSemantic names here", + "enum": [ + "NONE", + "STORAGE", + "PLAYER_INVENTORY", + "PLAYER_HOTBAR", + "TOOLBOX", + "CONFIG", + "UPGRADE", + "STORAGE_CELL", + "INSCRIBER_PLATE_TOP", + "INSCRIBER_PLATE_BOTTOM", + "MACHINE_INPUT", + "MACHINE_PROCESSING", + "MACHINE_OUTPUT", + "MACHINE_CRAFTING_GRID", + "BLANK_PATTERN", + "ENCODED_PATTERN", + "VIEW_CELL", + "CRAFTING_GRID", + "CRAFTING_RESULT", + "PROCESSING_INPUTS", + "PROCESSING_OUTPUTS", + "SMITHING_TABLE_BASE", + "SMITHING_TABLE_ADDITION", + "SMITHING_TABLE_RESULT", + "STONECUTTING_INPUT", + "BIOMETRIC_CARD", + "MISSING_INGREDIENT" + ] + } + }, + "text": { + "description": "Defines text that will be shown on the UI, the property name is used to reference text from code", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "text": { + "$ref": "#/definitions/text" + }, + "color": { + "$comment": "See enum PaletteColor", + "enum": [ + "DEFAULT_TEXT_COLOR", + "MUTED_TEXT_COLOR", + "SELECTION_COLOR", + "ERROR" + ], + "default": "DEFAULT_TEXT_COLOR" + }, + "position": { + "$ref": "#/definitions/position" + }, + "scale": { + "type": "number", + "default": 1, + "minimum": 0.1, + "maximum": 4, + "$comment": "Can be used to display smaller text, 0.5 works well, usually" + }, + "align": { + "type": "string", + "default": "LEFT", + "enum": ["LEFT", "CENTER", "RIGHT"] + }, + "maxWidth": { + "type": "number", + "minimum": 0, + "default": 0, + "description": "If greater than 0, the text will be word-wrapped when it reaches the given width in pixels." + } + } + } + }, + "tooltips": { + "description": "Defines areas that will show a tooltip on the screen. These areas are evaluated after everything else that could show a tooltip.", + "type": "object", + "additionalProperties": { + "allOf": [ + { + "type": "object", + "properties": { + "tooltip": { + "type": "array", + "items": { + "$ref": "#/definitions/text" + } + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + } + }, + "required": ["tooltip", "width", "height"] + }, + { + "$ref": "#/definitions/position" + } + ] + } + }, + "images": { + "description": "Additional screen-specific images", + "additionalProperties": { + "$ref": "#/definitions/blitter" + } + }, + "terminalStyle": { + "description": "If this screen is a terminal, this defines required properties to display it properly", + "type": "object", + "additionalProperties": false, + "properties": { + "header": { + "description": "The top of the terminal background right up to the first row of content.", + "$ref": "#/definitions/blitter" + }, + "firstRow": { + "description": "The area to draw for the first row in the terminal. Usually this includes the top of the scrollbar.", + "$ref": "#/definitions/blitter" + }, + "row": { + "description": "The area to repeat for every row in the terminal. Should be 16px for the item + 2px for the border in size.", + "$ref": "#/definitions/blitter" + }, + "lastRow": { + "description": "The area to draw for the last row in the terminal. Usually this includes the top of the scrollbar.", + "$ref": "#/definitions/blitter" + }, + "bottom": { + "description": "The area to draw at the bottom of the terminal (i.e. includes the player inventory).", + "$ref": "#/definitions/blitter" + }, + "maxRows": { + "description": "If specified, limits the terminal to at most this many rows rather than using up available space.", + "type": "integer", + "minimum": 3 + }, + "slotsPerRow": { + "description": "The number of slots per row on the background image.", + "type": "integer", + "minimum": 1 + }, + "sortable": { + "description": "Defines if this terminal has a sort by button.", + "type": "boolean", + "default": true + }, + "supportsAutoCrafting": { + "description": "Defines if this terminal supports auto-crafting. If not, the button to show only craftable items is hidden.", + "type": "boolean", + "default": false + }, + "stackSizeStyle": { + "description": "The type of stack size rendering to use.", + "type": "string", + "default": "ITEMS", + "enum": ["ITEMS", "FLUIDS"] + }, + "showTooltipsWithItemInHand": { + "type": "boolean", + "default": false, + "description": "Should the terminal show item tooltips for the network inventory even if the player has an item in their hand? Useful for showing fluid tooltips when the player has a bucket in hand." + } + } + }, + "widgets": { + "description": "Defines properties of various widgets that are positioned on the screen. The properties are widget-dependant. Which widget is placed is decided in code.", + "type": "object", + "additionalProperties": { + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/position" + }, + { + "properties": { + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "hideEdge": { + "description": "Used to hide the border around TabButtons", + "type": "boolean" + } + } + } + ] + } + } + } +} diff --git a/common/src/main/resources/assets/ae2/textures/guis/megacells/mega_pattern_provider.png b/common/src/main/resources/assets/ae2/textures/guis/megacells/mega_pattern_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..ae59c8194d2b1a3c493013d02579bb358aa31c1e GIT binary patch literal 721 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fq6g;1l8sq#=Njk&&61nT3VL z+}zy4!ot$hG9)Ar??oR(XFw&*Wk zTO^ERkQ{?Sd;js`3G;r{07d)RU-ShY&Jc3qP~?g2I5jI}&OZ*x$&cz8Z?9N?@k#mr z%PP_f)$VcJEtA(MR}K+LsQNFQH>-jd$viMKrv(J}uz@)ZtJM+mrx@N$>b>ypQeTG6 z&MJ44SuuaaW?q)p=Gox?e#PI%N6rQ^Fr14Ov0Z84ut((Hx7#V&b84r5DJkAF;l0>> zS6TPTZ)PtJ&+psIk1!F)YPinI;cITm_~FcRmUcTIf3e-7+k{yd9@L$WXGr*3_hZhg zx&GhTSA^xiEzD@@9F_O^g5>z62xy literal 5841 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 diff --git a/common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider.png b/common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a11d1faf6f8cad5f06a0b52c5247fb32e4764a GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M}SX=tAK!jh=_=&sHm8jn3R;1 zw6wI0jEth9qLPx5s;a7?p`o+0^Vzd!&z(DW;lhPmw{G3JbLZ~eyALn9J-p)c=t|(@ zt6@)WBtE?n<)16d12nV8)5S4FLNe9gQ>fX1=W|o9@TQ3(KmPl_o+5Yapn2vR-Vi~{ z2b&TSl0qkJn=ZmAnB=vVt6+2JHVLOYSJoH>Y`b^-c~v|&qiE@$PtuFKh5uQ7Ec7|H z^g)_%{PmPOGB$Y@cK+#Y$L%}YpCo!k)+HG;{TDqQw`Se4@>0X>7muU<^=YT(GbtS@ dIq$A?)jTzdhxK!@l_Jnx44$rjF6*2UngAP;Yjgkr literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider_alternate.png b/common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider_alternate.png new file mode 100644 index 0000000000000000000000000000000000000000..dc233e3f574c44f21c1b625efb585fc7d357648e GIT binary patch literal 281 zcmV+!0p|XRP)j@QmX>oY?UpB5H~fe43w?+@wwjDLO?|wzx>AN;)K6W zd|i`qDY)6h=Q$ZS2ag+$kHeYa@lWC*d6-g`pV*ARf5oyFtE=f^jS?VX!R00000NkvXXu0mjfp5Sqk literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider_alternate_arrow.png b/common/src/main/resources/assets/megacells/textures/block/mega_pattern_provider_alternate_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6ed4881fac1ee634212db8e8069d15c362ddc5 GIT binary patch literal 301 zcmV+|0n+}7P)7j4t^gh?y3+V~;O<$=tggw7(ifIJ^002k$Y?Iq)qq!(046`T3Nb zpS6-}vFUS|c?InI<`1kE1QOwQxz>Xr>({$JqR0g)APKft#o#;u0000gwCK zZ{M|R*R^ZcZrr$W^X5&4$iJ_FDi}+G{DK)Ap4~_Ta%wzX978ywUC$))9x@PMyKvs= zeb$40+DzA)8v2wHI1^1BjF`E(q?#I7cmH|9S#iK{=XB8n=W@0&-WT-vW0h7gR{-6?;OXk;vd$@?2>?=ET{{2( literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/megacells/textures/part/mega_monitor_sides.png b/common/src/main/resources/assets/megacells/textures/part/mega_monitor_sides.png new file mode 100644 index 0000000000000000000000000000000000000000..0be5d87bd7611cd333b14559c142ef3e687b8e20 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=9Td`~m_3f`WqEw{PFI zYuB}F*KXXnar5TQb$Xxn0HqmAg8YIR9G=}s19H+mT^vI=WLXa~@-_zuFkguJVau8; zTCki^WI{rNLgGvYqr27o728wz7`8|6YKYgr{p-OL+h={VwA_y!yLv_G&C??Gg;^TP zuOf3B=PXju(RwLak~90*PD9~$Kin?8V7&MA3hRSqhneg9w1l&KegTe~ HDWM4fheuC9 literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/megacells/textures/part/mega_monitor_sides_status.png b/common/src/main/resources/assets/megacells/textures/part/mega_monitor_sides_status.png new file mode 100644 index 0000000000000000000000000000000000000000..6b78d985164554b9de651cf9fdb706b5425222a9 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr`04UfRgZV93Gj@cEQX z&fzOLhnYGiY1un2Sl|&ee}dqIjvSdqt5_JO{xmpK^j$18?M}izr?hP=j2^RncRo{7 rBV?@1u;L7JdQXQ~=(B%Zj~VS>s>s9@bE;ec+Q8uH>gTe~DWM4fOsz3j literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/megacells/textures/part/mega_pattern_provider.png b/common/src/main/resources/assets/megacells/textures/part/mega_pattern_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..14d0e3ea1a9d1d6529c30244b794196893f555f5 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VW1=7;e(lRnKii(O#N=mA# zs)mM!&d$ycFS$Lu;`8WA;Nz=dPi`bWy%9C#z3>B|YQ~ZvzhDN3XE)M-96wJN#}JO_ z Registry.register(Registry.ITEM, i.id(), i.asItem())); MEGABlockEntities.getBlockEntityTypes().forEach((k, v) -> Registry.register(Registry.BLOCK_ENTITY_TYPE, k, v)); + Registry.register(Registry.MENU, AppEng.makeId("mega_pattern_provider"), MEGAPatternProviderMenu.TYPE); + InitStorageCells.init(); InitUpgrades.init(); @@ -67,6 +75,8 @@ public void onAe2Initialized() { // re-init AE2 props for MEGA energy cell InitItemModelsProperties.init(); + + ClientLifecycleEvents.CLIENT_STARTED.register(InitScreens::init); } } } diff --git a/fabric/src/main/java/gripe/_90/megacells/datagen/ModelProvider.java b/fabric/src/main/java/gripe/_90/megacells/datagen/ModelProvider.java index 975244e9..d5524815 100644 --- a/fabric/src/main/java/gripe/_90/megacells/datagen/ModelProvider.java +++ b/fabric/src/main/java/gripe/_90/megacells/datagen/ModelProvider.java @@ -33,6 +33,7 @@ import appeng.block.networking.EnergyCellBlock; import appeng.core.AppEng; +import gripe._90.megacells.block.MEGAPatternProviderBlock; import gripe._90.megacells.definition.MEGABlocks; import gripe._90.megacells.util.Utils; @@ -48,6 +49,17 @@ class ModelProvider extends FabricModelProvider { static final ResourceLocation STORAGE_CELL_LED = AppEng.makeId("item/storage_cell_led"); static final ResourceLocation PORTABLE_CELL_LED = AppEng.makeId("item/portable_cell_led"); + static final TextureSlot SIDES = TextureSlot.create("sides"); + static final TextureSlot SIDES_STATUS = TextureSlot.create("sidesStatus"); + + static final ModelTemplate PATTERN_PROVIDER = new ModelTemplate( + Optional.of(AppEng.makeId("part/pattern_provider_base")), Optional.empty(), + SIDES, SIDES_STATUS, TextureSlot.BACK, TextureSlot.FRONT, TextureSlot.PARTICLE); + + static final ModelTemplate CABLE_PATTERN_PROVIDER = new ModelTemplate( + Optional.of(AppEng.makeId("item/cable_interface")), Optional.empty(), + SIDES, TextureSlot.BACK, TextureSlot.FRONT); + ModelProvider(FabricDataGenerator gen) { super(gen); } @@ -60,10 +72,13 @@ public void generateBlockStateModels(BlockModelGenerators generator) { createCraftingUnit(block.first.block(), block.second, generator); } createCraftingMonitor(generator); + createPatternProviderBlock(generator); } @Override public void generateItemModels(ItemModelGenerators generator) { + generatePartModels(generator); + for (var item : CommonModelSupplier.FLAT_ITEMS) { generator.generateFlatItem(item.asItem(), ModelTemplates.FLAT_ITEM); } @@ -86,6 +101,10 @@ public void generateItemModels(ItemModelGenerators generator) { createDriveCellModel("bulk_item_cell", generator.output); } + private void generatePartModels(ItemModelGenerators generator) { + createPatternProviderPart(generator); + } + private TextureMapping cell(ResourceLocation cell, ResourceLocation led) { return new TextureMapping().put(TextureSlot.LAYER0, cell).put(LAYER1, led); } @@ -150,6 +169,43 @@ private JsonObject customModelLoader(ResourceLocation loc) { return json; } + private void createPatternProviderBlock(BlockModelGenerators generator) { + var normal = Utils.makeId("block/mega_pattern_provider"); + + generator.blockStateOutput.accept(MultiVariantGenerator.multiVariant(MEGABlocks.MEGA_PATTERN_PROVIDER.block()) + .with(PropertyDispatch.property(MEGAPatternProviderBlock.OMNIDIRECTIONAL) + .select(true, Variant.variant().with(VariantProperties.MODEL, ModelTemplates.CUBE_ALL + .create(normal, TextureMapping.cube(normal), generator.modelOutput))) + .select(false, Variant.variant().with(VariantProperties.MODEL, ModelTemplates.CUBE + .create(Utils.makeId("block/mega_pattern_provider_oriented"), new TextureMapping() + .put(TextureSlot.UP, + Utils.makeId("block/mega_pattern_provider_alternate_front")) + .put(TextureSlot.DOWN, Utils.makeId("block/mega_pattern_provider_alternate")) + .put(TextureSlot.NORTH, + Utils.makeId("block/mega_pattern_provider_alternate_arrow")) + .copySlot(TextureSlot.NORTH, TextureSlot.EAST) + .copySlot(TextureSlot.NORTH, TextureSlot.SOUTH) + .copySlot(TextureSlot.NORTH, TextureSlot.WEST) + .put(TextureSlot.PARTICLE, normal), generator.modelOutput)) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)))); + + generator.delegateItemModel(MEGABlocks.MEGA_PATTERN_PROVIDER.block(), normal); + } + + private void createPatternProviderPart(ItemModelGenerators generator) { + var provider = Utils.makeId("part/mega_pattern_provider"); + var monitorBack = Utils.makeId("part/mega_monitor_back"); + var monitorSides = Utils.makeId("part/mega_monitor_sides"); + PATTERN_PROVIDER.create(provider, new TextureMapping() + .put(SIDES_STATUS, Utils.makeId("part/mega_monitor_sides_status")) + .put(SIDES, monitorSides).put(TextureSlot.BACK, monitorBack) + .put(TextureSlot.FRONT, provider).put(TextureSlot.PARTICLE, monitorBack), + generator.output); + CABLE_PATTERN_PROVIDER.create(Utils.makeId("item/cable_mega_pattern_provider"), new TextureMapping() + .put(SIDES, monitorSides).put(TextureSlot.FRONT, provider).put(TextureSlot.BACK, monitorBack), + generator.output); + } + private void createEnergyCell(BlockModelGenerators generator) { var cell = MEGABlocks.MEGA_ENERGY_CELL; var fillStage = PropertyDispatch.property(EnergyCellBlock.ENERGY_STORAGE); diff --git a/fabric/src/main/java/gripe/_90/megacells/datagen/TagProvider.java b/fabric/src/main/java/gripe/_90/megacells/datagen/TagProvider.java index 833769c3..13531c7c 100644 --- a/fabric/src/main/java/gripe/_90/megacells/datagen/TagProvider.java +++ b/fabric/src/main/java/gripe/_90/megacells/datagen/TagProvider.java @@ -6,7 +6,11 @@ import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; import net.minecraft.tags.BlockTags; +import appeng.api.features.P2PTunnelAttunement; + import gripe._90.megacells.definition.MEGABlocks; +import gripe._90.megacells.definition.MEGAParts; +import gripe._90.megacells.definition.MEGATags; class TagProvider { static class Items extends FabricTagProvider.ItemTagProvider { @@ -16,7 +20,11 @@ static class Items extends FabricTagProvider.ItemTagProvider { @Override protected void generateTags() { - + tag(P2PTunnelAttunement.getAttunementTag(P2PTunnelAttunement.ENERGY_TUNNEL)) + .add(MEGABlocks.MEGA_ENERGY_CELL.asItem()); + tag(MEGATags.MEGA_PATTERN_PROVIDER) + .add(MEGABlocks.MEGA_PATTERN_PROVIDER.asItem()) + .add(MEGAParts.MEGA_PATTERN_PROVIDER.asItem()); } } diff --git a/fabric/src/main/java/gripe/_90/megacells/init/client/InitScreens.java b/fabric/src/main/java/gripe/_90/megacells/init/client/InitScreens.java new file mode 100644 index 00000000..90e44fbc --- /dev/null +++ b/fabric/src/main/java/gripe/_90/megacells/init/client/InitScreens.java @@ -0,0 +1,19 @@ +package gripe._90.megacells.init.client; + +import static appeng.init.client.InitScreens.register; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.Minecraft; + +import appeng.client.gui.implementations.PatternProviderScreen; + +import gripe._90.megacells.menu.MEGAPatternProviderMenu; + +@Environment(EnvType.CLIENT) +public class InitScreens { + public static void init(Minecraft client) { + register(MEGAPatternProviderMenu.TYPE, PatternProviderScreen::new, + "/screens/megacells/mega_pattern_provider.json"); + } +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index b8d1b19c..0cd00c00 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -28,7 +28,7 @@ "fabric-api": "*", "minecraft": "~1.19", "java": ">=17", - "ae2": ">=12.8.4" + "ae2": ">=12.9.2" }, "suggests": { "ae2wtlib": ">=12.8.4", diff --git a/fabric/src/main/resources/icon.png b/fabric/src/main/resources/icon.png index 5f5e64d1ba7972c362953c9ce90b6129b6506a53..e778ad6e28b1b7efeccf52d8363ab3e5d8cac7d9 100644 GIT binary patch literal 677 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKLEX+WWqKVr7fs{&sPlzj!1_D-ARyH;^K|w(o z85uP-H7zYIQ&Ur)A5r-_SDT%mbiJA>0aV0T666=m;PC858Uq89zNd?0NX4zUcMZLm z9VOZxKH&Vqrqt9lH6nsrkR_W{{{dr;$Xb?zF^XHmC?_y0Squ<>zQh?xzqEiZXDqfVnGKf-HOWR ztY2vVI>G%q%CV^d9r&;==-!_E&raeB7$DY>Z9S7%eZuX1 zO)W?^#{@_iqWrYXoKyw| zjfu4rZ9NV<$Q+Fi_Ffwz^G4y(goRd-0-}Xiv_uvR z=(*@QTeEt%zB?H&q5I;rcg%9j77?)x9GprbR{|VG&4jkRS`u;MLfxg~_Ah>^7HK|N z)i5zxPWpnv?z#{5Kklv#og?vm(jrfVFOMwb4?9$dXIztg{`*GZEOmzuk~=Ql{@2T9 z@Yl0y@7kmN4f}E*JleHZv--eOK7$V_CzieOa-8L~kz>#Ni{?)o|3xoIzxsOZ*8a=v z3f{3x^BbC-6PCE#%(i>~?%kWW_l?*7t7EufQ{XE)7O>#87rrdAj8+FW2b>ak|nMYCC>S|xv6<249-QV zi6yBi3gww484B*6z5(HleBwaUKY6-1hE&{od)+WgCS2zDN7>2O-|*}(l=!;&9n+*$ zB2KY$jDK+Cl`_aHuJu@b%+*7-V7`}t_^L&c1*&H@HJxpm*EKV#h_QM5hxnPb|7!F; zJl=crrvBy#p!LLn_|Tn9e4$>MMclt7k6+w<&iwlsQ3eGC1`ZAeCZ>i41|TAxcc6S( z5$pZ=Q!a%ZvJ6{2wSDLEb*~SZA1nM)|A?D~frW*Ek-bH{o!_do9ms>>!lB+A6xu7|A`gkbfCMDoQ}#P?5#iftCmZ6 zYWk|iTm#zDeKYv}ch@&X|C_R0<`a|j5+hQMWcCF*SFL8Y1C$`^A2p=&rBKwcA zkQE-7sBXaEeNY8PM3D*xUcMt$BR( z^z(b`BzMNYKV+_#@84B%e!deVq{H?(Fw9VeMG@EqC|*Ym2wXhAh^axd7P;S>ThC>G zVtxI836Sr8xB&w|{@U!t{6MQK|Nq?TeIq#bIxq%){kkR2!SGoHkwh`V5hwslzBuI$ zFs=^r3jT6p_h|n30dw1@T`K@id_fJ@ge|%h9{6(?m@!#jy|EYcpxn3&x{KfBm z9mP4@qk(~aW->XM0y#6Wukq6Ky{PPaxkdiTqc3VTkL&hw-`}yzn)`mnZL=EX=WpKL z0{eFH`)dATw{5rA>I*PD^Mqv?aDc-z5YfB_<}ll%9>5fKF9R6KGUCh4A4-3J9sA?h z)w_|P40Lau?bq7(LO-5S&%UWe6Q*1e*?ZB%_lKpPU;ZKUch`4+=(Yd%SG6X2XG~ju zj@j%Fy}Q;OHZMB&?`_%>&3VTSctB}No$@pVDI*q{&sxT5fBfi6-yg^F|Njx$w=qWV zu(_PP{9*IH-=9D9?(h4j^GNoLWqUr);RpZk0#g>a)PtlTf{6%QA@jj?s`iZOa9_XL z#dkkKZ~8;&*=Lt^+z&lxS(7Zm_P-nGNg^W z8v&zopr0M8iMi2wiq diff --git a/forge/src/main/java/gripe/_90/megacells/datagen/forge/BlockStateProvider.java b/forge/src/main/java/gripe/_90/megacells/datagen/forge/BlockStateProvider.java index 540f0737..86e89119 100644 --- a/forge/src/main/java/gripe/_90/megacells/datagen/forge/BlockStateProvider.java +++ b/forge/src/main/java/gripe/_90/megacells/datagen/forge/BlockStateProvider.java @@ -13,6 +13,7 @@ import appeng.core.AppEng; import appeng.core.definitions.BlockDefinition; +import gripe._90.megacells.block.MEGAPatternProviderBlock; import gripe._90.megacells.datagen.CommonModelSupplier; import gripe._90.megacells.definition.MEGABlocks; import gripe._90.megacells.util.Utils; @@ -29,7 +30,8 @@ protected void registerStatesAndModels() { for (var block : CommonModelSupplier.CRAFTING_UNITS) { craftingModel(block.first, block.second); } - craftingMonitorModel(); + craftingMonitor(); + patternProvider(); } private void builtInBlockModel(String name) { @@ -50,16 +52,17 @@ private void craftingModel(BlockDefinition block, String name) { itemModels().getBuilder("item/" + block.id().getPath()).parent(blockModel); } - private void craftingMonitorModel() { + private void craftingMonitor() { var unitTexture = Utils.makeId("block/crafting/unit"); var monitorTexture = Utils.makeId("block/crafting/monitor"); var blockModel = models().cube("block/crafting/monitor", unitTexture, unitTexture, monitorTexture, unitTexture, unitTexture, unitTexture).texture("particle", monitorTexture); builtInBlockModel("crafting/monitor_formed"); - getVariantBuilder(MEGABlocks.CRAFTING_MONITOR.block()).partialState() - .with(AbstractCraftingUnitBlock.FORMED, false).setModels(new ConfiguredModel(blockModel)).partialState() - .with(AbstractCraftingUnitBlock.FORMED, true) + getVariantBuilder(MEGABlocks.CRAFTING_MONITOR.block()) + .partialState().with(AbstractCraftingUnitBlock.FORMED, false) + .setModels(new ConfiguredModel(blockModel)) + .partialState().with(AbstractCraftingUnitBlock.FORMED, true) .setModels(new ConfiguredModel(models().getBuilder("block/crafting/monitor_formed"))); itemModels().getBuilder("item/mega_crafting_monitor").parent(blockModel); } @@ -80,4 +83,24 @@ private void energyCell() { item.override().predicate(AppEng.makeId("fill_level"), fillFactor).model(models.get(i)); } } + + private void patternProvider() { + var definition = MEGABlocks.MEGA_PATTERN_PROVIDER; + + var texture = Utils.makeId("block/mega_pattern_provider"); + var textureAlt = Utils.makeId("block/mega_pattern_provider_alternate"); + var textureArrow = Utils.makeId("block/mega_pattern_provider_alternate_arrow"); + var textureFront = Utils.makeId("block/mega_pattern_provider_alternate_front"); + + var modelNormal = cubeAll(definition.block()); + var modelOriented = models().cube("block/mega_pattern_provider_oriented", textureAlt, textureFront, + textureArrow, textureArrow, textureArrow, textureArrow).texture("particle", texture); + + getVariantBuilder(definition.block()) + .partialState().with(MEGAPatternProviderBlock.OMNIDIRECTIONAL, true) + .setModels(new ConfiguredModel(modelNormal)) + .partialState().with(MEGAPatternProviderBlock.OMNIDIRECTIONAL, false) + .setModels(new ConfiguredModel(modelOriented, 90, 0, false)); + simpleBlockItem(definition.block(), modelNormal); + } } diff --git a/forge/src/main/java/gripe/_90/megacells/datagen/forge/ItemModelProvider.java b/forge/src/main/java/gripe/_90/megacells/datagen/forge/ItemModelProvider.java index 5474ffbf..f037ad43 100644 --- a/forge/src/main/java/gripe/_90/megacells/datagen/forge/ItemModelProvider.java +++ b/forge/src/main/java/gripe/_90/megacells/datagen/forge/ItemModelProvider.java @@ -15,12 +15,14 @@ public class ItemModelProvider extends net.minecraftforge.client.model.generator static final ResourceLocation STORAGE_CELL_LED = AppEng.makeId("item/storage_cell_led"); static final ResourceLocation PORTABLE_CELL_LED = AppEng.makeId("item/portable_cell_led"); static final ResourceLocation DRIVE_CELL = AppEng.makeId("block/drive/drive_cell"); + static final ResourceLocation INTERFACE = AppEng.makeId("item/cable_interface"); public ItemModelProvider(DataGenerator gen, ExistingFileHelper efh) { super(gen, Utils.MODID, efh); efh.trackGenerated(STORAGE_CELL_LED, TEXTURE); efh.trackGenerated(PORTABLE_CELL_LED, TEXTURE); efh.trackGenerated(DRIVE_CELL, MODEL); + efh.trackGenerated(INTERFACE, MODEL); } @Override @@ -32,6 +34,11 @@ protected void registerModels() { driveCell("mega_fluid_cell"); driveCell("mega_mana_cell"); driveCell("bulk_item_cell"); + + withExistingParent("item/cable_mega_pattern_provider", INTERFACE) + .texture("sides", Utils.makeId("part/mega_monitor_sides")) + .texture("back", Utils.makeId("part/mega_monitor_back")) + .texture("front", Utils.makeId("part/mega_pattern_provider")); } private void driveCell(String texture) { diff --git a/forge/src/main/java/gripe/_90/megacells/datagen/forge/MEGADataGenerators.java b/forge/src/main/java/gripe/_90/megacells/datagen/forge/MEGADataGenerators.java index fa065642..862d3c88 100644 --- a/forge/src/main/java/gripe/_90/megacells/datagen/forge/MEGADataGenerators.java +++ b/forge/src/main/java/gripe/_90/megacells/datagen/forge/MEGADataGenerators.java @@ -28,6 +28,7 @@ public static void onGatherData(GatherDataEvent event) { generator.addProvider(true, new BlockStateProvider(generator, existingFileHelper)); generator.addProvider(true, new ItemModelProvider(generator, existingFileHelper)); + generator.addProvider(true, new PartModelProvider(generator, existingFileHelper)); for (var en : List.of("en_us", "en_gb", "en_au", "en_ca", "en_nz")) { generator.addProvider(true, new LocalisationProvider(generator, en)); diff --git a/forge/src/main/java/gripe/_90/megacells/datagen/forge/PartModelProvider.java b/forge/src/main/java/gripe/_90/megacells/datagen/forge/PartModelProvider.java new file mode 100644 index 00000000..b33078b4 --- /dev/null +++ b/forge/src/main/java/gripe/_90/megacells/datagen/forge/PartModelProvider.java @@ -0,0 +1,37 @@ +package gripe._90.megacells.datagen.forge; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.data.DataGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ModelProvider; +import net.minecraftforge.common.data.ExistingFileHelper; + +import appeng.core.AppEng; + +import gripe._90.megacells.util.Utils; + +public class PartModelProvider extends ModelProvider { + static final ResourceLocation PATTERN_PROVIDER = AppEng.makeId("part/pattern_provider_base"); + + public PartModelProvider(DataGenerator gen, ExistingFileHelper efh) { + super(gen, Utils.MODID, "part", ItemModelBuilder::new, efh); + efh.trackGenerated(PATTERN_PROVIDER, MODEL); + } + + @Override + public @NotNull String getName() { + return "Part Models: " + modid; + } + + @Override + protected void registerModels() { + withExistingParent("part/mega_pattern_provider", PATTERN_PROVIDER) + .texture("sides", Utils.makeId("part/mega_monitor_sides")) + .texture("sidesStatus", Utils.makeId("part/mega_monitor_sides_status")) + .texture("back", Utils.makeId("part/mega_monitor_back")) + .texture("front", Utils.makeId("part/mega_pattern_provider")) + .texture("particle", Utils.makeId("part/mega_monitor_back")); + } +} diff --git a/forge/src/main/java/gripe/_90/megacells/datagen/forge/TagProvider.java b/forge/src/main/java/gripe/_90/megacells/datagen/forge/TagProvider.java index e3113c3f..0439f087 100644 --- a/forge/src/main/java/gripe/_90/megacells/datagen/forge/TagProvider.java +++ b/forge/src/main/java/gripe/_90/megacells/datagen/forge/TagProvider.java @@ -8,7 +8,11 @@ import net.minecraft.tags.BlockTags; import net.minecraftforge.common.data.ExistingFileHelper; +import appeng.api.features.P2PTunnelAttunement; + import gripe._90.megacells.definition.MEGABlocks; +import gripe._90.megacells.definition.MEGAParts; +import gripe._90.megacells.definition.MEGATags; import gripe._90.megacells.util.Utils; public class TagProvider { @@ -19,7 +23,11 @@ public Items(DataGenerator gen, BlockTagsProvider block, ExistingFileHelper efh) @Override protected void addTags() { - + tag(P2PTunnelAttunement.getAttunementTag(P2PTunnelAttunement.ENERGY_TUNNEL)) + .add(MEGABlocks.MEGA_ENERGY_CELL.asItem()); + tag(MEGATags.MEGA_PATTERN_PROVIDER) + .add(MEGABlocks.MEGA_PATTERN_PROVIDER.asItem()) + .add(MEGAParts.MEGA_PATTERN_PROVIDER.asItem()); } } diff --git a/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java b/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java index 2e71b885..ea2b60e6 100644 --- a/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java +++ b/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java @@ -14,20 +14,25 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegisterEvent; +import appeng.core.AppEng; + import gripe._90.megacells.datagen.forge.MEGADataGenerators; import gripe._90.megacells.definition.MEGABlockEntities; import gripe._90.megacells.definition.MEGABlocks; import gripe._90.megacells.definition.MEGAItems; +import gripe._90.megacells.definition.MEGAParts; import gripe._90.megacells.init.InitStorageCells; import gripe._90.megacells.init.InitUpgrades; import gripe._90.megacells.init.forge.client.InitAutoRotatingModel; import gripe._90.megacells.init.forge.client.InitBlockEntityRenderers; import gripe._90.megacells.init.forge.client.InitBuiltInModels; import gripe._90.megacells.init.forge.client.InitItemColors; +import gripe._90.megacells.init.forge.client.InitScreens; import gripe._90.megacells.integration.appbot.AppBotItems; import gripe._90.megacells.integration.appmek.AppMekIntegration; import gripe._90.megacells.integration.appmek.AppMekItems; import gripe._90.megacells.item.cell.CompressionHandler; +import gripe._90.megacells.menu.MEGAPatternProviderMenu; import gripe._90.megacells.util.Utils; @Mod(Utils.MODID) @@ -37,6 +42,7 @@ public MEGACellsForge() { MEGABlocks.init(); MEGAItems.init(); + MEGAParts.init(); MEGABlockEntities.init(); if (Utils.PLATFORM.isModLoaded("appmek")) { @@ -62,6 +68,11 @@ public MEGACellsForge() { if (event.getRegistryKey().equals(Registry.BLOCK_ENTITY_TYPE_REGISTRY)) { MEGABlockEntities.getBlockEntityTypes().forEach(ForgeRegistries.BLOCK_ENTITY_TYPES::register); } + + if (event.getRegistryKey().equals(Registry.MENU_REGISTRY)) { + ForgeRegistries.MENU_TYPES.register(AppEng.makeId("mega_pattern_provider"), + MEGAPatternProviderMenu.TYPE); + } }); bus.addListener(MEGADataGenerators::onGatherData); @@ -85,5 +96,6 @@ public MEGACellsForge() { DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> InitBlockEntityRenderers::init); DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> InitBuiltInModels::init); DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> InitItemColors::init); + DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> InitScreens::init); } } diff --git a/forge/src/main/java/gripe/_90/megacells/init/forge/client/InitScreens.java b/forge/src/main/java/gripe/_90/megacells/init/forge/client/InitScreens.java new file mode 100644 index 00000000..518885e3 --- /dev/null +++ b/forge/src/main/java/gripe/_90/megacells/init/forge/client/InitScreens.java @@ -0,0 +1,22 @@ +package gripe._90.megacells.init.forge.client; + +import static appeng.init.client.InitScreens.register; + +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import appeng.client.gui.implementations.PatternProviderScreen; + +import gripe._90.megacells.menu.MEGAPatternProviderMenu; + +public class InitScreens { + public static void init() { + var bus = FMLJavaModLoadingContext.get().getModEventBus(); + bus.addListener(InitScreens::initScreens); + } + + private static void initScreens(FMLClientSetupEvent event) { + register(MEGAPatternProviderMenu.TYPE, PatternProviderScreen::new, + "/screens/megacells/mega_pattern_provider.json"); + } +} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 9bde8edf..9cf7628b 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -17,11 +17,11 @@ ME Greater Accumulation Cells - For when kilobytes just won't do. ''' [[dependencies.megacells]] - modId = "ae2" - mandatory = true - versionRange = "[12.9.1,13.0.0)" - ordering = "AFTER" - side = "BOTH" + modId="ae2" + mandatory=true + versionRange = "[12.9.2,13.0.0)" + ordering="AFTER" + side="BOTH" [[dependencies.megacells]] modId = "appmek" diff --git a/forge/src/main/resources/logo.png b/forge/src/main/resources/logo.png index c5c6d38c9a21c931f0f2bce151a966603bc33fd8..66e29dfc8edf0b846354879777d0ec54db49d3aa 100644 GIT binary patch literal 641 zcmeAS@N?(olHy`uVBq!ia0y~yV7>rkUtnPdlCl|7+<+8+fKP}kkaloz@c9wd?EK{a z|Nm9THg9EMVAAz;aSW-r_4e*X-`55b4T0ht9l{b=*I(GUxhebwSL{OlEn0yxyS>)5 z{FozNwUA5PF6U+VK~6@XVIZ)rywYxm*)NvGuft>OGfMvcet%ov{&lTDR7Q&%2u1z= zrfbpn``C5qH5t+7PRb@QwB^D+Ru~&B$lZH^<81wd@4NW5_SyPPu5WMcSJl3C4JZmm zGZt5#Jzkg?wr!Ch%|E4@%q3WO}b%h<|2`MhP{|F6rhpPzeC_VE4B$Ag~g#&QpF|gY(P_it^gU#28nBisxJ)ZPn(=( S{Fm|wB;x7n=d#Wzp$PyCK^;B- literal 2053 zcmeAS@N?(olHy`uVBq!ia0y~yV7>rkU*KQ^lJDI*OBom#TQi-V13aCb6$*;-(=u~X z85lGs)=sqbIP4&EG(OndRZFQ%;N^scR*?dtf-zgTTvrHWwT8+1=>2U{3!^fupX$!pc%}mq+J+Z*JWr8;f_xcUSlCE^i3XH$MAHirM6@S#al$ z87J3u9Smm?aI{Z*FnMO`8P6c0d5>Sq+3mY`v|`%#o%ZhQXKj{vAl#WgGx63D=_A3j zw;imUZ*it;lUI$OP1YsWPWhedOn&wjA53jbZ#!F(HP6CFN6aeXWkQ&V=_AiaD^|Un zqMtHrP0_taYo@MVQ|kZkP=H^2-ov{|T?B zpIAC!HH%vxYsdn}vcC`NKkSaywl}=z!*#UrK=YMn1mAiA<^MtM}~Qy?J~6`7OVGGdATGt>y0VT?dR8wj^(N7a$D;Kb?2i z11Zh|kH}&M20djEW~^9hUj`IpFY)wsWq-yhBg`Yn*6h9?C?r|p8d2h$pPQSSSHj?2 zl$uzQnxasiS(2gP?&%v4-pD7;z`%OP)5S5Q;?~={hJLb!B5fB9t5~}e43#gYvA${T z+Pi@%YRPs9v5Dt0nV$YQcyyEP_c>;dQVpD^`0M@KlpB2)XiI~0c^{BsU@-v_92r1D z0F={r@+2&_V~BArmIa0{z+`?ONUwZGC$6dzJZfiSbB~ z*M8<$FV5Q9wO7CU-BJB^pAOHRSZ|l=9_Y&vTvR8hU zeRH*Z*^YIToI#<=P*-2Kf*0LFkqFk1Gd)q4sU`lx~gP5#MbQ$&F aw0(cejA=8xU3LQvXYh3Ob6Mw<&;$Sts$?So diff --git a/gradle.properties b/gradle.properties index d56480c2..5981a315 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ mod_id=megacells maven_group=gripe.90 fabric_loader_version=0.14.9 -ae2_version=12.9.1 +ae2_version=12.9.2 cloth_version=8.0.75 botania_version=436