diff --git a/build.gradle b/build.gradle index eeac97fb9..a3fe4ca39 100644 --- a/build.gradle +++ b/build.gradle @@ -135,6 +135,14 @@ repositories { includeGroup "maven.modrinth" } } + maven { + // Location of maven for CC: Tweaked + name = "squiddev" + url = "https://squiddev.cc/maven/" + content { + includeGroup "org.squiddev" + } + } } dependencies { @@ -162,6 +170,9 @@ dependencies { compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_minecraft_version}-${curios_version}:api") runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_minecraft_version}-${curios_version}") + compileOnly fg.deobf("org.squiddev:cc-tweaked-${cc_tweaked_minecraft_version}:${cc_tweaked_version}:api") + runtimeOnly fg.deobf("org.squiddev:cc-tweaked-${cc_tweaked_minecraft_version}:${cc_tweaked_version}") + // implementation fg.deobf("curse.maven:druidcraft-340991:3101903") // implementation fg.deobf("com.ferreusveritas.dynamictrees:DynamicTrees-1.16.5:0.10.0-Beta25") // runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") diff --git a/gradle.properties b/gradle.properties index 69b7698fd..b0959bb38 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,6 +26,8 @@ jei_minecraft_version = 1.18.2 jei_version = 9.7.0.209 curios_minecraft_version = 1.18.2 curios_version = 5.0.7.0 +cc_tweaked_minecraft_version = 1.18.2 +cc_tweaked_version = 1.100.10 # curseforge information projectId = 328085 diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index 52201bb24..35bada843 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -13,7 +13,9 @@ import net.minecraftforge.fml.ModList; public enum Mods { DYNAMICTREES, TCONSTRUCT, - CURIOS; + CURIOS, + + COMPUTERCRAFT; /** * @return a boolean of whether the mod is loaded or not based on mod id diff --git a/src/main/java/com/simibubi/create/compat/computercraft/ComputerControllable.java b/src/main/java/com/simibubi/create/compat/computercraft/ComputerControllable.java new file mode 100644 index 000000000..0a91e7d4c --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/computercraft/ComputerControllable.java @@ -0,0 +1,37 @@ +package com.simibubi.create.compat.computercraft; + +import org.jetbrains.annotations.NotNull; + +import dan200.computercraft.api.peripheral.IPeripheral; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.util.LazyOptional; + +public interface ComputerControllable { + + Capability PERIPHERAL_CAPABILITY = CapabilityManager.get(new CapabilityToken<>() {}); + + IPeripheral createPeripheral(); + + void setPeripheralHandler(LazyOptional peripheralHandler); + + LazyOptional getPeripheralHandler(); + + default LazyOptional getPeripheralCapability(@NotNull Capability cap) { + if (cap == PERIPHERAL_CAPABILITY) { + if (getPeripheralHandler() == null || !getPeripheralHandler().isPresent()) + setPeripheralHandler(LazyOptional.of(this::createPeripheral)); + + return getPeripheralHandler().cast(); + } + + return LazyOptional.empty(); + } + + default void removePeripheral() { + if (getPeripheralHandler() != null) + getPeripheralHandler().invalidate(); + } + +} diff --git a/src/main/java/com/simibubi/create/compat/computercraft/DisplayLinkPeripheral.java b/src/main/java/com/simibubi/create/compat/computercraft/DisplayLinkPeripheral.java new file mode 100644 index 000000000..5fb96553e --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/computercraft/DisplayLinkPeripheral.java @@ -0,0 +1,135 @@ +package com.simibubi.create.compat.computercraft; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.content.logistics.block.display.DisplayLinkTileEntity; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.peripheral.IPeripheral; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; + +public class DisplayLinkPeripheral implements IPeripheral { + + public static final String TAG_KEY = "ComputerSourceList"; + + private final DisplayLinkTileEntity tile; + + public DisplayLinkPeripheral(DisplayLinkTileEntity tile) { + this.tile = tile; + } + + @LuaFunction + public void writeLine(String line) { + ListTag tag = this.tile.getSourceConfig().getList(TAG_KEY, Tag.TAG_STRING); + tag.add(StringTag.valueOf(line)); + + this.tile.getSourceConfig().put(TAG_KEY, tag); + } + + @LuaFunction + public void setLine(int lineNumber, String line) { + ListTag tag = this.tile.getSourceConfig().getList(TAG_KEY, Tag.TAG_STRING); + int size = tag.size(); + + if (lineNumber < size) { + tag.set(lineNumber, StringTag.valueOf(line)); + + } else { + for (int i = 0; i < lineNumber - size; i++) { + tag.add(StringTag.valueOf("")); + } + + tag.add(StringTag.valueOf(line)); + } + + this.tile.getSourceConfig().put(TAG_KEY, tag); + } + + @LuaFunction + public void writeLines(IArguments arguments) throws LuaException { + ListTag tag = this.tile.getSourceConfig().getList(TAG_KEY, Tag.TAG_STRING); + List lines = getLinesFromArguments(arguments, 0); + + for (String line : lines) { + tag.add(StringTag.valueOf(line)); + } + + this.tile.getSourceConfig().put(TAG_KEY, tag); + } + + @LuaFunction + public void setLines(IArguments arguments) throws LuaException { + ListTag tag = this.tile.getSourceConfig().getList(TAG_KEY, Tag.TAG_STRING); + List lines = getLinesFromArguments(arguments, 1); + + int size = tag.size(); + int lineNumber = arguments.getInt(0); + int i = 0; + + for (int j = lineNumber; j < Math.min(size, lines.size()); j++) { + tag.set(j, StringTag.valueOf(lines.get(i))); + i++; + } + + for (int j = 0; j < lineNumber - size; j++) { + tag.add(StringTag.valueOf("")); + } + + for (int j = i; j < lines.size(); j++) { + tag.add(StringTag.valueOf(lines.get(i))); + i++; + } + + this.tile.getSourceConfig().put(TAG_KEY, tag); + } + + @LuaFunction + public void clear() { + this.tile.getSourceConfig().put(TAG_KEY, new ListTag()); + } + + @LuaFunction(mainThread = true) + public void update() { + this.tile.tickSource(); + } + + private List getLinesFromArguments(IArguments arguments, int offset) throws LuaException { + List lines = new ArrayList<>(); + + if (arguments.count() > offset + 1) { + for (int i = offset; i < arguments.count(); i++) { + lines.add(arguments.getString(i)); + } + + } else { + Map map = arguments.getTable(offset); + + for (Object line : map.values()) { + lines.add(line.toString()); + } + } + + return lines; + } + + @NotNull + @Override + public String getType() { + return "cdl"; + } + + @Override + public boolean equals(@Nullable IPeripheral other) { + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java b/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java index 55637bae2..b97bdd789 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java @@ -9,6 +9,8 @@ import java.util.Map; import javax.annotation.Nullable; import com.simibubi.create.Create; +import com.simibubi.create.compat.Mods; +import com.simibubi.create.content.logistics.block.display.source.ComputerDisplaySource; import com.simibubi.create.content.logistics.block.display.source.DeathCounterDisplaySource; import com.simibubi.create.content.logistics.block.display.source.DisplaySource; import com.simibubi.create.content.logistics.block.display.source.EnchantPowerDisplaySource; @@ -237,5 +239,12 @@ public class AllDisplayBehaviours { assignTile(register(Create.asResource("scoreboard_display_source"), new ScoreboardDisplaySource()), BlockEntityType.COMMAND_BLOCK); assignTile(register(Create.asResource("enchant_power_display_source"), new EnchantPowerDisplaySource()), BlockEntityType.ENCHANTING_TABLE); assignBlock(register(Create.asResource("redstone_power_display_source"), new RedstonePowerDisplaySource()), Blocks.TARGET); + + Mods.COMPUTERCRAFT.executeIfInstalled(() -> () -> { + DisplayBehaviour computerDisplaySource = register(Create.asResource("computer_display_source"), new ComputerDisplaySource()); + + assignTile(computerDisplaySource, new ResourceLocation(Mods.COMPUTERCRAFT.asId(), "wired_modem_full")); + assignTile(computerDisplaySource, new ResourceLocation("computercraft", "wired_modem")); + }); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java index 9d9a5f606..bb7d36449 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java @@ -2,6 +2,11 @@ package com.simibubi.create.content.logistics.block.display; import java.util.List; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.compat.computercraft.ComputerControllable; +import com.simibubi.create.compat.computercraft.DisplayLinkPeripheral; import com.simibubi.create.content.logistics.block.display.source.DisplaySource; import com.simibubi.create.content.logistics.block.display.target.DisplayTarget; import com.simibubi.create.foundation.advancement.AllAdvancements; @@ -11,6 +16,7 @@ import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import dan200.computercraft.api.peripheral.IPeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -18,8 +24,10 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; 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.util.LazyOptional; -public class DisplayLinkTileEntity extends SmartTileEntity { +public class DisplayLinkTileEntity extends SmartTileEntity implements ComputerControllable { protected BlockPos targetOffset; @@ -31,9 +39,11 @@ public class DisplayLinkTileEntity extends SmartTileEntity { public LerpedFloat glow; private boolean sendPulse; - + public int refreshTicks; + private LazyOptional peripheralHandler; + public DisplayLinkTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); targetOffset = BlockPos.ZERO; @@ -47,7 +57,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { @Override public void tick() { super.tick(); - + if (isVirtual()) { glow.tickChaser(); return; @@ -59,9 +69,9 @@ public class DisplayLinkTileEntity extends SmartTileEntity { glow.tickChaser(); return; } - + refreshTicks++; - if (refreshTicks < activeSource.getPassiveRefreshTicks()) + if (refreshTicks < activeSource.getPassiveRefreshTicks() || !activeSource.shouldPassiveReset()) return; tickSource(); } @@ -114,7 +124,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { activeSource.transferData(context, activeTarget, targetLine); sendPulse = true; sendData(); - + award(AllAdvancements.DISPLAY_LINK); } @@ -133,7 +143,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); writeGatheredData(tag); - if (clientPacket && activeTarget != null) + if (clientPacket && activeTarget != null) tag.putString("TargetType", activeTarget.id.toString()); if (clientPacket && sendPulse) { sendPulse = false; @@ -173,6 +183,35 @@ public class DisplayLinkTileEntity extends SmartTileEntity { sourceConfig = data.copy(); } + @NotNull + @Override + public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + LazyOptional peripheralCap = getPeripheralCapability(cap); + + return peripheralCap.isPresent() ? peripheralCap : super.getCapability(cap, side); + } + + @Override + public void setRemoved() { + super.setRemoved(); + removePeripheral(); + } + + @Override + public IPeripheral createPeripheral() { + return new DisplayLinkPeripheral(this); + } + + @Override + public void setPeripheralHandler(LazyOptional peripheralHandler) { + this.peripheralHandler = peripheralHandler; + } + + @Override + public LazyOptional getPeripheralHandler() { + return this.peripheralHandler; + } + public void target(BlockPos targetPosition) { this.targetOffset = targetPosition.subtract(worldPosition); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ComputerDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ComputerDisplaySource.java new file mode 100644 index 000000000..e3e988143 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ComputerDisplaySource.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.block.display.source; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; +import com.simibubi.create.content.logistics.block.display.target.DisplayTargetStats; +import com.simibubi.create.foundation.utility.Components; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.MutableComponent; + +public class ComputerDisplaySource extends DisplaySource { + + @Override + public List provideText(DisplayLinkContext context, DisplayTargetStats stats) { + List components = new ArrayList<>(); + ListTag tag = context.sourceConfig().getList("ComputerSourceList", Tag.TAG_STRING); + + for (int i = 0; i < tag.size(); i++) { + components.add(Components.literal(tag.getString(i))); + } + + return components; + } + + @Override + public boolean shouldPassiveReset() { + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/DisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/DisplaySource.java index 5b9877273..d844a1ed1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/DisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/DisplaySource.java @@ -49,6 +49,10 @@ public abstract class DisplaySource extends DisplayBehaviour { return 100; }; + public boolean shouldPassiveReset() { + return true; + } + protected String getTranslationKey() { return id.getPath(); }