Skip to content

Commit ec8a8e5

Browse files
author
NeofastFTL
committed
e
1 parent 16eb6d5 commit ec8a8e5

10 files changed

Lines changed: 77 additions & 99 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ loader_version_range=[4,)
3131
# Must match the String constant located in the main mod class annotated with @Mod.
3232
mod_id=infinitypattern
3333
# The human-readable display name for the mod.
34-
mod_name=Infinity Pattern
34+
mod_name=Applied Infinity Pattern
3535
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
3636
mod_license=All Rights Reserved
3737
# The mod version. See https://semver.org/

src/main/java/com/neofastftl/infinitypattern/InfinityPattern.java

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package com.neofastftl.infinitypattern;
22

3-
import appeng.api.ids.AEItemIds;
4-
import appeng.core.AppEng;
5-
import appeng.core.definitions.ItemDefinition;
6-
import appeng.items.materials.MaterialItem;
7-
import com.neofastftl.infinitypattern.item.ItemInfinityPattern;
83
import org.slf4j.Logger;
94

105
import com.mojang.logging.LogUtils;
@@ -13,15 +8,10 @@
138
import net.minecraft.core.registries.BuiltInRegistries;
149
import net.minecraft.core.registries.Registries;
1510
import net.minecraft.network.chat.Component;
16-
import net.minecraft.world.food.FoodProperties;
17-
import net.minecraft.world.item.BlockItem;
1811
import net.minecraft.world.item.CreativeModeTab;
1912
import net.minecraft.world.item.CreativeModeTabs;
2013
import net.minecraft.world.item.Item;
21-
import net.minecraft.world.level.block.Block;
2214
import net.minecraft.world.level.block.Blocks;
23-
import net.minecraft.world.level.block.state.BlockBehaviour;
24-
import net.minecraft.world.level.material.MapColor;
2515
import net.neoforged.api.distmarker.Dist;
2616
import net.neoforged.bus.api.IEventBus;
2717
import net.neoforged.bus.api.SubscribeEvent;
@@ -32,16 +22,11 @@
3222
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
3323
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
3424
import net.neoforged.neoforge.common.NeoForge;
35-
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent;
3625
import net.neoforged.neoforge.event.server.ServerStartingEvent;
37-
import net.neoforged.neoforge.registries.DeferredBlock;
3826
import net.neoforged.neoforge.registries.DeferredHolder;
3927
import net.neoforged.neoforge.registries.DeferredItem;
4028
import net.neoforged.neoforge.registries.DeferredRegister;
4129

42-
import java.util.ArrayList;
43-
import java.util.List;
44-
4530
import static net.minecraft.world.item.Items.registerItem;
4631

4732
// The value here should match an entry in the META-INF/neoforge.mods.toml file
@@ -58,17 +43,16 @@ public class InfinityPattern
5843
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);
5944

6045
// Creates a new food item with the id "examplemod:example_id", nutrition 1 and saturation 2
61-
62-
public static final DeferredItem<Item> ITEM_INFINITYPATTERN = ITEMS.register("item_infinitypattern",
63-
() -> new ItemInfinityPattern(new Item.Properties()));
46+
public static final DeferredItem<Item> ITEM_INFINITE_EMPTY_PATTERN = ITEMS.register("infinite_empty_pattern",
47+
() -> new Item(new Item.Properties().stacksTo(1)));
6448

6549
// Creates a creative tab with the id "examplemod:example_tab" for the example item, that is placed after the combat tab
6650
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> INFINITY_PATTERN = CREATIVE_MODE_TABS.register("infinitypattern", () -> CreativeModeTab.builder()
6751
.title(Component.translatable("itemGroup.infinitypattern")) //The language key for the title of your CreativeModeTab
6852
.withTabsBefore(CreativeModeTabs.COMBAT)
69-
.icon(() -> ITEM_INFINITYPATTERN.get().getDefaultInstance())
53+
.icon(() -> ITEM_INFINITE_EMPTY_PATTERN.get().getDefaultInstance())
7054
.displayItems((parameters, output) -> {
71-
output.accept(ITEM_INFINITYPATTERN.get()); // Add the example item to the tab. For your own tabs, this method is preferred over the event
55+
output.accept(ITEM_INFINITE_EMPTY_PATTERN.get()); // Add the example item to the tab. For your own tabs, this method is preferred over the event
7256
}).build());
7357

7458
// The constructor for the mod class is the first code that is run when your mod is loaded.

src/main/java/com/neofastftl/infinitypattern/item/ItemInfinityPattern.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/main/java/com/neofastftl/infinitypattern/mixins/IFPATMixinPlugin.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ public class IFPATMixinPlugin implements IMixinConfigPlugin {
1818

1919
private static final Object2ObjectMap<String, String> MOD_MIXINS = new Object2ObjectOpenHashMap<>(
2020
new String[] {
21-
"com.neofastftl.infinitypattern.mixins.MixinPatternEncodingTermMenu"
21+
"com.neofastftl.infinitypattern.mixins.MixinPatternEncodingTermMenu",
22+
"com.neofastftl.infinitypattern.mixins.MixinRestrictedInputSlot"
2223
},
23-
new String[] {"infinitypattern", "infinitypattern", "infinitypattern", "infinitypattern", "infinitypattern"},
24+
new String[] {"infinitypattern", "infinitypattern"},
2425
Object2ObjectOpenHashMap.DEFAULT_LOAD_FACTOR);
2526

2627
@Override

src/main/java/com/neofastftl/infinitypattern/mixins/MixinPatternEncodingTermMenu.java

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,67 @@
11
package com.neofastftl.infinitypattern.mixins;
22

3-
import appeng.core.definitions.AEItems;
43
import appeng.parts.encoding.PatternEncodingLogic;
5-
import com.llamalad7.mixinextras.sugar.Local;
6-
74
import com.neofastftl.infinitypattern.InfinityPattern;
85
import org.spongepowered.asm.mixin.Final;
96
import org.spongepowered.asm.mixin.Mixin;
107
import org.spongepowered.asm.mixin.Shadow;
11-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
128

139
import net.minecraft.world.entity.player.Inventory;
1410
import net.minecraft.world.inventory.MenuType;
15-
import net.minecraft.world.item.ItemStack;
1611

17-
import appeng.api.crafting.PatternDetailsHelper;
18-
import appeng.api.stacks.GenericStack;
1912
import appeng.api.storage.ITerminalHost;
2013
import appeng.menu.me.common.MEStorageMenu;
2114
import appeng.menu.me.items.PatternEncodingTermMenu;
2215
import appeng.menu.slot.RestrictedInputSlot;
16+
import org.spongepowered.asm.mixin.injection.At;
17+
import org.spongepowered.asm.mixin.injection.Inject;
2318

24-
@Mixin(PatternEncodingTermMenu.class)
25-
public class MixinPatternEncodingTermMenu extends MEStorageMenu {
19+
import net.minecraft.world.item.ItemStack;
20+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
21+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
22+
23+
@Mixin(value = PatternEncodingTermMenu.class, remap = false)
24+
public abstract class MixinPatternEncodingTermMenu extends MEStorageMenu {
2625

2726
@Final
28-
@Shadow(remap = false)
27+
@Shadow
2928
private RestrictedInputSlot encodedPatternSlot;
3029

31-
private void onEncodePattern(
32-
CallbackInfoReturnable<ItemStack> cir,
33-
@Local(ordinal = 0) GenericStack[] in,
34-
@Local(ordinal = 1) GenericStack[] out) {
30+
@Shadow
31+
private RestrictedInputSlot blankPatternSlot;
3532

36-
var encodeOutput = this.encodedPatternSlot.getItem();
33+
private boolean wasInfinitePattern = false;
3734

38-
// first check the output slots, should either be null, or a pattern (encoded or otherwise)
39-
if (!encodeOutput.isEmpty()
40-
&& !PatternDetailsHelper.isEncodedPattern(encodeOutput)
41-
&& !InfinityPattern.ITEM_INFINITYPATTERN.is(encodeOutput.getItemHolder().getDelegate())) {
42-
clearPattern();
43-
}
35+
@Inject(method = "encode", at = @At("HEAD"))
36+
private void onEncodePatternHead(CallbackInfo ci) {
37+
var blank = this.blankPatternSlot.getItem();
38+
if (blank.is(InfinityPattern.ITEM_INFINITE_EMPTY_PATTERN.get())) {
39+
wasInfinitePattern = true;
40+
} else {
41+
wasInfinitePattern = false;
42+
}
4443
}
45-
private void clearPattern() {
46-
var encodedPattern = this.encodedPatternSlot.getItem();
47-
if (PatternDetailsHelper.isEncodedPattern(encodedPattern)) {
48-
this.encodedPatternSlot.set(
49-
InfinityPattern.ITEM_INFINITYPATTERN.toStack(encodedPattern.getCount()));
44+
45+
@Inject(method = "isPattern", at = @At("HEAD"), cancellable = true)
46+
private void onIsPattern(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
47+
if (stack.is(InfinityPattern.ITEM_INFINITE_EMPTY_PATTERN.get())) {
48+
cir.setReturnValue(true);
5049
}
5150
}
51+
52+
@Inject(method = "encode", at = @At("RETURN"))
53+
private void onEncodePatternReturn(CallbackInfo ci) {
54+
if (wasInfinitePattern) {
55+
var blank = this.blankPatternSlot.getItem();
56+
if (blank.isEmpty()) {
57+
this.blankPatternSlot.set(InfinityPattern.ITEM_INFINITE_EMPTY_PATTERN.get().getDefaultInstance());
58+
} else if (blank.is(InfinityPattern.ITEM_INFINITE_EMPTY_PATTERN.get())) {
59+
blank.setCount(1);
60+
}
61+
wasInfinitePattern = false;
62+
}
63+
}
64+
5265
public MixinPatternEncodingTermMenu(MenuType<?> menuType, int id, Inventory ip, ITerminalHost host, PatternEncodingLogic encodingLogic) {
5366
super(menuType, id, ip, host);
5467
}
Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,23 @@
11
package com.neofastftl.infinitypattern.mixins;
22

3-
import appeng.api.crafting.PatternDetailsHelper;
4-
import appeng.api.features.GridLinkables;
5-
import appeng.api.implementations.items.ISpatialStorageCell;
6-
import appeng.api.implementations.items.IStorageComponent;
7-
import appeng.api.inventories.InternalInventory;
8-
import appeng.api.stacks.GenericStack;
9-
import appeng.api.storage.ITerminalHost;
10-
import appeng.api.storage.StorageCells;
11-
import appeng.api.storage.cells.ICellWorkbenchItem;
12-
import appeng.api.upgrades.Upgrades;
13-
import appeng.blockentity.crafting.IMolecularAssemblerSupportedPattern;
14-
import appeng.blockentity.misc.InscriberRecipes;
15-
import appeng.blockentity.misc.VibrationChamberBlockEntity;
16-
import appeng.blockentity.qnb.QuantumBridgeBlockEntity;
17-
import appeng.core.definitions.AEItems;
18-
import appeng.menu.me.common.MEStorageMenu;
19-
import appeng.menu.me.items.PatternEncodingTermMenu;
203
import appeng.menu.slot.AppEngSlot;
214
import appeng.menu.slot.RestrictedInputSlot;
22-
import appeng.parts.encoding.PatternEncodingLogic;
23-
import appeng.util.Platform;
24-
import com.llamalad7.mixinextras.sugar.Local;
255
import com.neofastftl.infinitypattern.InfinityPattern;
26-
import net.minecraft.world.entity.player.Inventory;
27-
import net.minecraft.world.inventory.MenuType;
286
import net.minecraft.world.item.ItemStack;
29-
import net.minecraft.world.item.Items;
30-
import org.spongepowered.asm.mixin.Final;
317
import org.spongepowered.asm.mixin.Mixin;
32-
import org.spongepowered.asm.mixin.Shadow;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
3310
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
3411

35-
import static appeng.api.ids.AEItemIds.BLANK_PATTERN;
12+
@Mixin(value = RestrictedInputSlot.class, remap = false)
13+
public abstract class MixinRestrictedInputSlot {
3614

37-
@Mixin(RestrictedInputSlot.class)
38-
public class MixinRestrictedInputSlot extends AppEngSlot {
39-
40-
@Final
41-
@Shadow(remap = false)
42-
private RestrictedInputSlot encodedPatternSlot;
43-
44-
private void mayPlace(
45-
CallbackInfoReturnable<ItemStack> cir,
46-
@Local(ordinal = 0) GenericStack[] in,
47-
@Local(ordinal = 1) GenericStack[] out) {
15+
@Inject(method = "mayPlace", at = @At("HEAD"), cancellable = true)
16+
private void mayPlace(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
17+
if (stack != null && !stack.isEmpty()) {
18+
if (stack.is(InfinityPattern.ITEM_INFINITE_EMPTY_PATTERN.get())) {
19+
cir.setReturnValue(true);
20+
}
21+
}
4822
}
4923
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
navigation:
3+
title: Infinity Pattern Introduction
4+
position: 70
5+
---
6+
7+
# Infinity Pattern!
8+
9+
The Infinite Empty Pattern is a special item that can be used in the Pattern Encoding Terminal just like a normal Blank Pattern.
10+
However, it is never consumed during the encoding process,
11+
allowing for unlimited pattern creation with a single item!
12+
13+
Found an issue? Missing a feature?
14+
Please report it here:
15+
[Infinity Pattern GitHub](https://github.com/pedroksl/AdvancedAE)
485 Bytes
Loading

src/main/resources/mixins.ifpat.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"refmap": "mixins.infinitypattern.refmap.json",
77
"compatibilityLevel": "JAVA_21",
88
"mixins": [
9-
"MixinPatternEncodingTermMenu"
9+
"MixinPatternEncodingTermMenu",
10+
"MixinRestrictedInputSlot"
1011
]
1112
}

src/main/templates/META-INF/neoforge.mods.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ authors="${mod_authors}" #optional
4747
description='''${mod_description}'''
4848

4949
# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded.
50-
#[[mixins]]
51-
#config="${mod_id}.mixins.json"
50+
[[mixins]]
51+
config="mixins.ifpat.json"
5252

5353
# The [[accessTransformers]] block allows you to declare where your AT file is.
5454
# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg

0 commit comments

Comments
 (0)