Skip to content

Commit

Permalink
Add MEGA Pattern Provider (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
62832 authored Jan 11, 2023
1 parent ed23256 commit 023d215
Show file tree
Hide file tree
Showing 39 changed files with 1,171 additions and 62 deletions.
Original file line number Diff line number Diff line change
@@ -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<MEGAPatternProviderBlockEntity> {
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<Block, BlockState> 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<Component> tooltip, TooltipFlag flag) {
tooltip.add(Tooltips.of("Supports processing patterns only."));
}
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -44,50 +45,31 @@ public static void buildRecipes(Consumer<FinishedRecipe> 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")
Expand Down Expand Up @@ -147,6 +129,15 @@ public static void buildRecipes(Consumer<FinishedRecipe> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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" })
Expand All @@ -41,6 +42,8 @@ public static Map<ResourceLocation, BlockEntityType<?>> getBlockEntityTypes() {
public static final BlockEntityType<CraftingBlockEntity> MEGA_CRAFTING_UNIT = create("mega_crafting_unit", CraftingBlockEntity.class, CraftingBlockEntity::new, MEGABlocks.MEGA_CRAFTING_UNIT, MEGABlocks.CRAFTING_ACCELERATOR);
public static final BlockEntityType<CraftingBlockEntity> 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<CraftingMonitorBlockEntity> MEGA_CRAFTING_MONITOR = create("mega_crafting_monitor", CraftingMonitorBlockEntity.class, CraftingMonitorBlockEntity::new, MEGABlocks.CRAFTING_MONITOR);

public static final BlockEntityType<MEGAPatternProviderBlockEntity> MEGA_PATTERN_PROVIDER = create("mega_pattern_provider", MEGAPatternProviderBlockEntity.class, MEGAPatternProviderBlockEntity::new, MEGABlocks.MEGA_PATTERN_PROVIDER);
// spotless:on

@SafeVarargs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {
Expand Down Expand Up @@ -53,6 +56,8 @@ public static List<BlockDefinition<?>> getBlocks() {
public static final BlockDefinition<CraftingUnitBlock> 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<CraftingUnitBlock> 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<CraftingMonitorBlock> CRAFTING_MONITOR = craftingBlock("MEGA Crafting Monitor", "mega_crafting_monitor", () -> new CraftingMonitorBlock(props, MEGACraftingUnitType.MONITOR), () -> AEParts.STORAGE_MONITOR);

public static final BlockDefinition<MEGAPatternProviderBlock> MEGA_PATTERN_PROVIDER = block("MEGA Pattern Provider", "mega_pattern_provider", () -> new MEGAPatternProviderBlock(props), MEGAPatternProviderBlock.Item::new);
// spotless:on

private static <T extends Block> BlockDefinition<T> craftingBlock(String englishName, String id,
Expand All @@ -76,12 +81,13 @@ private static <T extends Block> BlockDefinition<T> 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<T> definition = new BlockDefinition<>(englishName, Utils.makeId(id), block, item);

BLOCKS.add(definition);
return definition;
}
Expand Down
36 changes: 36 additions & 0 deletions common/src/main/java/gripe/_90/megacells/definition/MEGAParts.java
Original file line number Diff line number Diff line change
@@ -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<PartItem<MEGAPatternProviderPart>> MEGA_PATTERN_PROVIDER = customPart("MEGA Pattern Provider", "cable_mega_pattern_provider", MEGAPatternProviderPart.class, MEGAPatternProviderPart.Item::new);
// spotless:on

private static <T extends IPart> ItemDefinition<PartItem<T>> part(String englishName, String id, Class<T> partClass,
Function<IPartItem<T>, T> factory) {
return customPart(englishName, id, partClass, props -> new PartItem<>(props, partClass, factory));
}

private static <T extends IPart> ItemDefinition<PartItem<T>> customPart(String englishName, String id,
Class<T> partClass, Function<Item.Properties, PartItem<T>> itemFactory) {
PartModels.registerModels(PartModelsHelper.createModels(partClass));
return MEGAItems.item(englishName, id, itemFactory);
}
}
14 changes: 14 additions & 0 deletions common/src/main/java/gripe/_90/megacells/definition/MEGATags.java
Original file line number Diff line number Diff line change
@@ -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<Item> MEGA_PATTERN_PROVIDER = itemTag("megacells:mega_pattern_provider");

private static TagKey<Item> itemTag(String name) {
return TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(name));
}
}
Original file line number Diff line number Diff line change
@@ -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<MEGAPatternProviderMenu> 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));
}
}
Loading

0 comments on commit 023d215

Please sign in to comment.