From f6fd0ad1729211711a530215a0b974e086cf9afe Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 7 Oct 2021 10:25:23 +0000 Subject: [PATCH 01/10] Translations for Russian (ru_ru) Translations for French Translations for English Co-authored-by: SquidDev --- src/main/resources/assets/computercraft/lang/en_us.json | 2 +- src/main/resources/assets/computercraft/lang/fr_fr.json | 4 ++-- src/main/resources/assets/computercraft/lang/ru_ru.json | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/computercraft/lang/en_us.json b/src/main/resources/assets/computercraft/lang/en_us.json index e19fd33e6..60c468634 100644 --- a/src/main/resources/assets/computercraft/lang/en_us.json +++ b/src/main/resources/assets/computercraft/lang/en_us.json @@ -40,7 +40,7 @@ "chat.computercraft.wired_modem.peripheral_connected": "Peripheral \"%s\" connected to network", "chat.computercraft.wired_modem.peripheral_disconnected": "Peripheral \"%s\" disconnected from network", "commands.computercraft.synopsis": "Various commands for controlling computers.", - "commands.computercraft.desc": "The /computercraft command provides various debugging and administrator tools for controlling and interacting with computers.", + "commands.computercraft.desc": "The /computercraft command provides various debugging and administrator tools for controlling and interacting with computers.", "commands.computercraft.help.synopsis": "Provide help for a specific command", "commands.computercraft.help.desc": "Displays this help message", "commands.computercraft.help.no_children": "%s has no sub-commands", diff --git a/src/main/resources/assets/computercraft/lang/fr_fr.json b/src/main/resources/assets/computercraft/lang/fr_fr.json index 3fc29d36e..fd21b0cd3 100644 --- a/src/main/resources/assets/computercraft/lang/fr_fr.json +++ b/src/main/resources/assets/computercraft/lang/fr_fr.json @@ -116,7 +116,7 @@ "gui.computercraft.tooltip.terminate": "Arrêter le programme en cours d'éxecution", "gui.computercraft.tooltip.terminate.key": "Tenir Ctrl+T", "gui.computercraft.upload.overwrite": "Les fichiers seraient écrasés", - "gui.computercraft.upload.overwrite.detail": "Les fichiers suivants seront écrasés lors de l'envoie. Continuer ?%s", + "gui.computercraft.upload.overwrite.detail": "Les fichiers suivants seront écrasés lors de l'envoie. Continuer?%s", "gui.computercraft.upload.overwrite_button": "Écraser", "gui.computercraft.upload.success": "Envoie avec succès", "gui.computercraft.upload.success.msg": "Le fichier %d est envoyé.", @@ -125,7 +125,7 @@ "gui.computercraft.upload.failed.computer_off": "Vous devez allumer cet ordinateur avant d'envoyer ce fichier.", "gui.computercraft.upload.failed.too_much": "Votre fichier est trop lourd pour être envoyé.", "gui.computercraft.upload.failed.overwrite_dir": "%s ne peut pas être envoyé, il y a déjà un dossier avec le même nom.", - "gui.computercraft.upload.failed.generic": "Echec de l'envoie des fichiers(%s)", + "gui.computercraft.upload.failed.generic": "Echec de l'envoie des fichiers (%s)", "commands.computercraft.dump.open_path": "Voir les fichiers de cet ordinateur", "gui.computercraft.tooltip.turn_on": "Allumer cet ordinateur" } diff --git a/src/main/resources/assets/computercraft/lang/ru_ru.json b/src/main/resources/assets/computercraft/lang/ru_ru.json index 1c6a51bec..b3987d970 100644 --- a/src/main/resources/assets/computercraft/lang/ru_ru.json +++ b/src/main/resources/assets/computercraft/lang/ru_ru.json @@ -127,5 +127,8 @@ "gui.computercraft.upload.failed.generic": "Загрузка файлов не удалась (%s)", "gui.computercraft.upload.overwrite": "Файлы будут перезаписаны", "gui.computercraft.upload.overwrite.detail": "При загрузке следующие файлы будут перезаписаны. Продолжить?%s", - "gui.computercraft.upload.overwrite_button": "Перезаписать" + "gui.computercraft.upload.overwrite_button": "Перезаписать", + "gui.computercraft.upload.failed.name_too_long": "Названия файлов слишком длинны для загрузки.", + "gui.computercraft.upload.failed.too_many_files": "Нельзя загрузить столько файлов.", + "gui.computercraft.upload.failed.corrupted": "Файлы повреждены при загрузки. Попробуй снова." } From ca367e7cc71b785ecc6935f0b58cbef7ceb15857 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 6 Oct 2021 18:23:38 +0100 Subject: [PATCH 02/10] Don't run client tests on CI Kinda sucks, but they're so inconsistent between platforms right now, and I cannot be bothered to get CI working. It only needs to work on my machine. --- .github/workflows/main-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main-ci.yml b/.github/workflows/main-ci.yml index 0f633d294..616388d37 100644 --- a/.github/workflows/main-ci.yml +++ b/.github/workflows/main-ci.yml @@ -27,7 +27,6 @@ jobs: run: | mkdir -p ~/.gradle echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties - echo "cc.tweaked.clientTests=true" >> ~/.gradle/gradle.properties - name: Build with Gradle run: | From 9f539dbd59d6d6389d33f34cc68321e819dd990e Mon Sep 17 00:00:00 2001 From: JackMacWindows Date: Fri, 8 Oct 2021 06:29:52 -0400 Subject: [PATCH 03/10] Add about program for easier version identification (#936) --- illuaminate.sexp | 1 + .../resources/data/computercraft/lua/rom/programs/about.lua | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 src/main/resources/data/computercraft/lua/rom/programs/about.lua diff --git a/illuaminate.sexp b/illuaminate.sexp index 63d04be57..4e964af12 100644 --- a/illuaminate.sexp +++ b/illuaminate.sexp @@ -71,6 +71,7 @@ :max _CC_DEFAULT_SETTINGS _CC_DISABLE_LUA51_FEATURES + _HOST ;; Ideally we'd pick these up from bios.lua, but illuaminate currently ;; isn't smart enough. sleep write printError read rs))) diff --git a/src/main/resources/data/computercraft/lua/rom/programs/about.lua b/src/main/resources/data/computercraft/lua/rom/programs/about.lua new file mode 100644 index 000000000..37a0e2901 --- /dev/null +++ b/src/main/resources/data/computercraft/lua/rom/programs/about.lua @@ -0,0 +1,4 @@ +-- Prints information about CraftOS +term.setTextColor(colors.yellow) +print(os.version() .. " on " .. _HOST) +term.setTextColor(colors.white) From 045472577a3635cf953f292ff04e406fa4f4a40e Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Fri, 8 Oct 2021 20:48:17 +0100 Subject: [PATCH 04/10] Improve motd a hundred fold Yes, I know this is a terrible feature. But it's been a long week and I'm so tired. Also fix the ordering in motd_spec. Who thought putting the month first was reasonable? --- .../computercraft/lua/rom/programs/motd.lua | 2 ++ .../test-rom/spec/programs/motd_spec.lua | 20 ++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/resources/data/computercraft/lua/rom/programs/motd.lua b/src/main/resources/data/computercraft/lua/rom/programs/motd.lua index 57ab7b916..5a2e78b83 100644 --- a/src/main/resources/data/computercraft/lua/rom/programs/motd.lua +++ b/src/main/resources/data/computercraft/lua/rom/programs/motd.lua @@ -5,6 +5,8 @@ elseif date.month == 12 and date.day == 24 then print("Merry X-mas!") elseif date.month == 10 and date.day == 31 then print("OOoooOOOoooo! Spooky!") +elseif date.month == 4 and date.day == 28 then + print("Ed Balls") else local tMotd = {} diff --git a/src/test/resources/test-rom/spec/programs/motd_spec.lua b/src/test/resources/test-rom/spec/programs/motd_spec.lua index d426fb6e7..47fcfccd3 100644 --- a/src/test/resources/test-rom/spec/programs/motd_spec.lua +++ b/src/test/resources/test-rom/spec/programs/motd_spec.lua @@ -1,8 +1,8 @@ local capture = require "test_helpers".capture_program describe("The motd program", function() - local function setup_date(month, day) - stub(os, "date", function() return { month = month, day = day } end) + local function setup_date(day, month) + stub(os, "date", function() return { day = day, month = month } end) end it("displays MOTD", function() @@ -16,20 +16,26 @@ describe("The motd program", function() :matches { ok = true, output = "Hello World!\n", error = "" } end) - it("displays date-specific MOTD (1/1)", function() + it("displays date-specific MOTD (1 Jan)", function() setup_date(1, 1) expect(capture(stub, "motd")) :matches { ok = true, output = "Happy new year!\n", error = "" } end) - it("displays date-specific MOTD (10/31)", function() - setup_date(10, 31) + it("displays date-specific MOTD (28 Apr)", function() + setup_date(28, 4) + expect(capture(stub, "motd")) + :matches { ok = true, output = "Ed Balls\n", error = "" } + end) + + it("displays date-specific MOTD (31 Oct)", function() + setup_date(31, 10) expect(capture(stub, "motd")) :matches { ok = true, output = "OOoooOOOoooo! Spooky!\n", error = "" } end) - it("displays date-specific MOTD (12/24)", function() - setup_date(12, 24) + it("displays date-specific MOTD (24 Dec)", function() + setup_date(24, 12) expect(capture(stub, "motd")) :matches { ok = true, output = "Merry X-mas!\n", error = "" } end) From 6dd33f7099aea3315f213e44e61ba054b2607fdb Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 10 Oct 2021 22:35:45 +0100 Subject: [PATCH 05/10] Play sounds using ResourceLocation rather than SoundEvent The latter is not registered when sounds are added via resource packs. Fixes #938. Probably. --- src/main/java/dan200/computercraft/client/SoundManager.java | 6 +++--- .../shared/network/client/SpeakerPlayClientMessage.java | 5 +---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/SoundManager.java b/src/main/java/dan200/computercraft/client/SoundManager.java index 4e6fd4339..e4ea59c90 100644 --- a/src/main/java/dan200/computercraft/client/SoundManager.java +++ b/src/main/java/dan200/computercraft/client/SoundManager.java @@ -10,8 +10,8 @@ import net.minecraft.client.audio.ISound; import net.minecraft.client.audio.ITickableSound; import net.minecraft.client.audio.LocatableSound; import net.minecraft.client.audio.SoundHandler; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvent; import net.minecraft.util.math.vector.Vector3d; import java.util.HashMap; @@ -22,7 +22,7 @@ public class SoundManager { private static final Map sounds = new HashMap<>(); - public static void playSound( UUID source, Vector3d position, SoundEvent event, float volume, float pitch ) + public static void playSound( UUID source, Vector3d position, ResourceLocation event, float volume, float pitch ) { SoundHandler soundManager = Minecraft.getInstance().getSoundManager(); @@ -55,7 +55,7 @@ public class SoundManager private static class MoveableSound extends LocatableSound implements ITickableSound { - protected MoveableSound( SoundEvent sound, Vector3d position, float volume, float pitch ) + protected MoveableSound( ResourceLocation sound, Vector3d position, float volume, float pitch ) { super( sound, SoundCategory.RECORDS ); setPosition( position ); diff --git a/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java index b44e0105e..4d7bbff34 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java @@ -9,12 +9,10 @@ import dan200.computercraft.client.SoundManager; import dan200.computercraft.shared.network.NetworkMessage; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.SoundEvent; import net.minecraft.util.math.vector.Vector3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.network.NetworkEvent; -import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nonnull; import java.util.UUID; @@ -68,7 +66,6 @@ public class SpeakerPlayClientMessage implements NetworkMessage @OnlyIn( Dist.CLIENT ) public void handle( NetworkEvent.Context context ) { - SoundEvent sound = ForgeRegistries.SOUND_EVENTS.getValue( this.sound ); - if( sound != null ) SoundManager.playSound( source, pos, sound, volume, pitch ); + SoundManager.playSound( source, pos, sound, volume, pitch ); } } From 482ae0d22e1623004e753813af871c70c146fad9 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 11 Oct 2021 12:17:45 +0100 Subject: [PATCH 06/10] Fix recipe book upgrade recipes - Flip turtle/pocket and upgrade item. - Correctly set NBT on pocket upgrade recipe output. --- .../recipes/pocket_advanced/computercraft/speaker.json | 7 ++++--- .../computercraft/wireless_modem_advanced.json | 7 ++++--- .../computercraft/wireless_modem_normal.json | 7 ++++--- .../recipes/pocket_normal/computercraft/speaker.json | 7 ++++--- .../computercraft/wireless_modem_advanced.json | 7 ++++--- .../computercraft/wireless_modem_normal.json | 7 ++++--- .../recipes/turtle_advanced/computercraft/speaker.json | 4 ++-- .../computercraft/wireless_modem_advanced.json | 4 ++-- .../computercraft/wireless_modem_normal.json | 4 ++-- .../turtle_advanced/minecraft/crafting_table.json | 4 ++-- .../recipes/turtle_advanced/minecraft/diamond_axe.json | 4 ++-- .../recipes/turtle_advanced/minecraft/diamond_hoe.json | 4 ++-- .../turtle_advanced/minecraft/diamond_pickaxe.json | 4 ++-- .../turtle_advanced/minecraft/diamond_shovel.json | 4 ++-- .../turtle_advanced/minecraft/diamond_sword.json | 4 ++-- .../recipes/turtle_normal/computercraft/speaker.json | 4 ++-- .../computercraft/wireless_modem_advanced.json | 4 ++-- .../computercraft/wireless_modem_normal.json | 4 ++-- .../turtle_normal/minecraft/crafting_table.json | 4 ++-- .../recipes/turtle_normal/minecraft/diamond_axe.json | 4 ++-- .../recipes/turtle_normal/minecraft/diamond_hoe.json | 4 ++-- .../turtle_normal/minecraft/diamond_pickaxe.json | 4 ++-- .../turtle_normal/minecraft/diamond_shovel.json | 4 ++-- .../recipes/turtle_normal/minecraft/diamond_sword.json | 4 ++-- src/main/java/dan200/computercraft/data/Recipes.java | 10 +++++----- 25 files changed, 65 insertions(+), 59 deletions(-) diff --git a/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/speaker.json b/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/speaker.json index 350a5019b..567e5aea4 100644 --- a/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/speaker.json +++ b/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/speaker.json @@ -6,14 +6,15 @@ "P" ], "key": { - "#": { + "P": { "item": "computercraft:pocket_computer_advanced" }, - "P": { + "#": { "item": "computercraft:speaker" } }, "result": { - "item": "computercraft:pocket_computer_advanced" + "item": "computercraft:pocket_computer_advanced", + "nbt": "{Upgrade:\"computercraft:speaker\"}" } } \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_advanced.json b/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_advanced.json index 8896bd062..222c93ae6 100644 --- a/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_advanced.json +++ b/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_advanced.json @@ -6,14 +6,15 @@ "P" ], "key": { - "#": { + "P": { "item": "computercraft:pocket_computer_advanced" }, - "P": { + "#": { "item": "computercraft:wireless_modem_advanced" } }, "result": { - "item": "computercraft:pocket_computer_advanced" + "item": "computercraft:pocket_computer_advanced", + "nbt": "{Upgrade:\"computercraft:wireless_modem_advanced\"}" } } \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_normal.json b/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_normal.json index 9e007b1cd..cd9ff2d17 100644 --- a/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_normal.json +++ b/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_normal.json @@ -6,14 +6,15 @@ "P" ], "key": { - "#": { + "P": { "item": "computercraft:pocket_computer_advanced" }, - "P": { + "#": { "item": "computercraft:wireless_modem_normal" } }, "result": { - "item": "computercraft:pocket_computer_advanced" + "item": "computercraft:pocket_computer_advanced", + "nbt": "{Upgrade:\"computercraft:wireless_modem_normal\"}" } } \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/speaker.json b/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/speaker.json index b5fb937a4..dc388cbd4 100644 --- a/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/speaker.json +++ b/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/speaker.json @@ -6,14 +6,15 @@ "P" ], "key": { - "#": { + "P": { "item": "computercraft:pocket_computer_normal" }, - "P": { + "#": { "item": "computercraft:speaker" } }, "result": { - "item": "computercraft:pocket_computer_normal" + "item": "computercraft:pocket_computer_normal", + "nbt": "{Upgrade:\"computercraft:speaker\"}" } } \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_advanced.json b/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_advanced.json index d8e9518e4..c1e7ef083 100644 --- a/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_advanced.json +++ b/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_advanced.json @@ -6,14 +6,15 @@ "P" ], "key": { - "#": { + "P": { "item": "computercraft:pocket_computer_normal" }, - "P": { + "#": { "item": "computercraft:wireless_modem_advanced" } }, "result": { - "item": "computercraft:pocket_computer_normal" + "item": "computercraft:pocket_computer_normal", + "nbt": "{Upgrade:\"computercraft:wireless_modem_advanced\"}" } } \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_normal.json b/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_normal.json index 736753136..bf12b0174 100644 --- a/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_normal.json +++ b/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_normal.json @@ -6,14 +6,15 @@ "P" ], "key": { - "#": { + "P": { "item": "computercraft:pocket_computer_normal" }, - "P": { + "#": { "item": "computercraft:wireless_modem_normal" } }, "result": { - "item": "computercraft:pocket_computer_normal" + "item": "computercraft:pocket_computer_normal", + "nbt": "{Upgrade:\"computercraft:wireless_modem_normal\"}" } } \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/speaker.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/speaker.json index 6526349af..2cf9964a2 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/speaker.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/speaker.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "computercraft:speaker" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_advanced.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_advanced.json index 2aea48cae..c6cc910fe 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_advanced.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_advanced.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "computercraft:wireless_modem_advanced" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_normal.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_normal.json index 39c434755..7451f115f 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_normal.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_normal.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "computercraft:wireless_modem_normal" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/crafting_table.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/crafting_table.json index f7178ff09..15d1993bf 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/crafting_table.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/crafting_table.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "minecraft:crafting_table" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_axe.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_axe.json index ab2831b56..774438beb 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_axe.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_axe.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "minecraft:diamond_axe" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_hoe.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_hoe.json index 13c2f694c..cf00c7587 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_hoe.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_hoe.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "minecraft:diamond_hoe" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_pickaxe.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_pickaxe.json index 3f3763457..58560f66c 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_pickaxe.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_pickaxe.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "minecraft:diamond_pickaxe" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_shovel.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_shovel.json index 248f62209..614e6178f 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_shovel.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_shovel.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "minecraft:diamond_shovel" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_sword.json b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_sword.json index 8cab2a90b..846b6bc8e 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_sword.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_sword.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_advanced" }, - "T": { + "#": { "item": "minecraft:diamond_sword" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/speaker.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/speaker.json index 28f425aec..39e3fa7e8 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/speaker.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/speaker.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "computercraft:speaker" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_advanced.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_advanced.json index 3af190a52..7b6da28e4 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_advanced.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_advanced.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "computercraft:wireless_modem_advanced" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_normal.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_normal.json index f387a143d..66d096584 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_normal.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_normal.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "computercraft:wireless_modem_normal" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/crafting_table.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/crafting_table.json index 8e8a1dcc9..31647e842 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/crafting_table.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/crafting_table.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "minecraft:crafting_table" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_axe.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_axe.json index 85a16309d..a79534db6 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_axe.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_axe.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "minecraft:diamond_axe" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_hoe.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_hoe.json index 45491a5e8..0c0fc1c39 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_hoe.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_hoe.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "minecraft:diamond_hoe" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_pickaxe.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_pickaxe.json index db9ef1ae6..0490a1267 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_pickaxe.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_pickaxe.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "minecraft:diamond_pickaxe" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_shovel.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_shovel.json index 66f98c2c9..7bbe87284 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_shovel.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_shovel.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "minecraft:diamond_shovel" } }, diff --git a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_sword.json b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_sword.json index c99c73c03..ba893dc67 100644 --- a/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_sword.json +++ b/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_sword.json @@ -5,10 +5,10 @@ "#T" ], "key": { - "#": { + "T": { "item": "computercraft:turtle_normal" }, - "T": { + "#": { "item": "minecraft:diamond_sword" } }, diff --git a/src/main/java/dan200/computercraft/data/Recipes.java b/src/main/java/dan200/computercraft/data/Recipes.java index 8cd2be272..8a85f8f86 100644 --- a/src/main/java/dan200/computercraft/data/Recipes.java +++ b/src/main/java/dan200/computercraft/data/Recipes.java @@ -104,8 +104,8 @@ public class Recipes extends RecipeProvider .shaped( result.getItem() ) .group( String.format( "%s:turtle_%s", ComputerCraft.MOD_ID, nameId ) ) .pattern( "#T" ) - .define( '#', base.getItem() ) - .define( 'T', upgrade.getCraftingItem().getItem() ) + .define( 'T', base.getItem() ) + .define( '#', upgrade.getCraftingItem().getItem() ) .unlockedBy( "has_items", inventoryChange( base.getItem(), upgrade.getCraftingItem().getItem() ) ) .save( @@ -133,14 +133,14 @@ public class Recipes extends RecipeProvider String nameId = family.name().toLowerCase( Locale.ROOT ); PocketUpgrades.getVanillaUpgrades().forEach( upgrade -> { - ItemStack result = PocketComputerItemFactory.create( -1, null, -1, family, null ); + ItemStack result = PocketComputerItemFactory.create( -1, null, -1, family, upgrade ); ShapedRecipeBuilder .shaped( result.getItem() ) .group( String.format( "%s:pocket_%s", ComputerCraft.MOD_ID, nameId ) ) .pattern( "#" ) .pattern( "P" ) - .define( '#', base.getItem() ) - .define( 'P', upgrade.getCraftingItem().getItem() ) + .define( 'P', base.getItem() ) + .define( '#', upgrade.getCraftingItem().getItem() ) .unlockedBy( "has_items", inventoryChange( base.getItem(), upgrade.getCraftingItem().getItem() ) ) .save( From 72e8fc03d34295acd72ad9ef9d0b3e82f2a83985 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 13 Oct 2021 17:56:12 +0100 Subject: [PATCH 07/10] Fix upload bandwidth limit not being set Lol, woops. --- src/main/java/dan200/computercraft/shared/Config.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dan200/computercraft/shared/Config.java b/src/main/java/dan200/computercraft/shared/Config.java index ab29dc4ec..4885b8d0f 100644 --- a/src/main/java/dan200/computercraft/shared/Config.java +++ b/src/main/java/dan200/computercraft/shared/Config.java @@ -348,6 +348,7 @@ public final class Config ComputerCraft.httpMaxRequests = httpMaxRequests.get(); ComputerCraft.httpMaxWebsockets = httpMaxWebsockets.get(); ComputerCraft.httpDownloadBandwidth = httpDownloadBandwidth.get(); + ComputerCraft.httpUploadBandwidth = httpUploadBandwidth.get(); NetworkUtils.reloadConfig(); // Peripheral From ab6b861cd609d04078f786f05d22597994fc215b Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 17 Oct 2021 18:14:22 +0100 Subject: [PATCH 08/10] Move repo to cc-tweaked org Let's see how this goes. - Update references to the new repo - Use rrsync on the server, meaning make-doc.sh uploads relative to the website root. - Bump Gradle wrapper to 7.2. Not related to this change, but possibly fixes running under Java 16. Possibly. --- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/make-doc.sh | 4 ++-- CONTRIBUTING.md | 6 +++--- README.md | 2 +- build.gradle | 14 +++++++------- doc/index.md | 4 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- illuaminate.sexp | 2 +- src/main/resources/META-INF/mods.toml | 4 ++-- .../data/computercraft/lua/rom/motd.txt | 2 +- .../computercraft/ingame/ComputerTest.kt | 2 +- .../computercraft/ingame/DiskDriveTest.kt | 2 +- .../dan200/computercraft/ingame/TurtleTest.kt | 12 ++++++------ src/testMod/resources/META-INF/mods.toml | 4 ++-- 16 files changed, 32 insertions(+), 32 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 911798206..fc234c84a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -4,5 +4,5 @@ contact_links: url: https://discord.computercraft.cc about: Get help on the ComputerCraft Discord. - name: GitHub Discussions - url: https://github.com/SquidDev-CC/CC-Tweaked/discussions + url: https://github.com/cc-tweaked/CC-Tweaked/discussions about: Or ask questions on GitHub Discussions. diff --git a/.github/workflows/make-doc.sh b/.github/workflows/make-doc.sh index 802426430..f22851bee 100755 --- a/.github/workflows/make-doc.sh +++ b/.github/workflows/make-doc.sh @@ -13,7 +13,7 @@ chmod 600 "$HOME/.ssh/key" # And upload rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \ "$GITHUB_WORKSPACE/build/docs/lua/" \ - "$SSH_USER@$SSH_HOST:/var/www/tweaked.cc/$DEST" + "$SSH_USER@$SSH_HOST:/$DEST" rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \ "$GITHUB_WORKSPACE/build/docs/javadoc/" \ - "$SSH_USER@$SSH_HOST:/var/www/tweaked.cc/$DEST/javadoc" + "$SSH_USER@$SSH_HOST:/$DEST/javadoc" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9e70ba29f..c9afbdb4c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,11 +16,11 @@ automatically with GitHub, so please don't submit PRs adding/changing translatio In order to develop CC: Tweaked, you'll need to download the source code and then run it. This is a pretty simple process. When building on Windows, Use `gradlew.bat` instead of `./gradlew`. - - **Clone the repository:** `git clone https://github.com/SquidDev-CC/CC-Tweaked.git && cd CC-Tweaked` + - **Clone the repository:** `git clone https://github.com/cc-tweaked/CC-Tweaked.git && cd CC-Tweaked` - **Setup Forge:** `./gradlew build` - **Run Minecraft:** `./gradlew runClient` (or run the `GradleStart` class from your IDE). - **Optionally:** For small PRs (especially those only touching Lua code), it may be easier to use GitPod, which - provides a pre-configured environment: [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-2b2b2b?logo=gitpod)](https://gitpod.io/#https://github.com/SquidDev-CC/CC-Tweaked/) + provides a pre-configured environment: [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-2b2b2b?logo=gitpod)](https://gitpod.io/#https://github.com/cc-tweaked/CC-Tweaked/) Do note you will need to download the mod after compiling to test. @@ -103,7 +103,7 @@ tests go inside `describe` blocks, and a single test goes inside `it`. Assertions are generally written using `expect` (inspired by Hamcrest and the like). For instance, `expect(foo):eq("bar")` asserts that your variable `foo` is equal to the expected value `"bar"`. -[new-issue]: https://github.com/SquidDev-CC/CC-Tweaked/issues/new/choose "Create a new issue" +[new-issue]: https://github.com/cc-tweaked/CC-Tweaked/issues/new/choose "Create a new issue" [community]: README.md#Community "Get in touch with the community." [checkstyle]: https://checkstyle.org/ [illuaminate]: https://github.com/SquidDev/illuaminate/ "Illuaminate on GitHub" diff --git a/README.md b/README.md index 37714bd10..3495ea8af 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ![CC: Tweaked](doc/logo.png) -[![Current build status](https://github.com/SquidDev-CC/CC-Tweaked/workflows/Build/badge.svg)](https://github.com/SquidDev-CC/CC-Tweaked/actions "Current build status") [![Download CC: Tweaked on CurseForge](http://cf.way2muchnoise.eu/title/cc-tweaked.svg)][CurseForge] +[![Current build status](https://github.com/cc-tweaked/CC-Tweaked/workflows/Build/badge.svg)](https://github.com/cc-tweaked/CC-Tweaked/actions "Current build status") [![Download CC: Tweaked on CurseForge](http://cf.way2muchnoise.eu/title/cc-tweaked.svg)][CurseForge] CC: Tweaked is a mod for Minecraft which adds programmable computers, turtles and more to the game. A fork of the much-beloved [ComputerCraft], it continues its legacy with better performance, stability, and a wealth of new features. diff --git a/build.gradle b/build.gradle index d00231225..5815efe51 100644 --- a/build.gradle +++ b/build.gradle @@ -463,7 +463,7 @@ curseforge { project { id = '282001' releaseType = 'release' - changelog = "Release notes can be found on the GitHub repository (https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." + changelog = "Release notes can be found on the GitHub repository (https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." addGameVersion "${mc_version}" } @@ -481,7 +481,7 @@ tasks.register('publishModrinth', TaskModrinthUpload.class).configure { versionNumber = "${project.mc_version}-${project.mod_version}" uploadFile = jar addGameVersion(project.mc_version) - changelog = "Release notes can be found on the [GitHub repository](https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." + changelog = "Release notes can be found on the [GitHub repository](https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." addLoader('forge') } @@ -498,21 +498,21 @@ publishing { pom { name = 'CC: Tweaked' description = 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.' - url = 'https://github.com/SquidDev-CC/CC-Tweaked' + url = 'https://github.com/cc-tweaked/CC-Tweaked' scm { - url = 'https://github.com/SquidDev-CC/CC-Tweaked.git' + url = 'https://github.com/cc-tweaked/CC-Tweaked.git' } issueManagement { system = 'github' - url = 'https://github.com/SquidDev-CC/CC-Tweaked/issues' + url = 'https://github.com/cc-tweaked/CC-Tweaked/issues' } licenses { license { name = 'ComputerCraft Public License, Version 1.0' - url = 'https://github.com/SquidDev-CC/CC-Tweaked/blob/mc-1.15.x/LICENSE' + url = 'https://github.com/cc-tweaked/CC-Tweaked/blob/mc-1.15.x/LICENSE' } } @@ -537,7 +537,7 @@ publishing { githubRelease { token project.hasProperty('githubApiKey') ? project.githubApiKey : '' - owner 'SquidDev-CC' + owner 'cc-tweaked' repo 'CC-Tweaked' targetCommitish.set(project.provider({ try { diff --git a/doc/index.md b/doc/index.md index ed7aa2848..74d76434b 100644 --- a/doc/index.md +++ b/doc/index.md @@ -43,8 +43,8 @@ If you get stuck, do pop in to the [Minecraft Computer Mod Discord guild][discor ## Get Involved CC: Tweaked lives on [GitHub]. If you've got any ideas, feedback or bugs please do [create an issue][bug]. -[github]: https://github.com/SquidDev-CC/CC-Tweaked/ "CC: Tweaked on GitHub" -[bug]: https://github.com/SquidDev-CC/CC-Tweaked/issues/new/choose +[github]: https://github.com/cc-tweaked/CC-Tweaked/ "CC: Tweaked on GitHub" +[bug]: https://github.com/cc-tweaked/CC-Tweaked/issues/new/choose [computercraft]: https://github.com/dan200/ComputerCraft "ComputerCraft on GitHub" [curseforge]: https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked from CurseForge" [modrinth]: https://modrinth.com/mod/gu7yAYhd "Download CC: Tweaked from Modrinth" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 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 B8dv}T delta 17845 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 X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a971507..ffed3a254 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0c8..744e882ed 100755 --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) diff --git a/illuaminate.sexp b/illuaminate.sexp index 4e964af12..ac3ae44e4 100644 --- a/illuaminate.sexp +++ b/illuaminate.sexp @@ -18,7 +18,7 @@ (title "CC: Tweaked") (logo src/main/resources/pack.png) (url https://tweaked.cc/) - (source-link https://github.com/SquidDev-CC/CC-Tweaked/blob/${commit}/${path}#L${line}) + (source-link https://github.com/cc-tweaked/CC-Tweaked/blob/${commit}/${path}#L${line}) (styles src/web/styles.css) (scripts build/rollup/index.js) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 7fec58d55..165bf316e 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,8 +1,8 @@ modLoader="javafml" loaderVersion="[36,37)" -issueTrackerURL="https://github.com/SquidDev-CC/CC-Tweaked/issues" -displayURL="https://github.com/SquidDev-CC/CC-Tweaked" +issueTrackerURL="https://github.com/cc-tweaked/CC-Tweaked/issues" +displayURL="https://github.com/cc-tweaked/CC-Tweaked" logoFile="pack.png" credits="Created by Daniel Ratcliffe (@DanTwoHundred)" diff --git a/src/main/resources/data/computercraft/lua/rom/motd.txt b/src/main/resources/data/computercraft/lua/rom/motd.txt index ea4ea341d..972589050 100644 --- a/src/main/resources/data/computercraft/lua/rom/motd.txt +++ b/src/main/resources/data/computercraft/lua/rom/motd.txt @@ -1,4 +1,4 @@ -Please report bugs at https://github.com/SquidDev-CC/CC-Tweaked. Thanks! +Please report bugs at https://github.com/cc-tweaked/CC-Tweaked. Thanks! View the documentation at https://tweaked.cc Show off your programs or ask for help at our forum: https://forums.computercraft.cc You can disable these messages by running "set motd.enable false". diff --git a/src/testMod/java/dan200/computercraft/ingame/ComputerTest.kt b/src/testMod/java/dan200/computercraft/ingame/ComputerTest.kt index 247168912..7935c518a 100644 --- a/src/testMod/java/dan200/computercraft/ingame/ComputerTest.kt +++ b/src/testMod/java/dan200/computercraft/ingame/ComputerTest.kt @@ -9,7 +9,7 @@ class Computer_Test { /** * Ensures redstone signals do not travel through computers. * - * @see [#548](https://github.com/SquidDev-CC/CC-Tweaked/issues/548) + * @see [#548](https://github.com/cc-tweaked/CC-Tweaked/issues/548) */ @GameTest fun No_through_signal(context: GameTestHelper) = context.sequence { diff --git a/src/testMod/java/dan200/computercraft/ingame/DiskDriveTest.kt b/src/testMod/java/dan200/computercraft/ingame/DiskDriveTest.kt index 9b4db113b..cbccd69a5 100644 --- a/src/testMod/java/dan200/computercraft/ingame/DiskDriveTest.kt +++ b/src/testMod/java/dan200/computercraft/ingame/DiskDriveTest.kt @@ -8,7 +8,7 @@ class Disk_Drive_Test { /** * Ensure audio disks exist and we can play them. * - * @see [#688](https://github.com/SquidDev-CC/CC-Tweaked/issues/688) + * @see [#688](https://github.com/cc-tweaked/CC-Tweaked/issues/688) */ @GameTest fun Audio_disk(helper: GameTestHelper) = helper.sequence { thenComputerOk() } diff --git a/src/testMod/java/dan200/computercraft/ingame/TurtleTest.kt b/src/testMod/java/dan200/computercraft/ingame/TurtleTest.kt index 589556de5..f37337b25 100644 --- a/src/testMod/java/dan200/computercraft/ingame/TurtleTest.kt +++ b/src/testMod/java/dan200/computercraft/ingame/TurtleTest.kt @@ -13,7 +13,7 @@ class Turtle_Test { /** * Checks turtles can sheer sheep (and drop items) * - * @see [#537](https://github.com/SquidDev-CC/CC-Tweaked/issues/537) + * @see [#537](https://github.com/cc-tweaked/CC-Tweaked/issues/537) */ @GameTest(timeoutTicks = COMPUTER_TIMEOUT) fun Shears_sheep(helper: GameTestHelper) = helper.sequence { thenComputerOk() } @@ -21,7 +21,7 @@ class Turtle_Test { /** * Checks turtles can place lava. * - * @see [#518](https://github.com/SquidDev-CC/CC-Tweaked/issues/518) + * @see [#518](https://github.com/cc-tweaked/CC-Tweaked/issues/518) */ @GameTest(timeoutTicks = COMPUTER_TIMEOUT) fun Place_lava(helper: GameTestHelper) = helper.sequence { thenComputerOk() } @@ -29,7 +29,7 @@ class Turtle_Test { /** * Checks turtles can place when waterlogged. * - * @see [#385](https://github.com/SquidDev-CC/CC-Tweaked/issues/385) + * @see [#385](https://github.com/cc-tweaked/CC-Tweaked/issues/385) */ @GameTest(timeoutTicks = COMPUTER_TIMEOUT) fun Place_waterlogged(helper: GameTestHelper) = helper.sequence { thenComputerOk() } @@ -37,7 +37,7 @@ class Turtle_Test { /** * Checks turtles can pick up lava * - * @see [#297](https://github.com/SquidDev-CC/CC-Tweaked/issues/297) + * @see [#297](https://github.com/cc-tweaked/CC-Tweaked/issues/297) */ @GameTest(timeoutTicks = COMPUTER_TIMEOUT) fun Gather_lava(helper: GameTestHelper) = helper.sequence { thenComputerOk() } @@ -45,7 +45,7 @@ class Turtle_Test { /** * Checks turtles can hoe dirt. * - * @see [#258](https://github.com/SquidDev-CC/CC-Tweaked/issues/258) + * @see [#258](https://github.com/cc-tweaked/CC-Tweaked/issues/258) */ @GameTest(timeoutTicks = COMPUTER_TIMEOUT) fun Hoe_dirt(helper: GameTestHelper) = helper.sequence { thenComputerOk() } @@ -53,7 +53,7 @@ class Turtle_Test { /** * Checks turtles can place monitors * - * @see [#691](https://github.com/SquidDev-CC/CC-Tweaked/issues/691) + * @see [#691](https://github.com/cc-tweaked/CC-Tweaked/issues/691) */ @GameTest(timeoutTicks = COMPUTER_TIMEOUT) fun Place_monitor(helper: GameTestHelper) = helper.sequence { thenComputerOk() } diff --git a/src/testMod/resources/META-INF/mods.toml b/src/testMod/resources/META-INF/mods.toml index 8c0e29159..30ddf13c4 100644 --- a/src/testMod/resources/META-INF/mods.toml +++ b/src/testMod/resources/META-INF/mods.toml @@ -1,8 +1,8 @@ modLoader="javafml" loaderVersion="[30,)" -issueTrackerURL="https://github.com/SquidDev-CC/CC-Tweaked/issues" -displayURL="https://github.com/SquidDev-CC/CC-Tweaked" +issueTrackerURL="https://github.com/cc-tweaked/CC-Tweaked/issues" +displayURL="https://github.com/cc-tweaked/CC-Tweaked" logoFile="pack.png" credits="Created by Daniel Ratcliffe (@DanTwoHundred)" From 544bcaa599b296aaf9affe55c68ee1810c6a38c6 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 24 Oct 2021 19:11:21 +0100 Subject: [PATCH 09/10] Clear the entity drop list as well as cancelling Fixes #940 --- src/main/java/dan200/computercraft/shared/util/DropConsumer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dan200/computercraft/shared/util/DropConsumer.java b/src/main/java/dan200/computercraft/shared/util/DropConsumer.java index ee80f44db..ff8a6b87c 100644 --- a/src/main/java/dan200/computercraft/shared/util/DropConsumer.java +++ b/src/main/java/dan200/computercraft/shared/util/DropConsumer.java @@ -97,6 +97,7 @@ public final class DropConsumer if( dropEntity == null || drops.getEntity() != dropEntity ) return; for( ItemEntity drop : drops.getDrops() ) handleDrops( drop.getItem() ); + drops.getDrops().clear(); drops.setCanceled( true ); } } From ea7a218f4a875ad613141b7d410dfef6beeebe35 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 27 Oct 2021 19:16:32 +0100 Subject: [PATCH 10/10] Make turtle breaking a little more data driven - Allow any tool to break an "instabreak" block (saplings, plants, TNT). Oddly this doesn't include bamboo or bamboo sapings (they're marked as instabreak, only to have their strength overridden again!), so we also provide a tag for additional blocks to allow. - Hoes and shovels now allow breaking any block for which this tool is effective. - Use block tags to drive any other block breaking capabilities. For instance, hoes can break pumpkins and cactuses despite not being effective. This should get a little nicer in 1.17, as we can just use block tags for everything. --- .../recipes/computercraft/cable.json | 2 +- .../computercraft/tags/blocks/computer.json | 8 +++ .../computercraft/tags/blocks/monitor.json | 7 +++ .../computercraft/tags/blocks/turtle.json | 7 +++ .../tags/blocks/turtle_always_breakable.json | 8 +++ .../tags/blocks/turtle_hoe_harvestable.json | 11 ++++ .../blocks/turtle_shovel_harvestable.json | 9 +++ .../tags/blocks/turtle_sword_harvestable.json | 7 +++ .../tags/blocks/wired_modem.json | 7 +++ .../data/BlockTagsGenerator.java | 62 +++++++++++++++++++ .../dan200/computercraft/data/Generators.java | 14 +++-- .../computercraft/data/ItemTagsGenerator.java | 42 +++++++++++++ ...ootTables.java => LootTableGenerator.java} | 4 +- .../{Recipes.java => RecipeGenerator.java} | 36 ++++++----- .../java/dan200/computercraft/data/Tags.java | 61 ------------------ .../shared/ComputerCraftTags.java | 48 ++++++++++++++ .../shared/turtle/upgrades/TurtleHoe.java | 19 +++--- .../shared/turtle/upgrades/TurtleShovel.java | 23 +++---- .../shared/turtle/upgrades/TurtleSword.java | 17 +++-- .../shared/turtle/upgrades/TurtleTool.java | 24 +++++-- 20 files changed, 292 insertions(+), 124 deletions(-) create mode 100644 src/generated/resources/data/computercraft/tags/blocks/computer.json create mode 100644 src/generated/resources/data/computercraft/tags/blocks/monitor.json create mode 100644 src/generated/resources/data/computercraft/tags/blocks/turtle.json create mode 100644 src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json create mode 100644 src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json create mode 100644 src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json create mode 100644 src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json create mode 100644 src/generated/resources/data/computercraft/tags/blocks/wired_modem.json create mode 100644 src/main/java/dan200/computercraft/data/BlockTagsGenerator.java create mode 100644 src/main/java/dan200/computercraft/data/ItemTagsGenerator.java rename src/main/java/dan200/computercraft/data/{LootTables.java => LootTableGenerator.java} (97%) rename src/main/java/dan200/computercraft/data/{Recipes.java => RecipeGenerator.java} (92%) delete mode 100644 src/main/java/dan200/computercraft/data/Tags.java create mode 100644 src/main/java/dan200/computercraft/shared/ComputerCraftTags.java diff --git a/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json b/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json index 69ed2c857..ecec5122c 100644 --- a/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json +++ b/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json @@ -21,7 +21,7 @@ "conditions": { "items": [ { - "tag": "computercraft:computer" + "tag": "computercraft:wired_modem" } ] } diff --git a/src/generated/resources/data/computercraft/tags/blocks/computer.json b/src/generated/resources/data/computercraft/tags/blocks/computer.json new file mode 100644 index 000000000..bcd0e8037 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/computer.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "computercraft:computer_normal", + "computercraft:computer_advanced", + "computercraft:computer_command" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/monitor.json b/src/generated/resources/data/computercraft/tags/blocks/monitor.json new file mode 100644 index 000000000..babaefa8b --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/monitor.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "computercraft:monitor_normal", + "computercraft:monitor_advanced" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle.json b/src/generated/resources/data/computercraft/tags/blocks/turtle.json new file mode 100644 index 000000000..e4277edfe --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "computercraft:turtle_normal", + "computercraft:turtle_advanced" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json new file mode 100644 index 000000000..1d795dcef --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "#minecraft:leaves", + "minecraft:bamboo", + "minecraft:bamboo_sapling" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json new file mode 100644 index 000000000..00e81351a --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "#minecraft:crops", + "minecraft:cactus", + "minecraft:melon", + "minecraft:pumpkin", + "minecraft:carved_pumpkin", + "minecraft:jack_o_lantern" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json new file mode 100644 index 000000000..dfdc26e22 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:melon", + "minecraft:pumpkin", + "minecraft:carved_pumpkin", + "minecraft:jack_o_lantern" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json new file mode 100644 index 000000000..c38f1efd8 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:wool", + "minecraft:cobweb" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json b/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json new file mode 100644 index 000000000..10ade37b3 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "computercraft:cable", + "computercraft:wired_modem_full" + ] +} \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/data/BlockTagsGenerator.java b/src/main/java/dan200/computercraft/data/BlockTagsGenerator.java new file mode 100644 index 000000000..0de559024 --- /dev/null +++ b/src/main/java/dan200/computercraft/data/BlockTagsGenerator.java @@ -0,0 +1,62 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.data; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.shared.Registry; +import net.minecraft.block.Blocks; +import net.minecraft.data.BlockTagsProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.tags.BlockTags; +import net.minecraftforge.common.data.ExistingFileHelper; + +import static dan200.computercraft.shared.ComputerCraftTags.Blocks.*; + +public class BlockTagsGenerator extends BlockTagsProvider +{ + public BlockTagsGenerator( DataGenerator generator, ExistingFileHelper helper ) + { + super( generator, ComputerCraft.MOD_ID, helper ); + } + + @Override + @SuppressWarnings( "unchecked" ) + protected void addTags() + { + // Items + tag( COMPUTER ).add( + Registry.ModBlocks.COMPUTER_NORMAL.get(), + Registry.ModBlocks.COMPUTER_ADVANCED.get(), + Registry.ModBlocks.COMPUTER_COMMAND.get() + ); + tag( TURTLE ).add( Registry.ModBlocks.TURTLE_NORMAL.get(), Registry.ModBlocks.TURTLE_ADVANCED.get() ); + tag( WIRED_MODEM ).add( Registry.ModBlocks.CABLE.get(), Registry.ModBlocks.WIRED_MODEM_FULL.get() ); + tag( MONITOR ).add( Registry.ModBlocks.MONITOR_NORMAL.get(), Registry.ModBlocks.MONITOR_ADVANCED.get() ); + + tag( TURTLE_ALWAYS_BREAKABLE ).addTags( BlockTags.LEAVES ).add( + Blocks.BAMBOO, Blocks.BAMBOO_SAPLING // Bamboo isn't instabreak for some odd reason. + ); + + tag( TURTLE_SHOVEL_BREAKABLE ).add( + Blocks.MELON, + Blocks.PUMPKIN, + Blocks.CARVED_PUMPKIN, + Blocks.JACK_O_LANTERN + ); + + tag( TURTLE_HOE_BREAKABLE ).addTags( + BlockTags.CROPS + ).add( + Blocks.CACTUS, + Blocks.MELON, + Blocks.PUMPKIN, + Blocks.CARVED_PUMPKIN, + Blocks.JACK_O_LANTERN + ); + + tag( TURTLE_SWORD_BREAKABLE ).addTags( BlockTags.WOOL ).add( Blocks.COBWEB ); + } +} diff --git a/src/main/java/dan200/computercraft/data/Generators.java b/src/main/java/dan200/computercraft/data/Generators.java index 476df7e6e..b90148790 100644 --- a/src/main/java/dan200/computercraft/data/Generators.java +++ b/src/main/java/dan200/computercraft/data/Generators.java @@ -7,6 +7,7 @@ package dan200.computercraft.data; import dan200.computercraft.shared.Registry; import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; @@ -20,9 +21,14 @@ public class Generators Registry.registerLoot(); DataGenerator generator = event.getGenerator(); - generator.addProvider( new Recipes( generator ) ); - generator.addProvider( new LootTables( generator ) ); - generator.addProvider( new Tags( generator, event.getExistingFileHelper() ) ); - generator.addProvider( new BlockModelProvider( generator, event.getExistingFileHelper() ) ); + ExistingFileHelper existingFiles = event.getExistingFileHelper(); + + generator.addProvider( new RecipeGenerator( generator ) ); + generator.addProvider( new LootTableGenerator( generator ) ); + generator.addProvider( new BlockModelProvider( generator, existingFiles ) ); + + BlockTagsGenerator blockTags = new BlockTagsGenerator( generator, existingFiles ); + generator.addProvider( blockTags ); + generator.addProvider( new ItemTagsGenerator( generator, blockTags, existingFiles ) ); } } diff --git a/src/main/java/dan200/computercraft/data/ItemTagsGenerator.java b/src/main/java/dan200/computercraft/data/ItemTagsGenerator.java new file mode 100644 index 000000000..b5ccf6495 --- /dev/null +++ b/src/main/java/dan200/computercraft/data/ItemTagsGenerator.java @@ -0,0 +1,42 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.data; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.shared.ComputerCraftTags.Blocks; +import dan200.computercraft.shared.Registry; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.ItemTagsProvider; +import net.minecraft.item.Item; +import net.minecraft.tags.ITag; +import net.minecraftforge.common.data.ExistingFileHelper; + +import static dan200.computercraft.shared.ComputerCraftTags.Items.*; + +public class ItemTagsGenerator extends ItemTagsProvider +{ + private static final ITag.INamedTag PIGLIN_LOVED = net.minecraft.tags.ItemTags.PIGLIN_LOVED; + + public ItemTagsGenerator( DataGenerator generator, BlockTagsGenerator blockTags, ExistingFileHelper helper ) + { + super( generator, blockTags, ComputerCraft.MOD_ID, helper ); + } + + @Override + protected void addTags() + { + copy( Blocks.COMPUTER, COMPUTER ); + copy( Blocks.TURTLE, TURTLE ); + tag( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() ); + copy( Blocks.MONITOR, MONITOR ); + + tag( PIGLIN_LOVED ).add( + Registry.ModItems.COMPUTER_ADVANCED.get(), Registry.ModItems.TURTLE_ADVANCED.get(), + Registry.ModItems.WIRELESS_MODEM_ADVANCED.get(), Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(), + Registry.ModItems.MONITOR_ADVANCED.get() + ); + } +} diff --git a/src/main/java/dan200/computercraft/data/LootTables.java b/src/main/java/dan200/computercraft/data/LootTableGenerator.java similarity index 97% rename from src/main/java/dan200/computercraft/data/LootTables.java rename to src/main/java/dan200/computercraft/data/LootTableGenerator.java index d33a6d55a..d40f62317 100644 --- a/src/main/java/dan200/computercraft/data/LootTables.java +++ b/src/main/java/dan200/computercraft/data/LootTableGenerator.java @@ -25,9 +25,9 @@ import net.minecraftforge.fml.RegistryObject; import java.util.function.BiConsumer; -public class LootTables extends LootTableProvider +public class LootTableGenerator extends LootTableProvider { - public LootTables( DataGenerator generator ) + public LootTableGenerator( DataGenerator generator ) { super( generator ); } diff --git a/src/main/java/dan200/computercraft/data/Recipes.java b/src/main/java/dan200/computercraft/data/RecipeGenerator.java similarity index 92% rename from src/main/java/dan200/computercraft/data/Recipes.java rename to src/main/java/dan200/computercraft/data/RecipeGenerator.java index 8a85f8f86..e5cb790e6 100644 --- a/src/main/java/dan200/computercraft/data/Recipes.java +++ b/src/main/java/dan200/computercraft/data/RecipeGenerator.java @@ -6,7 +6,6 @@ package dan200.computercraft.data; import dan200.computercraft.ComputerCraft; -import dan200.computercraft.data.Tags.CCTags; import dan200.computercraft.shared.PocketUpgrades; import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.TurtleUpgrades; @@ -39,9 +38,12 @@ import javax.annotation.Nonnull; import java.util.Locale; import java.util.function.Consumer; -public class Recipes extends RecipeProvider +import static dan200.computercraft.shared.ComputerCraftTags.Items.COMPUTER; +import static dan200.computercraft.shared.ComputerCraftTags.Items.WIRED_MODEM; + +public class RecipeGenerator extends RecipeProvider { - public Recipes( DataGenerator generator ) + public RecipeGenerator( DataGenerator generator ) { super( generator ); } @@ -162,8 +164,8 @@ public class Recipes extends RecipeProvider .pattern( " # " ) .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) - .unlockedBy( "has_modem", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) + .unlockedBy( "has_modem", inventoryChange( WIRED_MODEM ) ) .save( add ); ShapedRecipeBuilder @@ -206,7 +208,7 @@ public class Recipes extends RecipeProvider .pattern( "#R#" ) .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -216,7 +218,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.STONE ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -226,7 +228,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.INGOTS_GOLD ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -237,7 +239,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.STONE ) .define( 'A', Items.GOLDEN_APPLE ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_apple", inventoryChange( Items.GOLDEN_APPLE ) ) .save( add ); @@ -249,7 +251,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.INGOTS_GOLD ) .define( 'A', Items.GOLDEN_APPLE ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_apple", inventoryChange( Items.GOLDEN_APPLE ) ) .save( add ); @@ -261,7 +263,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) .define( 'D', Tags.Items.DYES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -272,7 +274,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.STONE ) .define( 'N', Blocks.NOTE_BLOCK ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -282,19 +284,19 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_cable", inventoryChange( Registry.ModItems.CABLE.get() ) ) .save( add ); ShapelessRecipeBuilder .shapeless( Registry.ModBlocks.WIRED_MODEM_FULL.get() ) .requires( Registry.ModItems.WIRED_MODEM.get() ) - .unlockedBy( "has_modem", inventoryChange( CCTags.WIRED_MODEM ) ) + .unlockedBy( "has_modem", inventoryChange( WIRED_MODEM ) ) .save( add, new ResourceLocation( ComputerCraft.MOD_ID, "wired_modem_full_from" ) ); ShapelessRecipeBuilder .shapeless( Registry.ModItems.WIRED_MODEM.get() ) .requires( Registry.ModBlocks.WIRED_MODEM_FULL.get() ) - .unlockedBy( "has_modem", inventoryChange( CCTags.WIRED_MODEM ) ) + .unlockedBy( "has_modem", inventoryChange( WIRED_MODEM ) ) .save( add, new ResourceLocation( ComputerCraft.MOD_ID, "wired_modem_full_to" ) ); ShapedRecipeBuilder @@ -304,7 +306,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.STONE ) .define( 'E', Tags.Items.ENDER_PEARLS ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -314,7 +316,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.INGOTS_GOLD ) .define( 'E', Items.ENDER_EYE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_wireless", inventoryChange( Registry.ModBlocks.WIRELESS_MODEM_NORMAL.get() ) ) .save( add ); diff --git a/src/main/java/dan200/computercraft/data/Tags.java b/src/main/java/dan200/computercraft/data/Tags.java deleted file mode 100644 index ae74778b2..000000000 --- a/src/main/java/dan200/computercraft/data/Tags.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.data; - -import dan200.computercraft.ComputerCraft; -import dan200.computercraft.shared.Registry; -import net.minecraft.data.BlockTagsProvider; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.ItemTagsProvider; -import net.minecraft.item.Item; -import net.minecraft.tags.ITag; -import net.minecraft.tags.ItemTags; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.data.ExistingFileHelper; - -import static dan200.computercraft.data.Tags.CCTags.*; - -public class Tags extends ItemTagsProvider -{ - private static final ITag.INamedTag PIGLIN_LOVED = ItemTags.PIGLIN_LOVED; - - public static class CCTags - { - public static final ITag.INamedTag COMPUTER = item( "computer" ); - public static final ITag.INamedTag TURTLE = item( "turtle" ); - public static final ITag.INamedTag WIRED_MODEM = item( "wired_modem" ); - public static final ITag.INamedTag MONITOR = item( "monitor" ); - } - - public Tags( DataGenerator generator, ExistingFileHelper helper ) - { - super( generator, new BlockTagsProvider( generator, ComputerCraft.MOD_ID, helper ), ComputerCraft.MOD_ID, helper ); - } - - @Override - protected void addTags() - { - tag( COMPUTER ).add( - Registry.ModItems.COMPUTER_NORMAL.get(), - Registry.ModItems.COMPUTER_ADVANCED.get(), - Registry.ModItems.COMPUTER_COMMAND.get() - ); - tag( TURTLE ).add( Registry.ModItems.TURTLE_NORMAL.get(), Registry.ModItems.TURTLE_ADVANCED.get() ); - tag( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() ); - tag( MONITOR ).add( Registry.ModItems.MONITOR_NORMAL.get(), Registry.ModItems.MONITOR_ADVANCED.get() ); - - tag( PIGLIN_LOVED ).add( - Registry.ModItems.COMPUTER_ADVANCED.get(), Registry.ModItems.TURTLE_ADVANCED.get(), - Registry.ModItems.WIRELESS_MODEM_ADVANCED.get(), Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(), - Registry.ModItems.MONITOR_ADVANCED.get() - ); - } - - private static ITag.INamedTag item( String name ) - { - return ItemTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() ); - } -} diff --git a/src/main/java/dan200/computercraft/shared/ComputerCraftTags.java b/src/main/java/dan200/computercraft/shared/ComputerCraftTags.java new file mode 100644 index 000000000..744f0ab1b --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/ComputerCraftTags.java @@ -0,0 +1,48 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.shared; + +import dan200.computercraft.ComputerCraft; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ITag; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.ResourceLocation; + +public class ComputerCraftTags +{ + public static class Items + { + public static final ITag.INamedTag COMPUTER = make( "computer" ); + public static final ITag.INamedTag TURTLE = make( "turtle" ); + public static final ITag.INamedTag WIRED_MODEM = make( "wired_modem" ); + public static final ITag.INamedTag MONITOR = make( "monitor" ); + + private static ITag.INamedTag make( String name ) + { + return ItemTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() ); + } + } + + public static class Blocks + { + public static final ITag.INamedTag COMPUTER = make( "computer" ); + public static final ITag.INamedTag TURTLE = make( "turtle" ); + public static final ITag.INamedTag WIRED_MODEM = make( "wired_modem" ); + public static final ITag.INamedTag MONITOR = make( "monitor" ); + + public static final ITag.INamedTag TURTLE_ALWAYS_BREAKABLE = make( "turtle_always_breakable" ); + public static final ITag.INamedTag TURTLE_SHOVEL_BREAKABLE = make( "turtle_shovel_harvestable" ); + public static final ITag.INamedTag TURTLE_SWORD_BREAKABLE = make( "turtle_sword_harvestable" ); + public static final ITag.INamedTag TURTLE_HOE_BREAKABLE = make( "turtle_hoe_harvestable" ); + + private static ITag.INamedTag make( String name ) + { + return BlockTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() ); + } + } +} diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java index 9360aacbd..5bd78218c 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java @@ -9,16 +9,17 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleVerb; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; import javax.annotation.Nonnull; @@ -40,17 +41,15 @@ public class TurtleHoe extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { - if( !super.canBreakBlock( state, world, pos, player ) ) return false; + TurtleCommandResult result = super.checkBlockBreakable( state, world, pos, player ); + if( !result.isSuccess() ) return result; - Material material = state.getMaterial(); - return material == Material.PLANT || - material == Material.CACTUS || - material == Material.VEGETABLE || - material == Material.LEAVES || - material == Material.WATER_PLANT || - material == Material.REPLACEABLE_PLANT; + return state.isToolEffective( ToolType.HOE ) + || state.is( ComputerCraftTags.Blocks.TURTLE_HOE_BREAKABLE ) + || isTriviallyBreakable( world, pos, state ) + ? result : INEFFECTIVE; } @Nonnull diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java index b7e5513e8..2858383f4 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java @@ -9,16 +9,17 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleVerb; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; import javax.annotation.Nonnull; @@ -40,21 +41,15 @@ public class TurtleShovel extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { - if( !super.canBreakBlock( state, world, pos, player ) ) return false; + TurtleCommandResult result = super.checkBlockBreakable( state, world, pos, player ); + if( !result.isSuccess() ) return result; - Material material = state.getMaterial(); - return material == Material.DIRT || - material == Material.SAND || - material == Material.TOP_SNOW || - material == Material.CLAY || - material == Material.SNOW || - material == Material.PLANT || - material == Material.CACTUS || - material == Material.VEGETABLE || - material == Material.LEAVES || - material == Material.REPLACEABLE_PLANT; + return state.isToolEffective( ToolType.SHOVEL ) + || state.is( ComputerCraftTags.Blocks.TURTLE_SHOVEL_BREAKABLE ) + || isTriviallyBreakable( world, pos, state ) + ? result : INEFFECTIVE; } @Nonnull diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java index e1cb4f552..aa6b869d4 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java @@ -5,9 +5,10 @@ */ package dan200.computercraft.shared.turtle.upgrades; +import dan200.computercraft.api.turtle.TurtleCommandResult; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.turtle.core.TurtlePlayer; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -32,16 +33,14 @@ public class TurtleSword extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { - if( !super.canBreakBlock( state, world, pos, player ) ) return false; + TurtleCommandResult result = super.checkBlockBreakable( state, world, pos, player ); + if( !result.isSuccess() ) return result; - Material material = state.getMaterial(); - return material == Material.PLANT || - material == Material.LEAVES || - material == Material.REPLACEABLE_PLANT || - material == Material.WOOL || - material == Material.WEB; + return state.is( ComputerCraftTags.Blocks.TURTLE_SWORD_BREAKABLE ) + || isTriviallyBreakable( world, pos, state ) + ? result : INEFFECTIVE; } @Override diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java index 37c9ab192..194fc0efc 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java @@ -10,6 +10,7 @@ import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.turtle.*; import dan200.computercraft.api.turtle.event.TurtleAttackEvent; import dan200.computercraft.api.turtle.event.TurtleBlockEvent; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.TurtlePermissions; import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.core.TurtlePlayer; @@ -34,6 +35,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.TransformationMatrix; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -48,6 +50,9 @@ import java.util.function.Function; public class TurtleTool extends AbstractTurtleUpgrade { + protected static final TurtleCommandResult UNBREAKABLE = TurtleCommandResult.failure( "Unbreakable block detected" ); + protected static final TurtleCommandResult INEFFECTIVE = TurtleCommandResult.failure( "Cannot break block with this tool" ); + protected final ItemStack item; public TurtleTool( ResourceLocation id, String adjective, Item item ) @@ -109,13 +114,14 @@ public class TurtleTool extends AbstractTurtleUpgrade } } - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { Block block = state.getBlock(); return !state.isAir() && block != Blocks.BEDROCK && state.getDestroyProgress( player, world, pos ) > 0 - && block.canEntityDestroy( state, world, pos, player ); + && block.canEntityDestroy( state, world, pos, player ) + ? TurtleCommandResult.success() : UNBREAKABLE; } protected float getDamageMultiplier() @@ -166,6 +172,7 @@ public class TurtleTool extends AbstractTurtleUpgrade { float damage = (float) turtlePlayer.getAttributeValue( Attributes.ATTACK_DAMAGE ); damage *= getDamageMultiplier(); + ComputerCraft.log.info( "Dealing {} damage", damage ); if( damage > 0.0f ) { DamageSource source = DamageSource.playerAttack( turtlePlayer ); @@ -238,10 +245,8 @@ public class TurtleTool extends AbstractTurtleUpgrade } // Check if we can break the block - if( !canBreakBlock( state, world, blockPosition, turtlePlayer ) ) - { - return TurtleCommandResult.failure( "Unbreakable block detected" ); - } + TurtleCommandResult breakable = checkBlockBreakable( state, world, blockPosition, turtlePlayer ); + if( !breakable.isSuccess() ) return breakable; // Fire the dig event, checking whether it was cancelled. TurtleBlockEvent.Dig digEvent = new TurtleBlockEvent.Dig( turtle, turtlePlayer, world, blockPosition, state, this, side ); @@ -302,4 +307,11 @@ public class TurtleTool extends AbstractTurtleUpgrade } ) ); } } + + protected boolean isTriviallyBreakable( IWorldReader reader, BlockPos pos, BlockState state ) + { + return state.is( ComputerCraftTags.Blocks.TURTLE_ALWAYS_BREAKABLE ) + // Allow breaking any "instabreak" block. + || (state.getDestroySpeed( reader, pos ) == 0 && state.getHarvestLevel() <= 0); + } }