Skip to content

Commit 052d81c

Browse files
committed
add back create basin integration & add setFilter method
1 parent b3c6af3 commit 052d81c

7 files changed

Lines changed: 450 additions & 4 deletions

File tree

src/main/java/de/srendi/advancedperipherals/common/addons/APAddon.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public enum APAddon {
99
AE2("ae2"),
1010
AE2THINGS("ae2things"),
1111
APP_MEKANISTICS("appmek"),
12+
CREATE("create"),
1213
CURIOS("curios"),
1314
DIMSTORAGE("dimstorage"),
1415
MEKANISM("mekanism"),
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package de.srendi.advancedperipherals.common.addons.create;
2+
3+
import com.simibubi.create.content.logistics.filter.FilterItemStack;
4+
import com.simibubi.create.content.processing.basin.BasinBlockEntity;
5+
import dan200.computercraft.api.lua.LuaException;
6+
import dan200.computercraft.api.lua.LuaFunction;
7+
import dan200.computercraft.api.lua.MethodResult;
8+
import dan200.computercraft.api.lua.ObjectLuaTable;
9+
import de.srendi.advancedperipherals.common.util.LuaConverter;
10+
import de.srendi.advancedperipherals.common.util.Pair;
11+
import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral;
12+
import net.minecraft.world.item.ItemStack;
13+
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
import java.util.Map;
19+
import java.util.Optional;
20+
21+
public class BasinIntegration implements APGenericPeripheral {
22+
@NotNull
23+
@Override
24+
public String getPeripheralType() {
25+
return "basin";
26+
}
27+
28+
@LuaFunction(mainThread = true)
29+
public final List<Object> inputTanks(BasinBlockEntity blockEntity) {
30+
IFluidHandler handler = blockEntity.getTanks().getFirst().getCapability();
31+
int size = handler.getTanks();
32+
List<Object> tanks = new ArrayList<>(size);
33+
for (int i = 0; i < size; i++) {
34+
tanks.add(LuaConverter.fluidStackToLua(handler.getFluidInTank(i)));
35+
}
36+
return tanks;
37+
}
38+
39+
@LuaFunction(mainThread = true)
40+
public final List<Object> outputTanks(BasinBlockEntity blockEntity) {
41+
IFluidHandler handler = blockEntity.getTanks().getSecond().getCapability();
42+
int size = handler.getTanks();
43+
List<Object> tanks = new ArrayList<>(size);
44+
for (int i = 0; i < size; i++) {
45+
tanks.add(LuaConverter.fluidStackToLua(handler.getFluidInTank(i)));
46+
}
47+
return tanks;
48+
}
49+
50+
@LuaFunction(mainThread = true)
51+
public final Map<String, ?> getFilter(BasinBlockEntity blockEntity) {
52+
return CreateFilter.filterToLua(FilterItemStack.of(blockEntity.getFilter().getFilter()), blockEntity.getLevel().registryAccess());
53+
}
54+
55+
@LuaFunction(mainThread = true)
56+
public final MethodResult setFilter(BasinBlockEntity blockEntity, Optional<Map<?, ?>> filter) throws LuaException {
57+
ItemStack filterStack = blockEntity.getFilter().getFilter();
58+
Pair<ItemStack, String> result = CreateFilter.updateFilter(filterStack, filter.map(ObjectLuaTable::new).orElse(null), blockEntity.getLevel().registryAccess());
59+
if (result.rightPresent()) {
60+
return MethodResult.of(false, result.right());
61+
}
62+
if (!blockEntity.getFilter().setFilter(result.left())) {
63+
return MethodResult.of(false, "invalid filter");
64+
}
65+
return MethodResult.of(true);
66+
}
67+
}
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
package de.srendi.advancedperipherals.common.addons.create;
2+
3+
import com.mojang.serialization.DataResult;
4+
import com.simibubi.create.AllDataComponents;
5+
import com.simibubi.create.AllItems;
6+
import com.simibubi.create.content.logistics.box.PackageItem;
7+
import com.simibubi.create.content.logistics.filter.AttributeFilterItem;
8+
import com.simibubi.create.content.logistics.filter.AttributeFilterWhitelistMode;
9+
import com.simibubi.create.content.logistics.filter.FilterItem;
10+
import com.simibubi.create.content.logistics.filter.FilterItemStack;
11+
import com.simibubi.create.content.logistics.filter.ListFilterItem;
12+
import com.simibubi.create.content.logistics.filter.PackageFilterItem;
13+
import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute;
14+
import com.simibubi.create.foundation.item.ItemHelper;
15+
import dan200.computercraft.api.lua.LuaException;
16+
import dan200.computercraft.api.lua.LuaTable;
17+
import dan200.computercraft.api.lua.ObjectLuaTable;
18+
import de.srendi.advancedperipherals.common.util.DataComponentUtil;
19+
import de.srendi.advancedperipherals.common.util.EmptyLuaTable;
20+
import de.srendi.advancedperipherals.common.util.LuaConverter;
21+
import de.srendi.advancedperipherals.common.util.LuaOps;
22+
import de.srendi.advancedperipherals.common.util.Pair;
23+
import net.minecraft.core.RegistryAccess;
24+
import net.minecraft.core.registries.BuiltInRegistries;
25+
import net.minecraft.resources.RegistryOps;
26+
import net.minecraft.resources.ResourceLocation;
27+
import net.minecraft.world.item.Item;
28+
import net.minecraft.world.item.ItemStack;
29+
import net.neoforged.neoforge.items.ItemStackHandler;
30+
import org.jetbrains.annotations.Nullable;
31+
32+
import java.util.ArrayList;
33+
import java.util.HashMap;
34+
import java.util.List;
35+
import java.util.Map;
36+
37+
public final class CreateFilter {
38+
private CreateFilter() {}
39+
40+
public static final Map<String, ?> filterToLua(FilterItemStack stack, RegistryAccess registryAccess) {
41+
if (stack.isEmpty()) {
42+
return null;
43+
}
44+
if (stack instanceof FilterItemStack.ListFilterItemStack listFilter) {
45+
return Map.of(
46+
"type", "list",
47+
"blacklist", listFilter.isBlacklist,
48+
"ignoreNBT", !listFilter.shouldRespectNBT,
49+
"filters",
50+
listFilter.containedItems.stream().map((s) -> filterToLua(s, registryAccess)).toList()
51+
);
52+
}
53+
if (stack instanceof FilterItemStack.AttributeFilterItemStack attributeFilter) {
54+
return Map.of(
55+
"type", "attribute",
56+
"mode", attributeFilter.whitelistMode.getSerializedName(),
57+
"attributes",
58+
attributeFilter.attributeTests.stream()
59+
.map((pair) -> {
60+
Map<Object, Object> data = new HashMap<>((Map<?, ?>) ItemAttribute.CODEC
61+
.encodeStart(RegistryOps.create(LuaOps.INSTANCE, registryAccess), pair.getFirst())
62+
.getOrThrow());
63+
data.put("inverted", pair.getSecond());
64+
return data;
65+
})
66+
.toList()
67+
);
68+
}
69+
if (stack instanceof FilterItemStack.PackageFilterItemStack packageFilter) {
70+
return Map.of(
71+
"type", "package",
72+
"address", packageFilter.filterString
73+
);
74+
}
75+
if (stack.getClass() == FilterItemStack.class) {
76+
return Map.of(
77+
"type", "item",
78+
"item", LuaConverter.itemStackToLua(stack.item())
79+
);
80+
}
81+
return Map.of(
82+
"type", "unknown",
83+
"item", LuaConverter.itemStackToLua(stack.item())
84+
);
85+
}
86+
87+
public static final Pair<ItemStack, String> updateFilter(@Nullable ItemStack stack, LuaTable<?, ?> data, RegistryAccess registryAccess) throws LuaException {
88+
if (data == null) {
89+
return Pair.onlyLeft(ItemStack.EMPTY);
90+
}
91+
String filterType = data.getString("type");
92+
switch (filterType) {
93+
case "list" -> {
94+
if (stack == null) {
95+
stack = new ItemStack(AllItems.FILTER.get());
96+
}
97+
if (!(stack.getItem() instanceof ListFilterItem listFilterItem)) {
98+
return Pair.onlyRight("existing filter item is not list filter");
99+
}
100+
stack.set(AllDataComponents.FILTER_ITEMS_BLACKLIST, data.optBoolean("blacklist").orElse(false));
101+
stack.set(AllDataComponents.FILTER_ITEMS_RESPECT_NBT, !data.optBoolean("ignoreNBT").orElse(false));
102+
103+
LuaTable<?, ?> filters = EmptyLuaTable.orEmpty(data.optTable("filters"));
104+
ItemStackHandler handler = listFilterItem.getFilterItemHandler(stack);
105+
for (int slot = 0; slot < handler.getSlots(); slot++) {
106+
Pair<ItemStack, String> res = updateFilter(null, filters.optTable(slot + 1).map(ObjectLuaTable::new).orElse(null), registryAccess);
107+
if (res.rightPresent()) {
108+
return res;
109+
}
110+
handler.setStackInSlot(slot, res.left());
111+
}
112+
stack.set(AllDataComponents.FILTER_ITEMS, ItemHelper.containerContentsFromHandler(handler));
113+
return Pair.onlyLeft(stack);
114+
}
115+
case "attribute" -> {
116+
if (stack == null) {
117+
stack = new ItemStack(AllItems.ATTRIBUTE_FILTER.get());
118+
}
119+
if (!(stack.getItem() instanceof AttributeFilterItem)) {
120+
return Pair.onlyRight("existing filter item is not attribute filter");
121+
}
122+
123+
String modeOpt = data.optString("mode").orElse(null);
124+
if (modeOpt != null) {
125+
AttributeFilterWhitelistMode mode = null;
126+
for (AttributeFilterWhitelistMode m : AttributeFilterWhitelistMode.values()) {
127+
if (m.getSerializedName().equals(modeOpt)) {
128+
mode = m;
129+
break;
130+
}
131+
}
132+
if (mode == null) {
133+
return Pair.onlyRight("unexpected value for attributes filter mode: " + modeOpt);
134+
}
135+
stack.set(AllDataComponents.ATTRIBUTE_FILTER_WHITELIST_MODE, mode);
136+
} else {
137+
stack.remove(AllDataComponents.ATTRIBUTE_FILTER_WHITELIST_MODE);
138+
}
139+
140+
LuaTable<?, ?> attributes = EmptyLuaTable.orEmpty(data.optTable("attributes"));
141+
List<ItemAttribute.ItemAttributeEntry> attrs = new ArrayList<>(attributes.size());
142+
for (int i = 1; i <= attributes.size(); i++) {
143+
LuaTable<?, ?> attribute = new ObjectLuaTable(attributes.getTable(i));
144+
boolean inverted = attribute.optBoolean("inverted").orElse(false);
145+
DataResult<ItemAttribute> attr = ItemAttribute.CODEC.parse(RegistryOps.create(LuaOps.INSTANCE, registryAccess), attribute);
146+
DataResult.Error<ItemAttribute> error = attr.error().orElse(null);
147+
if (error != null) {
148+
return Pair.onlyRight("cannot parse attributes: " + error.message());
149+
}
150+
attrs.add(new ItemAttribute.ItemAttributeEntry(attr.result().orElseThrow(), inverted));
151+
}
152+
stack.set(AllDataComponents.ATTRIBUTE_FILTER_MATCHED_ATTRIBUTES, attrs);
153+
return Pair.onlyLeft(stack);
154+
}
155+
case "package" -> {
156+
if (stack == null) {
157+
stack = new ItemStack(AllItems.PACKAGE_FILTER.get());
158+
}
159+
if (!(stack.getItem() instanceof PackageFilterItem)) {
160+
return Pair.onlyRight("existing filter item is not package filter");
161+
}
162+
PackageItem.addAddress(stack, data.getString("address"));
163+
return Pair.onlyLeft(stack);
164+
}
165+
case "item" -> {
166+
if (stack != null && stack.getItem() instanceof FilterItem) {
167+
return Pair.onlyRight("existing filter item cannot be a filter");
168+
}
169+
LuaTable<?, ?> itemData = new ObjectLuaTable(data.getTable("item"));
170+
ResourceLocation itemId = ResourceLocation.tryParse(itemData.getString("name"));
171+
if (itemId == null) {
172+
return Pair.onlyRight("invalid item ID: " + itemData.getString("name"));
173+
}
174+
Item item = BuiltInRegistries.ITEM.getOptional(itemId).orElse(null);
175+
if (item == null) {
176+
return Pair.onlyRight("item does not exists: " + itemId);
177+
}
178+
if (item instanceof FilterItem) {
179+
return Pair.onlyRight("item cannot be filter item");
180+
}
181+
ItemStack newStack = new ItemStack(item);
182+
Map<?, ?> components = data.optTable("components").orElse(null);
183+
if (components != null) {
184+
newStack.applyComponents(DataComponentUtil.luaToPatch(components, registryAccess));
185+
}
186+
return Pair.onlyLeft(newStack);
187+
}
188+
}
189+
throw new LuaException("Unsupported filter type. Expect 'list', 'attribute', 'package', or 'item'. Got " + filterType);
190+
}
191+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package de.srendi.advancedperipherals.common.addons.create;
2+
3+
import dan200.computercraft.api.ComputerCraftAPI;
4+
5+
public class Integration implements Runnable {
6+
@Override
7+
public void run() {
8+
ComputerCraftAPI.registerGenericSource(new BasinIntegration());
9+
}
10+
}

src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public Component getDisplayName() {
5151
}
5252

5353
@Override
54-
protected InventoryManagerContainer createMenu(int id, Inventory playerInventory) {
54+
protected InventoryManagerContainer createMenu(int id, @NotNull Inventory playerInventory) {
5555
return new InventoryManagerContainer(id, playerInventory, this.getBlockPos(), this.getLevel());
5656
}
5757

src/main/java/de/srendi/advancedperipherals/common/util/DataComponentUtil.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package de.srendi.advancedperipherals.common.util;
22

3-
import dan200.computercraft.shared.util.NBTUtil;
43
import de.srendi.advancedperipherals.common.setup.APDataComponents;
54

65
import net.minecraft.core.RegistryAccess;
@@ -44,8 +43,20 @@ public static Map<String, Object> patchToLua(DataComponentPatch patch) {
4443
}
4544

4645
public static Map<String, Object> patchToLua(DataComponentPatch patch, RegistryAccess registryAccess) {
47-
// TODO: write an Codec to convert to java objects?
48-
return (Map<String, Object>) NBTUtil.toLua(patchToNbt(patch, registryAccess));
46+
return (Map<String, Object>) DataComponentPatch.CODEC
47+
.encodeStart(RegistryOps.create(LuaOps.INSTANCE, registryAccess), patch)
48+
.getOrThrow();
49+
}
50+
51+
public static DataComponentPatch luaToPatch(Map<?, ?> map) {
52+
return luaToPatch(map, ServerLifecycleHooks.getCurrentServer().registryAccess());
53+
}
54+
55+
public static DataComponentPatch luaToPatch(Map<?, ?> map, RegistryAccess registryAccess) {
56+
return DataComponentPatch.CODEC
57+
.parse(RegistryOps.create(LuaOps.INSTANCE, registryAccess), map)
58+
.resultOrPartial()
59+
.orElse(DataComponentPatch.EMPTY);
4960
}
5061

5162
public static DataComponentPatch getStoredDataFromItem(ItemStack stack) {

0 commit comments

Comments
 (0)