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[] 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 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