diff --git a/common/build.gradle.kts b/common/build.gradle.kts
index 0a9618bc..71bf72f1 100644
--- a/common/build.gradle.kts
+++ b/common/build.gradle.kts
@@ -25,6 +25,11 @@ repositories {
maven("https://maven.siphalor.de/") { // Amecs API (required by Carry On)
name = "Siphalor's Maven"
}
+ maven("https://squiddev.cc/maven/") {// CC Tweaked
+ content {
+ includeGroup("cc.tweaked")
+ }
+ }
}
dependencies {
@@ -45,6 +50,9 @@ dependencies {
modCompileOnly("tschipp.carryon:carryon-fabric-${"minecraft_version"()}:${"carryon_fabric_version"()}")
implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${"mixin_extras_version"()}")!!)
+
+
+ compileOnly("cc.tweaked:cc-tweaked-${"minecraft_version"()}-common-api:${"cc_version"()}")
}
tasks.processResources {
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/ModSetup.java b/common/src/main/java/dev/ithundxr/createnumismatics/ModSetup.java
index 993d4970..db964861 100644
--- a/common/src/main/java/dev/ithundxr/createnumismatics/ModSetup.java
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/ModSetup.java
@@ -18,6 +18,7 @@
package dev.ithundxr.createnumismatics;
+import dev.ithundxr.createnumismatics.compat.computercraft.ComputerCraftProxy;
import dev.ithundxr.createnumismatics.registry.*;
public class ModSetup {
@@ -28,5 +29,7 @@ public static void register() {
NumismaticsBlocks.register();
NumismaticsMenuTypes.register();
NumismaticsTags.register();
+
+ ComputerCraftProxy.register();
}
}
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/compat/Mods.java b/common/src/main/java/dev/ithundxr/createnumismatics/compat/Mods.java
index 54b75464..147d12e0 100644
--- a/common/src/main/java/dev/ithundxr/createnumismatics/compat/Mods.java
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/compat/Mods.java
@@ -30,7 +30,8 @@
*/
public enum Mods {
CARRYON("carryon"),
- SODIUM("sodium")
+ SODIUM("sodium"),
+ COMPUTERCRAFT("computercraft")
;
public final boolean isLoaded;
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/ComputerCraftProxy.java b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/ComputerCraftProxy.java
new file mode 100644
index 00000000..fdc9410c
--- /dev/null
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/ComputerCraftProxy.java
@@ -0,0 +1,47 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.compat.computercraft;
+
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
+import com.simibubi.create.compat.computercraft.FallbackComputerBehaviour;
+import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
+import dev.architectury.injectables.annotations.ExpectPlatform;
+import dev.ithundxr.createnumismatics.compat.Mods;
+
+import java.util.function.Function;
+
+public class ComputerCraftProxy {
+ public static void register() {
+ fallbackFactory = FallbackComputerBehaviour::new;
+ Mods.COMPUTERCRAFT.executeIfInstalled(() -> ComputerCraftProxy::registerWithDependency);
+ }
+
+ @ExpectPlatform
+ static void registerWithDependency() {
+ throw new AssertionError();
+ }
+
+ public static Function fallbackFactory;
+ public static Function computerFactory;
+
+ @ExpectPlatform
+ public static AbstractComputerBehaviour behaviour(SmartBlockEntity sbe) {
+ throw new AssertionError();
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/ComputerBehaviour.java b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/ComputerBehaviour.java
new file mode 100644
index 00000000..c75cf912
--- /dev/null
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/ComputerBehaviour.java
@@ -0,0 +1,62 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.compat.computercraft.implementation;
+
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
+import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
+import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
+import com.tterrag.registrate.util.nullness.NonNullSupplier;
+import dan200.computercraft.api.peripheral.IPeripheral;
+import dev.ithundxr.createnumismatics.compat.computercraft.implementation.peripherals.BrassDepositorPeripheral;
+import dev.ithundxr.createnumismatics.compat.computercraft.implementation.peripherals.VendorPeripheral;
+import dev.ithundxr.createnumismatics.content.depositor.BrassDepositorBlockEntity;
+import dev.ithundxr.createnumismatics.content.vendor.VendorBlockEntity;
+import net.minecraft.core.BlockPos;
+import net.minecraft.world.level.Level;
+
+public class ComputerBehaviour extends AbstractComputerBehaviour {
+ NonNullSupplier peripheralSupplier;
+
+ public static IPeripheral peripheralProvider(Level level, BlockPos blockPos) {
+ AbstractComputerBehaviour behavior = BlockEntityBehaviour.get(level, blockPos, AbstractComputerBehaviour.TYPE);
+ if (behavior instanceof ComputerBehaviour real)
+ return real.getPeripheral();
+ return null;
+ }
+
+ public ComputerBehaviour(SmartBlockEntity te) {
+ super(te);
+ this.peripheralSupplier = getPeripheralFor(te);
+ }
+
+ public static NonNullSupplier getPeripheralFor(SmartBlockEntity be) {
+ if (be instanceof BrassDepositorBlockEntity scbe)
+ return () -> new BrassDepositorPeripheral(scbe);
+ if (be instanceof VendorBlockEntity scbe)
+ return () -> new VendorPeripheral(scbe);
+
+ throw new IllegalArgumentException("No peripheral available for " + be.getType());
+ }
+
+ @Override
+ public T getPeripheral() {
+ //noinspection unchecked
+ return (T) peripheralSupplier.get();
+ }
+}
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/peripherals/BrassDepositorPeripheral.java b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/peripherals/BrassDepositorPeripheral.java
new file mode 100644
index 00000000..de378a97
--- /dev/null
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/peripherals/BrassDepositorPeripheral.java
@@ -0,0 +1,71 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.compat.computercraft.implementation.peripherals;
+
+import com.simibubi.create.compat.computercraft.implementation.peripherals.SyncedPeripheral;
+import dan200.computercraft.api.lua.LuaException;
+import dan200.computercraft.api.lua.LuaFunction;
+import dev.ithundxr.createnumismatics.content.backend.Coin;
+import dev.ithundxr.createnumismatics.content.depositor.BrassDepositorBlockEntity;
+
+import java.util.List;
+import java.util.Map;
+
+import static dev.ithundxr.createnumismatics.content.backend.Coin.getCoinFromName;
+import static dev.ithundxr.createnumismatics.content.backend.Coin.getCoinsFromSpurAmount;
+
+public class BrassDepositorPeripheral extends SyncedPeripheral {
+ public BrassDepositorPeripheral(BrassDepositorBlockEntity blockEntity) {
+ super(blockEntity);
+ }
+
+ @LuaFunction(mainThread = true)
+ public final void setCoinAmount(String coinName, int amount) throws LuaException {
+ Coin coin = getCoinFromName(coinName);
+ if(coin == null) throw new LuaException("incorrect coin name");
+ blockEntity.setPrice(coin, amount);
+ blockEntity.notifyUpdate();
+ }
+
+ @LuaFunction(mainThread = true)
+ public final void setTotalPrice(int spurAmount) {
+ List> coins = getCoinsFromSpurAmount(spurAmount);
+ for (Map.Entry coin : coins) {
+ blockEntity.setPrice(coin.getKey(), coin.getValue());
+ }
+ blockEntity.notifyUpdate();
+ }
+
+ @LuaFunction
+ public final int getTotalPrice() {
+ return blockEntity.getTotalPrice();
+ }
+
+ @LuaFunction
+ public final int getPrice(String coinName) throws LuaException {
+ Coin coin = getCoinFromName(coinName);
+ if(coin == null) throw new LuaException("incorrect coin name");
+ return blockEntity.getPrice(coin);
+ }
+
+ @Override
+ public String getType() {
+ return "Numismatics_Depositor";
+ }
+}
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/peripherals/VendorPeripheral.java b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/peripherals/VendorPeripheral.java
new file mode 100644
index 00000000..31951e93
--- /dev/null
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/implementation/peripherals/VendorPeripheral.java
@@ -0,0 +1,71 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.compat.computercraft.implementation.peripherals;
+
+import com.simibubi.create.compat.computercraft.implementation.peripherals.SyncedPeripheral;
+import dan200.computercraft.api.lua.LuaException;
+import dan200.computercraft.api.lua.LuaFunction;
+import dev.ithundxr.createnumismatics.content.backend.Coin;
+import dev.ithundxr.createnumismatics.content.vendor.VendorBlockEntity;
+
+import java.util.List;
+import java.util.Map;
+
+import static dev.ithundxr.createnumismatics.content.backend.Coin.getCoinFromName;
+import static dev.ithundxr.createnumismatics.content.backend.Coin.getCoinsFromSpurAmount;
+
+public class VendorPeripheral extends SyncedPeripheral {
+ public VendorPeripheral(VendorBlockEntity blockEntity) {
+ super(blockEntity);
+ }
+
+ @LuaFunction(mainThread = true)
+ public final void setCoinAmount(String coinName, int amount) throws LuaException {
+ Coin coin = getCoinFromName(coinName);
+ if(coin == null) throw new LuaException("incorrect coin name");
+ blockEntity.setPrice(coin, amount);
+ blockEntity.notifyUpdate();
+ }
+
+ @LuaFunction(mainThread = true)
+ public final void setTotalPrice(int spurAmount) {
+ List> coins = getCoinsFromSpurAmount(spurAmount);
+ for (Map.Entry coin : coins) {
+ blockEntity.setPrice(coin.getKey(), coin.getValue());
+ }
+ blockEntity.notifyUpdate();
+ }
+
+ @LuaFunction
+ public final int getTotalPrice() {
+ return blockEntity.getTotalPrice();
+ }
+
+ @LuaFunction
+ public final int getPrice(String coinName) throws LuaException {
+ Coin coin = getCoinFromName(coinName);
+ if(coin == null) throw new LuaException("incorrect coin name");
+ return blockEntity.getPrice(coin);
+ }
+
+ @Override
+ public String getType() {
+ return "Numismatics_Vendor";
+ }
+}
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/content/backend/Coin.java b/common/src/main/java/dev/ithundxr/createnumismatics/content/backend/Coin.java
index c65247ed..9044bd48 100644
--- a/common/src/main/java/dev/ithundxr/createnumismatics/content/backend/Coin.java
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/content/backend/Coin.java
@@ -23,6 +23,7 @@
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.utility.Components;
import com.simibubi.create.foundation.utility.Couple;
+import com.simibubi.create.foundation.utility.Pair;
import dev.ithundxr.createnumismatics.registry.NumismaticsIcons;
import dev.ithundxr.createnumismatics.registry.NumismaticsItems;
import dev.ithundxr.createnumismatics.util.TextUtils;
@@ -30,8 +31,7 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
-import java.util.List;
-import java.util.Locale;
+import java.util.*;
import static dev.ithundxr.createnumismatics.registry.NumismaticsIcons.*;
@@ -144,4 +144,25 @@ public static Coin closest(int value) {
}
return closest;
}
+
+ public static List> getCoinsFromSpurAmount(int spurAmount){
+ List> coins = new ArrayList<>();
+ for(Coin coin : Arrays.stream(Coin.values()).sorted(Comparator.comparingInt(c -> -c.value)).toList()){
+ Couple coinAmount = coin.convert(spurAmount);
+ coins.add(new AbstractMap.SimpleEntry<>(coin, coinAmount.getFirst()));
+ spurAmount = coinAmount.getSecond();
+ }
+ return coins;
+ }
+
+ public static Coin getCoinFromName(String name){
+ Coin selectedCoin = null;
+ for (Coin coin : Coin.values()){
+ if(coin.getName().equals(name)){
+ selectedCoin = coin;
+ break;
+ }
+ }
+ return selectedCoin;
+ }
}
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/content/depositor/BrassDepositorBlockEntity.java b/common/src/main/java/dev/ithundxr/createnumismatics/content/depositor/BrassDepositorBlockEntity.java
index 48f2cd78..a2a384bf 100644
--- a/common/src/main/java/dev/ithundxr/createnumismatics/content/depositor/BrassDepositorBlockEntity.java
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/content/depositor/BrassDepositorBlockEntity.java
@@ -18,10 +18,12 @@
package dev.ithundxr.createnumismatics.content.depositor;
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.utility.Components;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Lang;
+import dev.ithundxr.createnumismatics.compat.computercraft.ComputerCraftProxy;
import dev.ithundxr.createnumismatics.content.backend.Coin;
import dev.ithundxr.createnumismatics.content.backend.behaviours.SliderStylePriceBehaviour;
import dev.ithundxr.createnumismatics.content.backend.trust_list.TrustListMenu;
@@ -47,6 +49,7 @@
public class BrassDepositorBlockEntity extends AbstractDepositorBlockEntity implements MenuProvider {
private SliderStylePriceBehaviour price;
+ public AbstractComputerBehaviour computerBehaviour;
public BrassDepositorBlockEntity(BlockEntityType> type, BlockPos pos, BlockState state) {
super(type, pos, state);
@@ -55,6 +58,7 @@ public BrassDepositorBlockEntity(BlockEntityType> type, BlockPos pos, BlockSta
@Override
public void addBehaviours(List behaviours) {
price = new SliderStylePriceBehaviour(this, this::addCoin, this::getCoinCount);
+ behaviours.add(computerBehaviour = ComputerCraftProxy.behaviour(this));
behaviours.add(price);
}
diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/content/vendor/VendorBlockEntity.java b/common/src/main/java/dev/ithundxr/createnumismatics/content/vendor/VendorBlockEntity.java
index 519d53df..e8a81ac1 100644
--- a/common/src/main/java/dev/ithundxr/createnumismatics/content/vendor/VendorBlockEntity.java
+++ b/common/src/main/java/dev/ithundxr/createnumismatics/content/vendor/VendorBlockEntity.java
@@ -20,13 +20,17 @@
import com.google.common.collect.ImmutableList;
import com.simibubi.create.AllSoundEvents;
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.utility.Components;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Lang;
+import dan200.computercraft.api.ComputerCraftAPI;
+import dan200.computercraft.api.ComputerCraftTags;
import dev.ithundxr.createnumismatics.Numismatics;
+import dev.ithundxr.createnumismatics.compat.computercraft.ComputerCraftProxy;
import dev.ithundxr.createnumismatics.content.backend.BankAccount;
import dev.ithundxr.createnumismatics.content.backend.Coin;
import dev.ithundxr.createnumismatics.content.backend.Trusted;
@@ -106,15 +110,16 @@ public void setChanged() {
private Mode mode = Mode.SELL;
public final NonNullList items = NonNullList.withSize(9, ItemStack.EMPTY);
+ AbstractComputerBehaviour computerBehaviour;
public VendorBlockEntity(BlockEntityType> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
-
@Override
public void addBehaviours(List behaviours) {
price = new SliderStylePriceBehaviour(this, this::addCoin, this::getCoinCount);
+ behaviours.add(computerBehaviour = ComputerCraftProxy.behaviour(this));
behaviours.add(price);
}
diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts
index 117133c0..11fb4b12 100644
--- a/fabric/build.gradle.kts
+++ b/fabric/build.gradle.kts
@@ -54,6 +54,11 @@ repositories {
maven("https://maven.siphalor.de/") { // Amecs API (required by Carry On)
name = "Siphalor's Maven"
}
+ maven("https://squiddev.cc/maven/") {// CC Tweaked
+ content {
+ includeGroup("cc.tweaked")
+ }
+ }
}
dependencies {
@@ -79,6 +84,11 @@ dependencies {
modLocalRuntime("dev.emi:emi-fabric:${"emi_version"()}")
+ modCompileOnly("cc.tweaked:cc-tweaked-${"minecraft_version"()}-fabric-api:${"cc_version"()}")
+ if ("enable_cc"().toBoolean()) {
+ modLocalRuntime("cc.tweaked:cc-tweaked-${"minecraft_version"()}-fabric:${"cc_version"()}")
+ }
+
// Carry On
modCompileOnly("tschipp.carryon:carryon-fabric-${"minecraft_version"()}:${"carryon_forge_version"()}")
if ("enable_carryon"().toBoolean()) {
diff --git a/fabric/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/fabric/ComputerCraftProxyImpl.java b/fabric/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/fabric/ComputerCraftProxyImpl.java
new file mode 100644
index 00000000..80d9cc2c
--- /dev/null
+++ b/fabric/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/fabric/ComputerCraftProxyImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.compat.computercraft.fabric;
+
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
+import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
+import dan200.computercraft.api.peripheral.PeripheralLookup;
+import dev.ithundxr.createnumismatics.compat.computercraft.ComputerCraftProxy;
+import dev.ithundxr.createnumismatics.compat.computercraft.implementation.ComputerBehaviour;
+
+public class ComputerCraftProxyImpl {
+ public static void registerWithDependency() {
+ /* Comment if computercraft.implementation is not in the source set */
+ ComputerCraftProxy.computerFactory = ComputerBehaviour::new;
+
+ PeripheralLookup.get().registerFallback((level, blockPos, blockState, blockEntity, direction) -> ComputerBehaviour.peripheralProvider(level, blockPos));
+ }
+
+ public static AbstractComputerBehaviour behaviour(SmartBlockEntity sbe) {
+ if (ComputerCraftProxy.computerFactory == null)
+ return ComputerCraftProxy.fallbackFactory.apply(sbe);
+ return ComputerCraftProxy.computerFactory.apply(sbe);
+ }
+}
diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts
index b962ba7e..4ce7af84 100644
--- a/forge/build.gradle.kts
+++ b/forge/build.gradle.kts
@@ -25,6 +25,11 @@ repositories {
includeGroup("com.simibubi.create")
}
}
+ maven("https://squiddev.cc/maven/") { // CC Tweaked
+ content {
+ includeGroup("cc.tweaked")
+ }
+ }
}
dependencies {
@@ -39,6 +44,20 @@ dependencies {
modLocalRuntime("dev.emi:emi-forge:${"emi_version"()}")
+ modCompileOnly("cc.tweaked:cc-tweaked-${"minecraft_version"()}-forge-api:${"cc_version"()}")
+ modCompileOnly("cc.tweaked:cc-tweaked-${"minecraft_version"()}-core-api:${"cc_version"()}")
+
+ forgeRuntimeLibrary("cc.tweaked:cobalt:0.9.3")
+ forgeRuntimeLibrary("com.jcraft:jzlib:1.1.3")
+ forgeRuntimeLibrary("io.netty:netty-codec-http:4.1.82.Final")
+ forgeRuntimeLibrary("io.netty:netty-codec-socks:4.1.82.Final")
+ forgeRuntimeLibrary("io.netty:netty-handler-proxy:4.1.82.Final")
+
+ if ("enable_cc"().toBoolean()) {
+ modLocalRuntime("cc.tweaked:cc-tweaked-${"minecraft_version"()}-forge:${"cc_version"()}")
+ }
+
+
// Carry On
modCompileOnly("tschipp.carryon:carryon-forge-${"minecraft_version"()}:${"carryon_forge_version"()}")
if ("enable_carryon"().toBoolean()) {
diff --git a/forge/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/forge/ComputerCraftProxyImpl.java b/forge/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/forge/ComputerCraftProxyImpl.java
new file mode 100644
index 00000000..fe83abe5
--- /dev/null
+++ b/forge/src/main/java/dev/ithundxr/createnumismatics/compat/computercraft/forge/ComputerCraftProxyImpl.java
@@ -0,0 +1,36 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.compat.computercraft.forge;
+
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
+import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
+import dev.ithundxr.createnumismatics.compat.computercraft.ComputerCraftProxy;
+import dev.ithundxr.createnumismatics.compat.computercraft.implementation.ComputerBehaviour;
+
+public class ComputerCraftProxyImpl {
+ public static void registerWithDependency() {
+ /* Comment if computercraft.implementation is not in the source set */
+ ComputerCraftProxy.computerFactory = ComputerBehaviour::new;
+ }
+ public static AbstractComputerBehaviour behaviour(SmartBlockEntity sbe) {
+ if (ComputerCraftProxy.computerFactory == null)
+ return ComputerCraftProxy.fallbackFactory.apply(sbe);
+ return ComputerCraftProxy.computerFactory.apply(sbe);
+ }
+}
diff --git a/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/BrassDepositorBlockEntityCapabilities.java b/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/BrassDepositorBlockEntityCapabilities.java
new file mode 100644
index 00000000..20a74aff
--- /dev/null
+++ b/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/BrassDepositorBlockEntityCapabilities.java
@@ -0,0 +1,57 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.forge.mixin.self;
+
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
+import dev.ithundxr.createnumismatics.content.depositor.AbstractDepositorBlockEntity;
+import dev.ithundxr.createnumismatics.content.depositor.BrassDepositorBlockEntity;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraftforge.common.capabilities.Capability;
+import net.minecraftforge.common.capabilities.ICapabilityProvider;
+import net.minecraftforge.common.util.LazyOptional;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+
+@Mixin(BrassDepositorBlockEntity.class)
+public abstract class BrassDepositorBlockEntityCapabilities extends AbstractDepositorBlockEntity implements ICapabilityProvider {
+ public BrassDepositorBlockEntityCapabilities(BlockEntityType> type, BlockPos pos, BlockState state) {
+ super(type, pos, state);
+ }
+
+ @Shadow AbstractComputerBehaviour computerBehaviour;
+
+ @Override
+ public @NotNull LazyOptional getCapability(@NotNull Capability capability, @Nullable Direction direction) {
+ if (computerBehaviour.isPeripheralCap(capability))
+ return computerBehaviour.getPeripheralCapability();
+
+ return super.getCapability(capability, direction);
+ }
+
+ @Override
+ public void invalidateCaps() {
+ super.invalidateCaps();
+ computerBehaviour.removePeripheral();
+ }
+}
diff --git a/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/ComputerBehaviourCapabilities.java b/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/ComputerBehaviourCapabilities.java
new file mode 100644
index 00000000..48d724f6
--- /dev/null
+++ b/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/ComputerBehaviourCapabilities.java
@@ -0,0 +1,60 @@
+/*
+ * Numismatics
+ * Copyright (c) 2024 The Railways Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package dev.ithundxr.createnumismatics.forge.mixin.self;
+
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
+import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
+import com.tterrag.registrate.util.nullness.NonNullSupplier;
+import dan200.computercraft.api.peripheral.IPeripheral;
+import dev.ithundxr.createnumismatics.compat.computercraft.implementation.ComputerBehaviour;
+import net.minecraftforge.common.capabilities.Capability;
+import net.minecraftforge.common.capabilities.CapabilityManager;
+import net.minecraftforge.common.capabilities.CapabilityToken;
+import net.minecraftforge.common.util.LazyOptional;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+
+@Mixin(ComputerBehaviour.class)
+public class ComputerBehaviourCapabilities extends AbstractComputerBehaviour {
+ public ComputerBehaviourCapabilities(SmartBlockEntity te) {
+ super(te);
+ }
+
+ private static final Capability RAILWAYS$PERIPHERAL_CAPABILITY = CapabilityManager.get(new CapabilityToken<>() {});
+ LazyOptional railways$peripheral;
+ @Shadow NonNullSupplier peripheralSupplier;
+
+ @Override
+ public boolean isPeripheralCap(Capability cap) {
+ return cap == RAILWAYS$PERIPHERAL_CAPABILITY;
+ }
+
+ @Override
+ public LazyOptional getPeripheralCapability() {
+ if (railways$peripheral == null || !railways$peripheral.isPresent())
+ railways$peripheral = LazyOptional.of(() -> peripheralSupplier.get());
+ return railways$peripheral.cast();
+ }
+
+ @Override
+ public void removePeripheral() {
+ if (railways$peripheral != null)
+ railways$peripheral.invalidate();
+ }
+}
diff --git a/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/VendorBlockEntityCapabilities.java b/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/VendorBlockEntityCapabilities.java
index d4efffb6..5645342e 100644
--- a/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/VendorBlockEntityCapabilities.java
+++ b/forge/src/main/java/dev/ithundxr/createnumismatics/forge/mixin/self/VendorBlockEntityCapabilities.java
@@ -18,6 +18,7 @@
package dev.ithundxr.createnumismatics.forge.mixin.self;
+import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import dev.ithundxr.createnumismatics.content.vendor.VendorBlockEntity;
import net.minecraft.core.BlockPos;
@@ -32,6 +33,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
@Mixin(VendorBlockEntity.class)
@@ -40,6 +42,8 @@ public VendorBlockEntityCapabilities(BlockEntityType> type, BlockPos pos, Bloc
super(type, pos, state);
}
+ @Shadow AbstractComputerBehaviour computerBehaviour;
+
// This is actually just down + all the 5 other sides
@Unique private static final Direction[] numismatics$DIRECTIONS = {Direction.DOWN, Direction.NORTH};
@Unique LazyOptional extends IItemHandler>[] numismatics$handlers = SidedInvWrapper.create((WorldlyContainer) this, numismatics$DIRECTIONS);
@@ -50,6 +54,10 @@ public VendorBlockEntityCapabilities(BlockEntityType> type, BlockPos pos, Bloc
// If down return the down handler otherwise return the one for all other sides
return facing == Direction.DOWN ? numismatics$handlers[0].cast() : numismatics$handlers[1].cast();
}
+
+ if (computerBehaviour.isPeripheralCap(capability))
+ return computerBehaviour.getPeripheralCapability();
+
return super.getCapability(capability, facing);
}
@@ -62,6 +70,7 @@ public void reviveCaps() {
@Override
public void invalidateCaps() {
super.invalidateCaps();
+ computerBehaviour.removePeripheral();
for (LazyOptional extends IItemHandler> createNumismatics$handler : numismatics$handlers) {
createNumismatics$handler.invalidate();
diff --git a/forge/src/main/resources/numismatics.mixins.json b/forge/src/main/resources/numismatics.mixins.json
index 6d08f0fe..698ea854 100644
--- a/forge/src/main/resources/numismatics.mixins.json
+++ b/forge/src/main/resources/numismatics.mixins.json
@@ -10,6 +10,8 @@
],
"mixins": [
"ServerGamePacketListenerImplMixin",
+ "self.BrassDepositorBlockEntityCapabilities",
+ "self.ComputerBehaviourCapabilities",
"self.VendorBlockEntityCapabilities"
],
"injectors": {
diff --git a/gradle.properties b/gradle.properties
index 75849dd6..dab0faff 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -59,6 +59,9 @@ carryon_forge_version = 2.1.2.7
carryon_fabric_version = 2.1.2.7
enable_carryon = false
+cc_version = 1.110.2
+enable_cc = true
+
# Publishing
# Modrinth
modrinth_id = Jdbbtt0i