From 86367a386349dd63ae9b8f109fddcfa1d0351c91 Mon Sep 17 00:00:00 2001 From: Andrey Nikitin Date: Wed, 12 Apr 2023 22:02:08 +0300 Subject: [PATCH] Twice Upon a Loader --- .gitattributes | 15 + .gitignore | 23 + .idea/scopes/Fabric_sources.xml | 3 + .idea/scopes/Forge_sources.xml | 3 + Common/build.gradle | 54 ++ .../su/a71/tardim_ic/tardim_ic/Constants.java | 11 + .../blockstates/digital_tardim_interface.json | 7 + .../blockstates/redstone_tardim_input.json | 7 + .../main/resources/assets/tardim_ic/icon.png | Bin 0 -> 74055 bytes .../assets/tardim_ic/lang/en_uk.json | 5 + .../assets/tardim_ic/lang/en_us.json | 5 + .../resources/assets/tardim_ic/lang/rpr.json | 5 + .../assets/tardim_ic/lang/ru_ru.json | 5 + .../block/digital_tardim_interface.json | 213 +++++ .../models/block/redstone_tardim_input.json | 36 + .../models/item/digital_tardim_interface.json | 23 + .../models/item/redstone_tardim_input.json | 23 + .../blocks/digital_tardim_interface.png | Bin 0 -> 1705 bytes .../tardim_ic/textures/blocks/red_contr.png | Bin 0 -> 927 bytes .../textures/blocks/red_contr.png.mcmeta | 7 + .../blocks/digital_tardim_interface.json | 20 + .../blocks/redstone_tardim_input.json | 20 + .../recipes/digital_tardim_interface.json | 30 + .../recipes/redstone_tardim_input.json | 26 + Common/src/main/resources/pack.mcmeta | 7 + Fabric/build.gradle | 64 ++ .../tardim_ic/tardim_ic/TardimInControl.java | 10 + Fabric/src/main/resources/fabric.mod.json | 39 + Fabric/src/main/resources/modid.mixins.json | 15 + Forge/build.gradle | 108 +++ .../a71/tardim_ic/tardim_ic/Registration.java | 56 ++ .../tardim_ic/tardim_ic/TardimInControl.java | 20 + .../command/CommandModemTransmit.java | 70 ++ .../tardim_ic/command/CommandSender.java | 40 + .../DigitalInterfaceBlock.java | 26 + .../DigitalInterfacePeripheral.java | 727 ++++++++++++++++++ .../DigitalInterfaceTileEntity.java | 45 ++ .../redsone_input/RedstoneInputBlock.java | 100 +++ .../RedstoneInputTileEntity.java | 28 + .../tardim_ic/tardim_ic/sonic/SonicProbe.java | 22 + Forge/src/main/resources/META-INF/mods.toml | 46 ++ README.md | 25 + build.gradle | 66 ++ gradle.properties | 28 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 +++++ gradlew.bat | 89 +++ scripts/basicTest.lua | 12 + settings.gradle | 16 + 50 files changed, 2388 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .idea/scopes/Fabric_sources.xml create mode 100644 .idea/scopes/Forge_sources.xml create mode 100644 Common/build.gradle create mode 100644 Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java create mode 100644 Common/src/main/resources/assets/tardim_ic/blockstates/digital_tardim_interface.json create mode 100644 Common/src/main/resources/assets/tardim_ic/blockstates/redstone_tardim_input.json create mode 100644 Common/src/main/resources/assets/tardim_ic/icon.png create mode 100644 Common/src/main/resources/assets/tardim_ic/lang/en_uk.json create mode 100644 Common/src/main/resources/assets/tardim_ic/lang/en_us.json create mode 100644 Common/src/main/resources/assets/tardim_ic/lang/rpr.json create mode 100644 Common/src/main/resources/assets/tardim_ic/lang/ru_ru.json create mode 100644 Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json create mode 100644 Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json create mode 100644 Common/src/main/resources/assets/tardim_ic/models/item/digital_tardim_interface.json create mode 100644 Common/src/main/resources/assets/tardim_ic/models/item/redstone_tardim_input.json create mode 100644 Common/src/main/resources/assets/tardim_ic/textures/blocks/digital_tardim_interface.png create mode 100644 Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png create mode 100644 Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png.mcmeta create mode 100644 Common/src/main/resources/data/tardim_ic/loot_tables/blocks/digital_tardim_interface.json create mode 100644 Common/src/main/resources/data/tardim_ic/loot_tables/blocks/redstone_tardim_input.json create mode 100644 Common/src/main/resources/data/tardim_ic/recipes/digital_tardim_interface.json create mode 100644 Common/src/main/resources/data/tardim_ic/recipes/redstone_tardim_input.json create mode 100644 Common/src/main/resources/pack.mcmeta create mode 100644 Fabric/build.gradle create mode 100644 Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java create mode 100644 Fabric/src/main/resources/fabric.mod.json create mode 100644 Fabric/src/main/resources/modid.mixins.json create mode 100644 Forge/build.gradle create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputBlock.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputTileEntity.java create mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/sonic/SonicProbe.java create mode 100644 Forge/src/main/resources/META-INF/mods.toml create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 scripts/basicTest.lua create mode 100644 settings.gradle diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..20fc528 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +* text eol=lf +*.bat text eol=crlf +*.patch text eol=lf +*.java text eol=lf +*.gradle text eol=crlf +*.png binary +*.gif binary +*.exe binary +*.dll binary +*.jar binary +*.lzma binary +*.zip binary +*.pyd binary +*.cfg text eol=lf +*.jks binary \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..778a722 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project + +# idea +out +*.ipr +*.iws +*.iml +.idea/* +!.idea/scopes + +# gradle +build +.gradle + +# other +eclipse +run diff --git a/.idea/scopes/Fabric_sources.xml b/.idea/scopes/Fabric_sources.xml new file mode 100644 index 0000000..0448412 --- /dev/null +++ b/.idea/scopes/Fabric_sources.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/scopes/Forge_sources.xml b/.idea/scopes/Forge_sources.xml new file mode 100644 index 0000000..7b5f24d --- /dev/null +++ b/.idea/scopes/Forge_sources.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Common/build.gradle b/Common/build.gradle new file mode 100644 index 0000000..ea3a28a --- /dev/null +++ b/Common/build.gradle @@ -0,0 +1,54 @@ +plugins { + id 'java' + id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' + id 'maven-publish' +} + +archivesBaseName = "${mod_name}-common-${minecraft_version}" + +minecraft { + version(minecraft_version) + runs { + if (project.hasProperty('common_runs_enabled') ? project.findProperty('common_runs_enabled').toBoolean() : true) { + + server(project.hasProperty('common_server_run_name') ? project.findProperty('common_server_run_name') : 'vanilla_server') { + workingDirectory(this.file("run")) + } + client(project.hasProperty('common_client_run_name') ? project.findProperty('common_client_run_name') : 'vanilla_client') { + workingDirectory(this.file("run")) + } + } + } +} + +dependencies { + compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' + implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' +} + +processResources { + + def buildProps = project.properties.clone() + + filesMatching(['pack.mcmeta']) { + + expand buildProps + } +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + from components.java + } + } + + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} \ No newline at end of file diff --git a/Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java b/Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java new file mode 100644 index 0000000..f07c887 --- /dev/null +++ b/Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java @@ -0,0 +1,11 @@ +package su.a71.tardim_ic.tardim_ic; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Constants { + + public static final String MOD_ID = "tardim_ic"; + public static final String MOD_NAME = "TARDIM: In Control"; + public static final Logger LOG = LoggerFactory.getLogger(MOD_NAME); +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/blockstates/digital_tardim_interface.json b/Common/src/main/resources/assets/tardim_ic/blockstates/digital_tardim_interface.json new file mode 100644 index 0000000..e396b0d --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/blockstates/digital_tardim_interface.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tardim_ic:block/digital_tardim_interface" + } + } +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/blockstates/redstone_tardim_input.json b/Common/src/main/resources/assets/tardim_ic/blockstates/redstone_tardim_input.json new file mode 100644 index 0000000..a5718cc --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/blockstates/redstone_tardim_input.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "tardim_ic:block/redstone_tardim_input" + } + } +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/icon.png b/Common/src/main/resources/assets/tardim_ic/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..87a18cf4f8ffad2aaf26e4d5ade5cf9c71955d97 GIT binary patch literal 74055 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

&IIJ>xYh|NS(21R`O(-VhguK5uaXP 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 literal 0 HcmV?d00001 diff --git a/Common/src/main/resources/assets/tardim_ic/lang/en_uk.json b/Common/src/main/resources/assets/tardim_ic/lang/en_uk.json new file mode 100644 index 0000000..4d99f9d --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/lang/en_uk.json @@ -0,0 +1,5 @@ +{ + "block.tardim_ic.digital_tardim_interface": "Digital TARDIM Interface", + "block.tardim_ic.redstone_tardim_input": "Redstone TARDIM Input", + "itemGroup.tardim_ic": "TARDIM: In Control" +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/lang/en_us.json b/Common/src/main/resources/assets/tardim_ic/lang/en_us.json new file mode 100644 index 0000000..4d99f9d --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/lang/en_us.json @@ -0,0 +1,5 @@ +{ + "block.tardim_ic.digital_tardim_interface": "Digital TARDIM Interface", + "block.tardim_ic.redstone_tardim_input": "Redstone TARDIM Input", + "itemGroup.tardim_ic": "TARDIM: In Control" +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/lang/rpr.json b/Common/src/main/resources/assets/tardim_ic/lang/rpr.json new file mode 100644 index 0000000..d28a924 --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/lang/rpr.json @@ -0,0 +1,5 @@ +{ + "block.tardim_ic.digital_tardim_interface": "Циферный Интерфейсъ Хронобудки", + "block.tardim_ic.redstone_tardim_input": "Краснокаменный Инпутъ Хронобудки", + "itemGroup.tardim_ic": "ТАРДИМЪ: Подъ Контрольемъ" +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/lang/ru_ru.json b/Common/src/main/resources/assets/tardim_ic/lang/ru_ru.json new file mode 100644 index 0000000..09b05b1 --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/lang/ru_ru.json @@ -0,0 +1,5 @@ +{ + "block.tardim_ic.digital_tardim_interface": "Цифровой интерфейс TARDIM", + "block.tardim_ic.redstone_tardim_input": "Редстоуновый ввод TARDIM", + "itemGroup.tardim_ic": "TARDIM: In Control" +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json b/Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json new file mode 100644 index 0000000..d5fccbf --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json @@ -0,0 +1,213 @@ +{ + "credit": "Made with Blockbench", + "parent": "digital_tardim_interface", + "texture_size": [64, 64], + "textures": { + "1": "tardim_ic:blocks/digital_tardim_interface", + "particle": "tardim_ic:blocks/digital_tardim_interface" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [4, 4, 8, 7.5], "texture": "#1"}, + "east": {"uv": [0, 4, 4, 7.5], "texture": "#1"}, + "south": {"uv": [12, 4, 16, 7.5], "texture": "#1"}, + "west": {"uv": [8, 4, 12, 7.5], "texture": "#1"}, + "up": {"uv": [8, 4, 4, 0], "texture": "#1"}, + "down": {"uv": [12, 0, 8, 4], "texture": "#1"} + } + }, + { + "from": [5, 14, 5], + "to": [11, 16, 11], + "faces": { + "north": {"uv": [1.5, 9, 3, 9.5], "texture": "#1"}, + "east": {"uv": [0, 9, 1.5, 9.5], "texture": "#1"}, + "south": {"uv": [4.5, 9, 6, 9.5], "texture": "#1"}, + "west": {"uv": [3, 9, 4.5, 9.5], "texture": "#1"}, + "up": {"uv": [3, 9, 1.5, 7.5], "texture": "#1"}, + "down": {"uv": [4.5, 7.5, 3, 9], "texture": "#1"} + } + }, + { + "from": [11, 14, 7], + "to": [14, 16, 9], + "faces": { + "north": {"uv": [12.5, 0.5, 13.25, 1], "texture": "#1"}, + "east": {"uv": [12, 0.5, 12.5, 1], "texture": "#1"}, + "south": {"uv": [13.75, 0.5, 14.5, 1], "texture": "#1"}, + "west": {"uv": [13.25, 0.5, 13.75, 1], "texture": "#1"}, + "up": {"uv": [13.25, 0.5, 12.5, 0], "texture": "#1"}, + "down": {"uv": [14, 0, 13.25, 0.5], "texture": "#1"} + } + }, + { + "from": [12.5, 14, 3.5], + "to": [12.5, 15, 12.5], + "faces": { + "north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "south": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "west": {"uv": [13, 3.75, 15.25, 4], "texture": "#1"}, + "up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"} + } + }, + { + "from": [3.5, 14, 12.5], + "to": [12.5, 15, 12.5], + "faces": { + "north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "south": {"uv": [12.5, 3.75, 14.75, 4], "texture": "#1"}, + "west": {"uv": [13.5, 3.75, 15.75, 4], "texture": "#1"}, + "up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"} + } + }, + { + "from": [3.5, 14, 3.5], + "to": [12.5, 15, 3.5], + "faces": { + "north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "south": {"uv": [12.5, 3.75, 14.75, 4], "texture": "#1"}, + "west": {"uv": [13.5, 3.75, 15.75, 4], "texture": "#1"}, + "up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"} + } + }, + { + "from": [3.5, 14, 3.5], + "to": [3.5, 15, 12.5], + "faces": { + "north": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "east": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "south": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "west": {"uv": [13, 3.75, 15.25, 4], "texture": "#1"}, + "up": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"}, + "down": {"uv": [12, 3.75, 14.25, 4], "texture": "#1"} + } + }, + { + "from": [2, 14, 7], + "to": [5, 16, 9], + "faces": { + "north": {"uv": [5, 8, 5.75, 8.5], "texture": "#1"}, + "east": {"uv": [4.5, 8, 5, 8.5], "texture": "#1"}, + "south": {"uv": [6.25, 8, 7, 8.5], "texture": "#1"}, + "west": {"uv": [5.75, 8, 6.25, 8.5], "texture": "#1"}, + "up": {"uv": [5.75, 8, 5, 7.5], "texture": "#1"}, + "down": {"uv": [6.5, 7.5, 5.75, 8], "texture": "#1"} + } + }, + { + "from": [7, 14, 2], + "to": [9, 16, 5], + "faces": { + "north": {"uv": [3.25, 12.5, 3.75, 13], "texture": "#1"}, + "east": {"uv": [2.5, 12.5, 3.25, 13], "texture": "#1"}, + "south": {"uv": [4.5, 12.5, 5, 13], "texture": "#1"}, + "west": {"uv": [3.75, 12.5, 4.5, 13], "texture": "#1"}, + "up": {"uv": [3.75, 12.5, 3.25, 11.75], "texture": "#1"}, + "down": {"uv": [4.25, 11.75, 3.75, 12.5], "texture": "#1"} + } + }, + { + "from": [7, 14, 11], + "to": [9, 16, 14], + "faces": { + "north": {"uv": [0.75, 12.5, 1.25, 13], "texture": "#1"}, + "east": {"uv": [0, 12.5, 0.75, 13], "texture": "#1"}, + "south": {"uv": [2, 12.5, 2.5, 13], "texture": "#1"}, + "west": {"uv": [1.25, 12.5, 2, 13], "texture": "#1"}, + "up": {"uv": [1.25, 12.5, 0.75, 11.75], "texture": "#1"}, + "down": {"uv": [1.75, 11.75, 1.25, 12.5], "texture": "#1"} + } + }, + { + "from": [6, 13, -2], + "to": [10, 17, 2], + "faces": { + "north": {"uv": [10, 9.5, 11, 10.5], "texture": "#1"}, + "east": {"uv": [9, 9.5, 10, 10.5], "texture": "#1"}, + "south": {"uv": [12, 9.5, 13, 10.5], "texture": "#1"}, + "west": {"uv": [11, 9.5, 12, 10.5], "texture": "#1"}, + "up": {"uv": [11, 9.5, 10, 8.5], "texture": "#1"}, + "down": {"uv": [12, 8.5, 11, 9.5], "texture": "#1"} + } + }, + { + "from": [6, 13, 14], + "to": [10, 17, 18], + "faces": { + "north": {"uv": [7, 8.5, 8, 9.5], "texture": "#1"}, + "east": {"uv": [6, 8.5, 7, 9.5], "texture": "#1"}, + "south": {"uv": [9, 8.5, 10, 9.5], "texture": "#1"}, + "west": {"uv": [8, 8.5, 9, 9.5], "texture": "#1"}, + "up": {"uv": [8, 8.5, 7, 7.5], "texture": "#1"}, + "down": {"uv": [9, 7.5, 8, 8.5], "texture": "#1"} + } + }, + { + "from": [-2, 13, 6], + "to": [2, 17, 10], + "faces": { + "north": {"uv": [1, 3, 2, 4], "texture": "#1"}, + "east": {"uv": [0, 3, 1, 4], "texture": "#1"}, + "south": {"uv": [3, 3, 4, 4], "texture": "#1"}, + "west": {"uv": [2, 3, 3, 4], "texture": "#1"}, + "up": {"uv": [2, 3, 1, 2], "texture": "#1"}, + "down": {"uv": [3, 2, 2, 3], "texture": "#1"} + } + }, + { + "from": [14, 13, 6], + "to": [18, 17, 10], + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#1"}, + "east": {"uv": [0, 1, 1, 2], "texture": "#1"}, + "south": {"uv": [3, 1, 4, 2], "texture": "#1"}, + "west": {"uv": [2, 1, 3, 2], "texture": "#1"}, + "up": {"uv": [2, 1, 1, 0], "texture": "#1"}, + "down": {"uv": [3, 0, 2, 1], "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -1.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -1.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [-1.25, 0, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [3.75, -1.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, -0.5, 0], + "scale": [0.35, 0.35, 0.35] + }, + "gui": { + "rotation": [33, 45, 0], + "scale": [0.6, 0.6, 0.6] + }, + "head": { + "translation": [0, 0.75, 0], + "scale": [1.1, 1.1, 1.1] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, 4.25] + } + } +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json b/Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json new file mode 100644 index 0000000..a133d12 --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json @@ -0,0 +1,36 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/cube_all", + "ambientocclusion": false, + "textures": { + "1": "tardim_ic:blocks/red_contr", + "2": "tardim_ic:blocks/red_contr2", + "particle": "tardim_ic:blocks/red_contr" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [-0.325, -0.35, -0.35], + "to": [16.35, 16.525, 16.275], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + } + ] +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/models/item/digital_tardim_interface.json b/Common/src/main/resources/assets/tardim_ic/models/item/digital_tardim_interface.json new file mode 100644 index 0000000..256cd83 --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/models/item/digital_tardim_interface.json @@ -0,0 +1,23 @@ +{ + "parent": "tardim_ic:block/digital_tardim_interface", + "display": { + "thirdperson_righthand": { + "rotation": [ 75, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ], + "translation": [ 0, 1, 0 ] + }, + "thirdperson_lefthand": { + "rotation": [ 75, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ], + "translation": [ 0, 1, 0 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + } +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/models/item/redstone_tardim_input.json b/Common/src/main/resources/assets/tardim_ic/models/item/redstone_tardim_input.json new file mode 100644 index 0000000..4a3e535 --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/models/item/redstone_tardim_input.json @@ -0,0 +1,23 @@ +{ + "parent": "tardim_ic:block/redstone_tardim_input", + "display": { + "thirdperson_righthand": { + "rotation": [ 75, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ], + "translation": [ 0, 1, 0 ] + }, + "thirdperson_lefthand": { + "rotation": [ 75, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ], + "translation": [ 0, 1, 0 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + } +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/digital_tardim_interface.png b/Common/src/main/resources/assets/tardim_ic/textures/blocks/digital_tardim_interface.png new file mode 100644 index 0000000000000000000000000000000000000000..d430bc6ddaadb8099d1287982091a014fc1e3c84 GIT binary patch literal 1705 zcmV;a23GlrP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1|&&DK~#8N?VI0g zTtyVeXP0JolbUp!wh2jtZ9)`(6a!K*6)E^olz;^C7*IhU6;XV!FDmGR`XKhf;*$mc zfjn3UMM1$-jA$Ba8x;*rt8HSECSCJ;v*PM^_I@|#&d%NJ-o354a6d52oO5Sx?m6>& zW)o8eeSLlTR4S!5Ha4`pxVWgY*{n(?lUg1f9d(uI@9)neZm6%s83zUiTn?C; zno^san>w9HB-Hr$c!>itx0coF+M1(rlg$>&CX)#rlidvsD!sQ+JK*QbTTa>EvP<2Z z`&-8n>JXFrkJJ|(@X_f{bVXF_fVdMEq2WNLVLV%bi8LMt%K%`!lo6W_gE0sPTIy8q zQ~Oo-!)aHb4l#ns_1~{KsV%-f|3e;u&aqMA006^jJd7@9yaa}sHNCl+EgBAF8nC$| zMoU1LypXYm(Q`L-AZAzj=BxAS$BP#oN$K>*r%qd)Lt7MSx>gBdMH9wcrwF~3E*mp=jGsg;!F(($TsVAQ8P?ygAsap%XfM4Rv z%gfpj#Ke?sdFJQmom2rDMWapQflY^6l>Hi9p7>Q=x$=iAKt~!{Q@V`V0{jrq<#I*C zykdaa07xCu9QDnnT@EuZ1~-i8fHel*|Gc z++=|9SO=iir6X)`kShoCm^I5Tz`+hQ?@jAK_-x@)M#n)=^E!a5Jhp;LoB)uYWz9hl zEZ)kvf&|X8mGMKM>i~dmU^;;^V>%1K7;`{->}ZcQNaVm-3pK9;>gwv$jT^I$cB^Td zj)2j4CgXz#Th+VA|Izb5R(D+Fc#ZI^b>>CJa3)^N$8f+uz&5&QT1DtfxK+f-`45YK5Z*6UL zqyk>sVh(sgZ--y~w%~Yf+0B{Crjx|5{Y8TPJDn~}JCNDW5fjLnOh)TWJqTNQ?Eos6 z0YH{r!N$tUit6m_EWQwgt$eWy_-#U*9>ZEbcIL#f{N(&yj;PesefvDu=;+6tzbrVC zQr!nubR6dLvDwd`ah;aDawg~6dP|?@ zE=Oep%a$zs;+6%1B7DiAY7dA32^O%IOd_39Y?h_I&W4%Dx zu$R{@fG=5}+bFK&u#}Yn;2H7&`G>!wK)62_uzAr38Wq$#D@f(k< z>Ln;%kZLM;H_YWr98lkq(xDu2C(3j+2d_cm z=>S`8S5iYT9=EjeMiyz@($X<_H{TDV|1aZ#XMe*v!OYBzBNb?CYpc4C)_Uq}rh^_c z%60)9c*1A|r2X_!^lf~+Je@IRTOOV|!+05j9y4NtgM+$X(!=;8)6>(ctE)@vYSn{U zPMwj)IUnDRRtX2N+tl0wY*2at<9M=6V@(-I9iS}V9rT!SN9Wv1sCCR3 z9v-gBrfsLeI}K_dhOiX?Q?})?-BeY=j&lH-Jq`1U0lFEGI+?DN9p?Z5C&=-@CIhJh zlp`V{A|m{NZ7Y6u?uednYwL)i#x)I=JIIh=TWjw5!%E3I08ZEr?C;C{0y|8^(Cle6 z|It7;Z&Qbwf9b^+w9fB8DeNTT=4lNWKKogT4r%kZ_eh(+(T|9Th=_=Yh=_=Yh}iik z^)F-=&938G(BJ?701jnXNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjfqSh>V literal 0 HcmV?d00001 diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png b/Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed7480114230ca6714002b13cea361a0d29323f GIT binary patch literal 927 zcmV;Q17Q4#P)0I%zU9o$*B%cjjeg3{AQXJ*#`)`=5L7 zIrscH*OyMGMMNpJGW9(*Gr}%VCxpW0YNY}*zQl~Hf|7Cen#$LAg9Ud{nd&G%jU z<8wfbk2;Q1F9-rU%GP)UI1)2~bNkP82od4^4^3!|FKU?)#@}?}$({)jiOzhI|N1m= z?bgeBhpi*kPedg1Fas>+@-N2Pfl_g?Apzw;uuu+wtLL_D+Y7dcw4b@M21==+j{p;@ zZbsPk8)3I48Ul*hl88+Ab}OX@r#1$@dH^`zTy-3$m@NS<(U7+Tv3LkjN;${7Oc+T1 z0)WX|uj{q7pqeGm-c9^$bVeXYr~Z(mQ(xSc#+Oc~b-1w~FK<&CwdD_2B$W5;Njb@X}}s8)tg*6ng;VpJWTg?i^$!JcV<7m1#si~4m{{V=3yrB zTmo>`-G&5g!^6yN5$XBz9Y85%4)p^&^Pt8@=RX?(5(}4h#e;LaOE39r>a-p_<6*Dy z@aM>@)bVil;+-9MNR9tQ9SluO8~_$``Gy3P1Acu|+HBkIo4E~i6e_;I{#Ht5P7Ir- z=?RRm8?5q>trWAR`yzu=8yAkIxpCcDcg>;xo9?w^nUh7I$HQhb4+BXDOpk|SnUi|3 zr+D}eOo4P){gjs30000EWmrjOO-%qQ00008000000002eQ=0.14", + "fabric": "*", + "minecraft": "1.19.x", + "java": ">=17" + }, + "suggests": { + "another-mod": "*" + } + } + \ No newline at end of file diff --git a/Fabric/src/main/resources/modid.mixins.json b/Fabric/src/main/resources/modid.mixins.json new file mode 100644 index 0000000..77cce1a --- /dev/null +++ b/Fabric/src/main/resources/modid.mixins.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.example.examplemod.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + "ExampleMixin" + ], + "injectors": { + "defaultRequire": 1 + } + } + diff --git a/Forge/build.gradle b/Forge/build.gradle new file mode 100644 index 0000000..cb60d3f --- /dev/null +++ b/Forge/build.gradle @@ -0,0 +1,108 @@ +buildscript { + repositories { + maven { url = 'https://maven.minecraftforge.net' } + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + } +} +apply plugin: 'java' +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'eclipse' +apply plugin: 'maven-publish' + +archivesBaseName = "${mod_name}-forge-${minecraft_version}" + +minecraft { + mappings channel: 'official', version: minecraft_version + + if (project.hasProperty('forge_ats_enabled') && project.findProperty('forge_ats_enabled').toBoolean()) { + // This location is hardcoded in Forge and can not be changed. + // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + project.logger.debug('Forge Access Transformers are enabled for this project.') + } + + runs { + client { + workingDirectory project.file('run') + ideaModule "${rootProject.name}.${project.name}.main" + taskName 'Client' + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + mods { + modClientRun { + source sourceSets.main + source project(":Common").sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + ideaModule "${rootProject.name}.${project.name}.main" + taskName 'Server' + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + mods { + modServerRun { + source sourceSets.main + source project(":Common").sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + ideaModule "${rootProject.name}.${project.name}.main" + args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + taskName 'Data' + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + mods { + modDataRun { + source sourceSets.main + source project(":Common").sourceSets.main + } + } + } + } +} + +sourceSets.main.resources.srcDir 'src/generated/resources' + +dependencies { + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + compileOnly project(":Common") + + implementation fg.deobf("curse.maven:tardim-531315:3983700") + implementation fg.deobf("org.squiddev:cc-tweaked-1.19.1:${cc_version}") +} + +tasks.withType(JavaCompile) { + source(project(":Common").sourceSets.main.allSource) +} + +processResources { + from project(":Common").sourceSets.main.resources +} + + +jar.finalizedBy('reobfJar') + +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + artifact jar + } + } + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java new file mode 100644 index 0000000..d928b3f --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java @@ -0,0 +1,56 @@ +package su.a71.tardim_ic.tardim_ic; + +import com.google.common.collect.Sets; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceBlock; +import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceTileEntity; +import su.a71.tardim_ic.tardim_ic.redsone_input.RedstoneInputBlock; +import su.a71.tardim_ic.tardim_ic.redsone_input.RedstoneInputTileEntity; + +import java.util.function.Supplier; + +public class Registration { + + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, TardimInControl.MODID); + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TardimInControl.MODID); + public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, TardimInControl.MODID); + + public static final CreativeModeTab TARDIM_IC_TAB = new CreativeModeTab("tardim_ic") { + @Override + public ItemStack makeIcon() { + return new ItemStack(Registration.DIGITAL_TARDIM_INTERFACE.get()); + } + }; + + // Blocks + private static RegistryObject register(String name, Supplier block) { + RegistryObject registryObject = BLOCKS.register(name, block); + ITEMS.register(name, () -> new BlockItem(registryObject.get(), new Item.Properties().tab(TARDIM_IC_TAB))); + return registryObject; + } + public static final RegistryObject DIGITAL_TARDIM_INTERFACE = register("digital_tardim_interface", DigitalInterfaceBlock::new); + public static final RegistryObject REDSTONE_TARDIM_INPUT = register("redstone_tardim_input", RedstoneInputBlock::new); + + // Tile Entities + public static final RegistryObject> DIGITAL_TARDIM_INTERFACE_TILEENTITY = Registration.BLOCK_ENTITIES.register("digital_tardim_interface", () -> new BlockEntityType<>(DigitalInterfaceTileEntity::new, Sets.newHashSet(DIGITAL_TARDIM_INTERFACE.get()), null)); + public static final RegistryObject> REDSTONE_TARDIM_INPUT_TILEENTITY = Registration.BLOCK_ENTITIES.register("redstone_tardim_input", () -> new BlockEntityType<>(RedstoneInputTileEntity::new, Sets.newHashSet(REDSTONE_TARDIM_INPUT.get()), null)); + + // Register our stuff + public static void register() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + BLOCKS.register(modEventBus); + ITEMS.register(modEventBus); + BLOCK_ENTITIES.register(modEventBus); + } +} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java new file mode 100644 index 0000000..6e31198 --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java @@ -0,0 +1,20 @@ +package su.a71.tardim_ic.tardim_ic; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Mod; + +import su.a71.tardim_ic.tardim_ic.Constants; + +// The value here should match an entry in the META-INF/mods.toml file +@Mod(Constants.MOD_ID) +public class TardimInControl { + + // Our mod id + public static final String MODID = "tardim_ic"; + + public TardimInControl() { + Registration.register(); + // Register ourselves for server and other game events we are interested in. Currently, we do not use any events + MinecraftForge.EVENT_BUS.register(this); + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java new file mode 100644 index 0000000..db29663 --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java @@ -0,0 +1,70 @@ +package su.a71.tardim_ic.tardim_ic.command; + +// This will be added whenever I manage to convince TARDIM devs to make CommandManager.register public + +import com.mojang.brigadier.Command; +import com.swdteam.common.command.tardim.CommandTardimBase; +import com.swdteam.common.command.tardim.ICommand; +import com.swdteam.tardim.TardimData; +import com.swdteam.tardim.TardimManager; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; + +import dan200.computercraft.api.network.Packet; +import dan200.computercraft.api.ComputerCraftAPI; + +import static com.swdteam.common.command.tardim.CommandTardimBase.sendResponse; + +public class CommandModemTransmit implements ICommand { + @Override + public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) { + if (args.length == 3) { + TardimData data = TardimManager.getFromPos(pos); + if (data != null) { + if (data.hasPermission(player)) { + try { + int sendChannel = Integer.parseInt(args[0]); + int replyChannel = Integer.parseInt(args[1]); + String message = args[2]; + boolean allDimensions = Boolean.parseBoolean(args[3]) || args[3].equals("true"); + + if (data.getTravelLocation() == null) { + data.setTravelLocation(new TardimData.Location(data.getCurrentLocation())); + } + + if (allDimensions) + { + ComputerCraftAPI.getWirelessNetwork().transmitInterdimensional(new Packet(sendChannel, replyChannel, message, new CommandSender(player, data.getTravelLocation().getPos()))); + } + else { + ComputerCraftAPI.getWirelessNetwork().transmitSameDimension(new Packet(sendChannel, replyChannel, message, + new CommandSender(player, data.getTravelLocation().getPos())), 300); + } + sendResponse(player, "Sent modem message", CommandTardimBase.ResponseType.COMPLETE, source); + } catch (Exception var9) { + sendResponse(player, "Invalid coordinates", CommandTardimBase.ResponseType.FAIL, source); + } + } else { + sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source); + } + } + } else { + sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source); + } + } + + @Override + public String getCommandName() { + return "ccModemTransmit"; + } + + @Override + public String getUsage() { + return "ccModemTransmit "; + } + + @Override + public CommandTardimBase.CommandSource allowedSource() { + return CommandTardimBase.CommandSource.BOTH; + } +} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java new file mode 100644 index 0000000..aec340f --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java @@ -0,0 +1,40 @@ +package su.a71.tardim_ic.tardim_ic.command; + +import dan200.computercraft.api.network.IPacketSender; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; + +public class CommandSender implements IPacketSender { + + private final Player player; + private final Level level; + private final BlockPos pos; + + CommandSender(Player player, BlockPos pos) { + this.player = player; + this.level = player.level; + this.pos = pos; + } + + @NotNull + @Override + public Level getLevel() { + return this.level; + } + + @NotNull + @Override + public Vec3 getPosition() { + return new Vec3(this.pos.getX(), this.pos.getY(), this.pos.getZ()); + } + + @NotNull + @Override + public String getSenderID() { + return this.player.getName().getString(); + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java new file mode 100644 index 0000000..bb51307 --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java @@ -0,0 +1,26 @@ +package su.a71.tardim_ic.tardim_ic.digital_interface; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import org.jetbrains.annotations.NotNull; +import su.a71.tardim_ic.tardim_ic.Registration; + +import javax.annotation.Nullable; + + +public class DigitalInterfaceBlock extends Block implements EntityBlock { + + public DigitalInterfaceBlock() { + super(Properties.of(Material.METAL).strength(2, 4).noOcclusion()); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { + return Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY.get().create(pos, state); + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java new file mode 100644 index 0000000..36cb34b --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java @@ -0,0 +1,727 @@ +package su.a71.tardim_ic.tardim_ic.digital_interface; + +import com.mojang.datafixers.util.Pair; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.server.players.PlayerList; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.server.ServerLifecycleHooks; + +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.api.lua.ObjectLuaTable; +import dan200.computercraft.api.lua.LuaException; + +// TODO: Fabric and Forge diffirence? (Bottom: Fabric) +import com.swdteam.tardim.TardimData; +import com.swdteam.tardim.TardimManager; +import com.swdteam.tardim.TardimData.Location; +//import com.swdteam.tardim.tardim.TardimManager; +//import com.swdteam.tardim.tardim.TardimData; + +import com.swdteam.common.command.tardim.CommandTravel; +import com.swdteam.common.data.DimensionMapReloadListener; +import com.swdteam.common.init.TRDSounds; +import com.swdteam.common.item.ItemTardim; +import com.swdteam.main.Tardim; + + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; + + +public class DigitalInterfacePeripheral implements IPeripheral { + + private final List connectedComputers = new ArrayList<>(); // List of computers connected to the peripheral + private final DigitalInterfaceTileEntity tileEntity; // Peripheral's BlockEntity, used for accessing coordinates + + /** + * @param tileEntity the tile entity of this peripheral + * @hidden + */ + public DigitalInterfacePeripheral(DigitalInterfaceTileEntity tileEntity) { + this.tileEntity = tileEntity; + } + + /** Setting name for the peripheral. A computer will see it as "digital_tardim_interface_n" + * @hidden + */ + @Nonnull + @Override + public String getType() { return "digital_tardim_interface"; } + + /** Apparently CC uses this to check if the peripheral in front of a modem is this one + * @hidden + * @param iPeripheral The peripheral to compare against. This may be {@code null}. + * @return {@code true} if the peripheral is the same as this one. + */ + @Override + public boolean equals(@Nullable IPeripheral iPeripheral) { return this == iPeripheral; } + + /** Called when a computer disconnects from the peripheral + * @hidden + * @param computer The interface to the computer that is being detached. Remember that multiple computers can be + * attached to a peripheral at once. + */ + @Override + public void detach(@Nonnull IComputerAccess computer) { connectedComputers.remove(computer); } + + /** Called when a computer connects to the peripheral + * @hidden + * @param computer The interface to the computer that is being attached. Remember that multiple computers can be + * attached to a peripheral at once. + */ + @Override + public void attach(@Nonnull IComputerAccess computer) { connectedComputers.add(computer); } + + /** + * I *think* I use this to get peripheral's world position + * @hidden + * @return + */ + public DigitalInterfaceTileEntity getTileEntity() { + return tileEntity; + } + + + /** + * Get TARDIM's data, which we need for *every* function + *

+ * We can't do a simple + * TardimManager.getFromPos(getTileEntity().getPos()) + *

+ * because if someone attempts to call a method outside a TARDIM, this would create a new TARDIM/Point to the one with ID of 0 (Due to the way TardimSaveHandler.loadTardisData works). + * Which is obviously not what we want. + *

+ * So instead we use this, and get the ability to give user a LuaException if they think that fiddling with time is funny + * This is mostly a copy of getIDForXZ function with some added checks + * + * @return TardimData of the TARDIM that the peripheral is in + * @throws LuaException if the peripheral is not in a TARDIM + * @hidden + */ + public TardimData getTardimData() throws LuaException { + int X = getTileEntity().getPos().getX(), Z = getTileEntity().getPos().getZ(); + + int index = 0; + int x = 0; + int y = 0; + int dx = 0; + int dy = 1; + int segment_length = 1; + int segment_passed = 0; + boolean found = false; + long timecheck = System.currentTimeMillis(); + + while(true) { + if (System.currentTimeMillis() - timecheck > 10000L) { + System.out.println("Finding ID from XZ Coordinates is taking too long!"); + break; + } + + if (X >= x * TardimManager.INTERIOR_BOUNDS + && X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS + && Z >= y * TardimManager.INTERIOR_BOUNDS + && Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) { + found = true; + break; + } + + x += dx; + y += dy; + if (++segment_passed == segment_length) { + segment_passed = 0; + int buffer = dy; + dy = -dx; + dx = buffer; + if (buffer == 0) { + ++segment_length; + } + } + + ++index; + } + + // We really don't want to access a ghost TARDIM, do we? + if (!found) { + throw new LuaException("Peripheral is not inside a TARDIM"); + } + TardimData T = TardimManager.getTardim(index); + if (T.getCurrentLocation() == null || T.getOwnerName() == null) { + throw new LuaException("Peripheral is not inside a TARDIM"); + } + + return T; + } + + // Peripheral methods =============================================================== + + /** + * Return how much fuel is left in the TARDIM + * + * @return Fuel left (Out of 100) + */ + @LuaFunction(mainThread = true) + public final double getFuel() throws LuaException { + return getTardimData().getFuel(); + } + + /** + * Get how much fuel it would take to travel to the destination + * @return Amount of fuel needed (Out of 100) + */ + @LuaFunction(mainThread = true) + public final double calculateFuelForJourney() throws LuaException { + TardimData data = getTardimData(); + + if (data.getTravelLocation() == null) return 0; + + Location curr = data.getCurrentLocation(); + Location dest = data.getTravelLocation(); + + double fuel = 0.0; + + if (curr.getLevel() != dest.getLevel()) + { + fuel = 10.0; + } + + Vec3 posA = new Vec3(curr.getPos().getX(), curr.getPos().getY(), curr.getPos().getZ()); + Vec3 posB = new Vec3(dest.getPos().getX(), dest.getPos().getY(), dest.getPos().getZ()); + fuel += posA.distanceTo(posB) / 100.0; + if (fuel > 100.0) fuel = 100.0; + + return fuel; + } + + /** + * Check whether the TARDIM is locked + * @return true if locked, false if not + */ + @LuaFunction(mainThread = true) + public final boolean isLocked() throws LuaException { + return getTardimData().isLocked(); + } + + /** + * Check whether the TARDIM is in flight + * @return true if in flight, false if not + */ + @LuaFunction(mainThread = true) + public final boolean isInFlight() throws LuaException { return getTardimData().isInFlight(); } + + /** + * Supposedly gets UNIX timestamp of when we entered flight + * @return UNIX timestamp if in flight, -1 if not + */ + @LuaFunction(mainThread = true) + public final long getTimeEnteredFlight() throws LuaException { + TardimData data = getTardimData(); + if (!data.isInFlight()) { + return -1; + } + return data.getTimeEnteredFlight(); + } + + /** + * Get username of the TARDIM's owner + * @return String of the owner's username + */ + @LuaFunction(mainThread = true) + public final String getOwnerName() throws LuaException { + TardimData data = getTardimData(); + return data.getOwnerName(); + } + + /** + * Lock/unlock the TARDIM + * @param locked true to lock, false to unlock + */ + @LuaFunction(mainThread = true) + public final void setLocked(boolean locked) throws LuaException { + getTardimData().setLocked(locked); + } + + /** + * Get the current location of the TARDIM + * @return ObjectLuaTable of the current location with the following keys: + *

+ */ + @LuaFunction(mainThread = true) + public final ObjectLuaTable getCurrentLocation() throws LuaException { + Location loc = getTardimData().getCurrentLocation(); + return new ObjectLuaTable(Map.of( + "dimension", loc.getLevel().location().toString(), + "pos", new ObjectLuaTable(Map.of( + "x", loc.getPos().getX(), + "y", loc.getPos().getY(), + "z", loc.getPos().getZ() + )), + "facing", loc.getFacing().toString() + )); + } + + /** + * Get the current location of the TARDIM + * @return if there is no destination returns null. + *

+ * Otherwise, ObjectLuaTable of the current location with the following keys: + *

    + *
  • dimension - String of the dimension
  • + *
  • pos - table with the keys x, y, z that hold numbers
  • + *
  • facing - String of the facing
  • + *
+ */ + @LuaFunction(mainThread = true) + public final ObjectLuaTable getTravelLocation() throws LuaException { + TardimData data = getTardimData(); + if (data.getTravelLocation() == null) { + data.setTravelLocation(data.getCurrentLocation()); + } + Location loc = data.getTravelLocation(); + return new ObjectLuaTable(Map.of( + "dimension", loc.getLevel().location().toString(), + "pos", new ObjectLuaTable(Map.of( + "x", loc.getPos().getX(), + "y", loc.getPos().getY(), + "z", loc.getPos().getZ() + )), + "facing", loc.getFacing().toString() + )); + } + + /** + * Get list of the TARDIM owner's companions + * @return ObjectLuaTable containing the usernames of the companions + */ + @LuaFunction(mainThread = true) + public final ObjectLuaTable getCompanions() throws LuaException { + TardimData data = getTardimData(); + Map companions = new HashMap<>(); + for (int i = 0; i < data.getCompanions().size(); i++) { + companions.put(i + 1, data.getCompanions().get(i).getUsername()); + } + return new ObjectLuaTable(companions); + } + + /** + * Set dimension for the TARDIM to travel to + *

+ * This is a serious hazard right now due to the fact that I am unable to check if the dimension is valid. + *

+ * TODO: If invalid dimension is given, the TARDIM is unable to land until the dimension is changed. Add proper checks. + * @param dimension String of the dimension e.g. "minecraft:overworld" + */ + @LuaFunction(mainThread = true) + public final void setDimension(String dimension) throws LuaException { + TardimData data = getTardimData(); + + String key = dimension; + dimension = DimensionMapReloadListener.toTitleCase(dimension); + if (TardimManager.DIMENSION_MAP.containsKey(dimension)) { + key = (String)TardimManager.DIMENSION_MAP.get(dimension); + } else { + dimension = dimension.toLowerCase(); + } + + if (!CommandTravel.isValidPath(key)) { + throw new LuaException("Invalid dimension"); + } else { + ResourceKey dim = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(dimension)); + if (data.getTravelLocation() == null) { + data.setTravelLocation(new Location(data.getCurrentLocation())); + } + + data.getTravelLocation().setLocation(dim); + } + } + + /** + * Set the destination's coordinates + * @param x X coordinate + * @param y Y coordinate + * @param z Z coordinate + */ + @LuaFunction(mainThread = true) + public final void setTravelLocation(int x, int y, int z) throws LuaException { + TardimData data = getTardimData(); + if (data.getTravelLocation() == null) { + data.setTravelLocation(new Location(data.getCurrentLocation())); + } + + data.getTravelLocation().setPosition(x, y, z); + } + + + /** + * Set destination to the TARDIM's owner's home (Must be online) + */ + @LuaFunction(mainThread = true) + public final void home() throws LuaException { + TardimData data = getTardimData(); + + UUID uuid = data.getOwner(); + String username = data.getOwnerName(); + if (uuid == null || username == null) { + throw new LuaException("TARDIM has no owner"); + } + + PlayerList playerList = ServerLifecycleHooks.getCurrentServer().getPlayerList(); + ServerPlayer player = playerList.getPlayer(uuid); + if (player == null) { + throw new LuaException("TARDIM owner is not online"); + } + + ResourceKey dim = player.getRespawnDimension(); + BlockPos pos = player.getRespawnPosition(); + if (pos == null) { + throw new LuaException("TARDIM owner has no home"); + } + + setDimension(dim.location().toString()); + setTravelLocation(pos.getX(), pos.getY(), pos.getZ()); + } + + /** + * Set destination for a player's location (Player must be online) + * @param username - String of the username of the player + */ + @LuaFunction(mainThread = true) + public final void locatePlayer(String username) throws LuaException { + PlayerList playerList = ServerLifecycleHooks.getCurrentServer().getPlayerList(); + ServerPlayer player = playerList.getPlayerByName(username); + if (player == null) { + throw new LuaException("Player not found"); + } + + ResourceKey dim = player.getCommandSenderWorld().dimension(); + BlockPos pos = player.blockPosition(); + + setDimension(dim.location().toString()); + setTravelLocation(pos.getX(), pos.getY(), pos.getZ()); + } + + /** + * Get online players. Useful for making a GUI for the locate function or just a nice dashboard. + * + * @return ObjectLuaTable of the online players + */ + @LuaFunction(mainThread = true) + public final ObjectLuaTable getOnlinePlayers() throws LuaException { + PlayerList playerList = ServerLifecycleHooks.getCurrentServer().getPlayerList(); + Map players = new HashMap<>(); + for (int i = 0; i < playerList.getPlayers().size(); i++) { + players.put(i + 1, playerList.getPlayers().get(i).getGameProfile().getName()); + } + + return new ObjectLuaTable(players); + } + + /** + * Get the rotation of the TARDIM's door + * @return String of the door rotation ("north", "south", "east", "west") + */ + @LuaFunction(mainThread = true) + public final String getDoorRotation() throws LuaException { + TardimData data = getTardimData(); + Direction rotation = data.getTravelLocation().getFacing(); + switch (rotation) { + case NORTH -> { + return "north"; + } + case EAST -> { + return "east"; + } + case SOUTH -> { + return "south"; + } + case WEST -> { + return "west"; + } + default -> { + throw new LuaException("Invalid door rotation"); + } + } + } + + /** + * Set the rotation of the TARDIM's door + * @param rotation String of the door rotation ("north", "south", "east", "west") + */ + @LuaFunction(mainThread = true) + public final void setDoorRotation(String rotation) throws LuaException { + TardimData data = getTardimData(); + switch (rotation) { + case "north" -> data.getTravelLocation().setFacing(Direction.NORTH); + case "east" -> data.getTravelLocation().setFacing(Direction.EAST); + case "south" -> data.getTravelLocation().setFacing(Direction.SOUTH); + case "west" -> data.getTravelLocation().setFacing(Direction.WEST); + default -> throw new LuaException("Invalid door rotation"); + } + + data.save(); + } + + /** + * Toggle the rotation of the TARDIM's door (north -> east -> south -> west -> north) + */ + @LuaFunction(mainThread = true) + public final void toggleDoorRotation() throws LuaException { + TardimData data = getTardimData(); + if (data.getTravelLocation() == null) { + data.setTravelLocation(new Location(data.getCurrentLocation())); + } + + if (data.getTravelLocation().getFacing() == null) { + data.getTravelLocation().setFacing(Direction.NORTH); + } + + switch (data.getTravelLocation().getFacing()) { + case NORTH -> data.getTravelLocation().setFacing(Direction.EAST); + case EAST -> data.getTravelLocation().setFacing(Direction.SOUTH); + case SOUTH -> data.getTravelLocation().setFacing(Direction.WEST); + case WEST -> data.getTravelLocation().setFacing(Direction.NORTH); + default -> data.getTravelLocation().setFacing(Direction.NORTH); + } + + data.save(); + } + + /** + * Add a number to the destination's coordinates + * @param axis String of the axis ("x", "y", "z") + * @param amount Number to add to the axis + */ + @LuaFunction(mainThread = true) + public final void coordAdd(String axis, int amount) throws LuaException { + TardimData data = getTardimData(); + if (data.getTravelLocation() == null) { + data.setTravelLocation(new Location(data.getCurrentLocation())); + } + + Location location = data.getTravelLocation(); + switch (axis) { + case "x" -> location.addPosition(amount, 0, 0); + case "y" -> location.addPosition(0, amount, 0); + case "z" -> location.addPosition(0, 0, amount); + default -> throw new LuaException("Invalid axis"); + } + } + + /** + * Dematerialize the TARDIM + */ + @LuaFunction(mainThread = true) + public final void demat() throws LuaException { + TardimData data = getTardimData(); + + if (data.isInFlight()) { + throw new LuaException("TARDIM is already in flight"); + } + Location loc = data.getCurrentLocation(); + ServerLevel level = ServerLifecycleHooks.getCurrentServer().getLevel(loc.getLevel()); + ItemTardim.destroyTardim(level, loc.getPos(), Direction.NORTH); + data.setInFlight(true); + if (data.getTravelLocation() == null) { + data.setTravelLocation(new Location(data.getCurrentLocation())); + } + + // TODO: This is a horrendous way of doing this. Please fix. + String level_str = "tardim:tardis_dimension"; + ServerLifecycleHooks.getCurrentServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_TAKEOFF.get(), SoundSource.AMBIENT, 1.0F, 1.0F); + + data.save(); + } + + /** + * Materialize the TARDIM at the destination + *

+ * Has a LOT of checks to make sure the TARDIM can materialize, so please implement error handling if you use this. + */ + @LuaFunction(mainThread = true) + public final void remat() throws LuaException { + TardimData data = getTardimData(); + + if (data.isInFlight()) { + if (data.getTimeEnteredFlight() < System.currentTimeMillis() / 1000L - 10L) { + Location loc = data.getTravelLocation(); + ServerLevel level = ServerLifecycleHooks.getCurrentServer().getLevel(loc.getLevel()); + double fuel = data.calculateFuelForJourney( + ServerLifecycleHooks.getCurrentServer().getLevel(data.getCurrentLocation().getLevel()), level, data.getCurrentLocation().getPos(), loc.getPos() + ); + if (data.getFuel() >= fuel) { + level.getChunk(loc.getPos()); + BlockPos landingPosButBetter = CommandTravel.getLandingPosition(level, loc.getPos()); + boolean recalc = false; + + for(int jj = 0; jj < 32; ++jj) { + if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) { + BlockPos pos2 = landingPosButBetter.offset( + level.random.nextInt(10) * (level.random.nextBoolean() ? 1 : -1), + 0, + level.random.nextInt(10) * (level.random.nextBoolean() ? 1 : -1) + ); + landingPosButBetter = CommandTravel.getLandingPosition(level, pos2); + if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { + recalc = true; + break; + } + } + } + + if (!recalc) { + for(int jj = 0; jj < 32; ++jj) { + if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) { + BlockPos pos2 = landingPosButBetter.offset( + level.random.nextInt(30) * (level.random.nextBoolean() ? 1 : -1), + 0, + level.random.nextInt(30) * (level.random.nextBoolean() ? 1 : -1) + ); + landingPosButBetter = CommandTravel.getLandingPosition(level, pos2); + if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { + recalc = true; + break; + } + } + } + } + + if (!recalc) { + for(int jj = 0; jj < 32; ++jj) { + if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) { + BlockPos pos2 = landingPosButBetter.offset( + level.random.nextInt(50) * (level.random.nextBoolean() ? 1 : -1), + 0, + level.random.nextInt(50) * (level.random.nextBoolean() ? 1 : -1) + ); + landingPosButBetter = CommandTravel.getLandingPosition(level, pos2); + if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { + recalc = true; + break; + } + } + } + } + + if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { + loc.setPosition(landingPosButBetter.getX(), landingPosButBetter.getY(), landingPosButBetter.getZ()); + if (Tardim.isPosValid(level, loc.getPos())) { + ItemTardim.buildTardim(level, loc.getPos(), data.getTravelLocation().getFacing(), data.getId()); + data.setCurrentLocation(data.getTravelLocation()); + data.setTravelLocation(null); + data.setInFlight(false); + data.addFuel(-fuel); + data.save(); + +// if (!recalc) { +// sendResponse(player, "TARDIM is landing", CommandTardimBase.ResponseType.COMPLETE, source); +// } else { +// sendResponse(player, "Landing recalculated due to obstruction", CommandTardimBase.ResponseType.INFO, source); +// sendResponse(player, "TARDIM is landing", CommandTardimBase.ResponseType.COMPLETE, source); +// } + + String level_str = "tardim:tardis_dimension"; + ServerLifecycleHooks.getCurrentServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_LANDING.get(), SoundSource.AMBIENT, 1.0F, 1.0F); + + } else { + throw new LuaException("TARDIM landing obstructed. Aborting..."); + } + } else { + throw new LuaException("TARDIM landing obstructed. Aborting..."); + } + } else { + throw new LuaException("Not enough fuel for journey"); + } + } else { + throw new LuaException("TARDIM is still taking off"); + } + } else { + throw new LuaException("TARDIM has already landed"); + } + } + + /** + * Locate a biome + * @param biome_str String of the biome e.g. "minecraft:plains" + */ + @LuaFunction(mainThread = true) + public final void locateBiome(String biome_str) throws LuaException { + TardimData data = getTardimData(); + if (data.getTravelLocation() == null) { + data.setTravelLocation(new Location(data.getCurrentLocation())); + } + + Optional biome = ServerLifecycleHooks.getCurrentServer() + .registryAccess() + .registryOrThrow(Registry.BIOME_REGISTRY) + .getOptional(new ResourceLocation(biome_str)); + if (biome != null && biome.isPresent()) { + if (data.getTravelLocation() == null) { + data.setTravelLocation(new Location(data.getCurrentLocation())); + } + + ServerLevel level = ServerLifecycleHooks.getCurrentServer().getLevel(data.getTravelLocation().getLevel()); + BlockPos blockpos = new BlockPos( + data.getTravelLocation().getPos().getX(), + level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, data.getTravelLocation().getPos()).getY(), + data.getTravelLocation().getPos().getZ() + ); + BlockPos blockpos1 = this.findNearestBiome(level, (Biome)biome.get(), blockpos, 6400, 8); + if (blockpos1 != null) { + data.getTravelLocation().setPosition(blockpos1.getX(), blockpos1.getY(), blockpos1.getZ()); + data.save(); + } else { + throw new LuaException("Biome not found"); + } + } else { + throw new LuaException("Unknown biome"); + } + } + + /** + * Helper method to find a biome + * @param level ServerLevel to search + * @param biome Biome to find + * @param pos BlockPos to start from + * @param i Idk what this is, likely a radius + * @param j No idea about this either + * @return BlockPos of the biome + * @hidden + */ + public BlockPos findNearestBiome(ServerLevel level, Biome biome, BlockPos pos, int i, int j) { + Pair> bb = level.getChunkSource() + .getGenerator() + .getBiomeSource() + .findBiomeHorizontal( + pos.getX(), + pos.getY(), + pos.getZ(), + i, + j, + b_val -> b_val.value() == biome, + level.random, + true, + level.getChunkSource().randomState().sampler() + ); + return bb != null && bb.getFirst() != null ? (BlockPos)bb.getFirst() : null; + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java new file mode 100644 index 0000000..a598d83 --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java @@ -0,0 +1,45 @@ +package su.a71.tardim_ic.tardim_ic.digital_interface; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import org.jetbrains.annotations.NotNull; +import su.a71.tardim_ic.tardim_ic.Registration; + +import dan200.computercraft.api.peripheral.IPeripheral; +import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL; + +public class DigitalInterfaceTileEntity extends BlockEntity { + + public DigitalInterfaceTileEntity(BlockPos pos, BlockState state) { + super(Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY.get(), pos, state); + } + + /** + * Our peripheral, we create a new peripheral for each new tile entity + */ + protected DigitalInterfacePeripheral peripheral = new DigitalInterfacePeripheral(this); + private LazyOptional peripheralCap; + public BlockPos getPos() { + return this.worldPosition; + } + + /** + * When a computer modem tries to wrap our block, the modem will call getCapability to receive our peripheral. + * Then we just simply return a {@link LazyOptional} with our Peripheral + */ + @Override + @NotNull + public LazyOptional getCapability(@NotNull Capability cap, Direction direction) { + if (cap == CAPABILITY_PERIPHERAL) { + if (peripheralCap == null) { + peripheralCap = LazyOptional.of(() -> peripheral); + } + return peripheralCap.cast(); + } + return super.getCapability(cap, direction); + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputBlock.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputBlock.java new file mode 100644 index 0000000..f1856bc --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputBlock.java @@ -0,0 +1,100 @@ +package su.a71.tardim_ic.tardim_ic.redsone_input; + +import com.swdteam.common.block.BlockBaseTardimPanel; + +import com.swdteam.common.init.TRDDimensions; +import com.swdteam.common.init.TRDSounds; +import com.swdteam.network.NetworkHandler; +import com.swdteam.network.packets.PacketOpenEditGui; +import com.swdteam.tardim.TardimData; +import com.swdteam.tardim.TardimManager; +import com.swdteam.tileentity.TileEntityBaseTardimPanel; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.DebugPackets; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.common.util.FakePlayerFactory; +import net.minecraftforge.server.ServerLifecycleHooks; +import org.jetbrains.annotations.NotNull; + +import su.a71.tardim_ic.tardim_ic.Registration; + +import javax.annotation.Nullable; + +public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBlock { + private boolean isPowered = false; + public RedstoneInputBlock() { + super(Properties.of(Material.METAL).strength(2, 4).noOcclusion()); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { + return Registration.REDSTONE_TARDIM_INPUT_TILEENTITY.get().create(pos, state); + } + + @Override + public InteractionResult use(BlockState blockState, Level w, BlockPos blockPos, Player player, InteractionHand hand, BlockHitResult p_60508_) { + if (!w.isClientSide) { + + w.playSound((Player)null, blockPos, (SoundEvent) TRDSounds.TARDIM_BEEP.get(), SoundSource.BLOCKS, 0.3F, 0.5F); + + BlockEntity be = w.getBlockEntity(blockPos); + if (be instanceof TileEntityBaseTardimPanel && w.dimension() == TRDDimensions.TARDIS) { + TardimData data = TardimManager.getFromPos(blockPos); + if (data != null && data.hasPermission(player)) { + NetworkHandler.sendTo((ServerPlayer)player, new PacketOpenEditGui(1, blockPos)); + return InteractionResult.CONSUME; + } + + player.displayClientMessage( + Component.literal("You do not have permission").withStyle(ChatFormatting.DARK_RED).withStyle(ChatFormatting.BOLD), true + ); + } + } + + return InteractionResult.CONSUME; + } + + public boolean canSurvive(BlockState blockState, LevelReader levelReader, BlockPos blockPos) { + return true; + } + + public void neighborChanged(BlockState blockState, Level level, BlockPos blockPos, Block block, BlockPos fromPos, boolean isMoving) { + DebugPackets.sendNeighborsUpdatePacket(level, blockPos); + + // get redstone signal + Direction direction = blockState.getValue(FACING); + int redstoneSignal = level.getSignal(blockPos, direction); + if (redstoneSignal > 0 && !isPowered) { + isPowered = true; + BlockEntity be = level.getBlockEntity(blockPos); + if (be instanceof TileEntityBaseTardimPanel && level.dimension() == TRDDimensions.TARDIS) { + TardimData data = TardimManager.getFromPos(blockPos); + if (data != null) { + if (((TileEntityBaseTardimPanel)be).hasCommand()) { + ((TileEntityBaseTardimPanel)be).execute(FakePlayerFactory.getMinecraft(ServerLifecycleHooks.getCurrentServer().getLevel(level.dimension()))); + } + } + } + + } else if (redstoneSignal == 0 && isPowered) + isPowered = false; + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputTileEntity.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputTileEntity.java new file mode 100644 index 0000000..c0af4fc --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redsone_input/RedstoneInputTileEntity.java @@ -0,0 +1,28 @@ +package su.a71.tardim_ic.tardim_ic.redsone_input; + +import com.swdteam.tileentity.TileEntityBaseTardimPanel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import org.jetbrains.annotations.NotNull; + +import com.swdteam.common.init.TRDTiles; + +import su.a71.tardim_ic.tardim_ic.Registration; +import com.swdteam.tileentity.TileEntityTardimScanner; +import com.swdteam.common.block.BlockTardimScanner; + + +public class RedstoneInputTileEntity extends TileEntityBaseTardimPanel { + public RedstoneInputTileEntity(BlockPos pos, BlockState state) { + super(Registration.REDSTONE_TARDIM_INPUT_TILEENTITY.get(), pos, state); + } + + + public BlockPos getPos() { + return this.worldPosition; + } +} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/sonic/SonicProbe.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/sonic/SonicProbe.java new file mode 100644 index 0000000..2a3cfe5 --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/sonic/SonicProbe.java @@ -0,0 +1,22 @@ +package su.a71.tardim_ic.tardim_ic.sonic; + +import net.minecraft.world.item.Item; + +import com.swdteam.tardim.TardimData; +import com.swdteam.tardim.TardimManager; + +import com.swdteam.client.gui.GuiCommandScreen; + +public class SonicProbe extends Item { + private TardimData tardim; + public SonicProbe(Properties properties) { + super(properties.stacksTo(1)); + } + + public void setTardim(TardimData tardim) { + this.tardim = tardim; + } + + // Add tile entity + +} diff --git a/Forge/src/main/resources/META-INF/mods.toml b/Forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..11913a0 --- /dev/null +++ b/Forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,46 @@ + +modLoader = "javafml" #mandatory +loaderVersion="[43,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +license = "All rights reserved" +[[mods]] #mandatory +# The modid of the mod +modId = "tardim_ic" #mandatory +version = "0.9" #mandatory +# A display name for the mod +displayName = "TARDIM: In Control" #mandatory +# The description text for the mod (multi line!) (#mandatory) +description = ''' + All of time and space, now automated. Control your TARDIM using ComputerCraft: Tweaked. +''' +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.tardim_ic]] #optional +# the modid of the dependency +modId = "forge" #mandatory +# Does this dependency have to exist - if not, ordering below must be specified +mandatory = true #mandatory +# The version range of the dependency +versionRange="[43,)" #mandatory +# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory +ordering = "NONE" +# Side this dependency is applied on - BOTH, CLIENT or SERVER +side = "BOTH" +# Here's another dependency +[[dependencies.tardim_ic]] +modId = "computercraft" +mandatory = true +versionRange = "1.95.3" +ordering = "NONE" +side = "BOTH" +[[dependencies.tardim_ic]] +modId = "tardim" +mandatory = true +versionRange = "1.1.3" +ordering = "NONE" +side = "BOTH" +[[dependencies.tardim_ic]] +modId = "minecraft" +mandatory = true +# This version range declares a minimum of the current minecraft version up to but not including the next major version +versionRange = "1.19.2" +ordering = "NONE" +side = "BOTH" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1329c2c --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# MultiLoader Template + +This project provides a Gradle project template that can compile mods for both Forge and Fabric using a common sourceset. This project does not require any third party libraries or dependencies. + +## Getting Started + +## IntelliJ IDEA +This guide will show how to import the MultiLoader Template into IntelliJ IDEA. The setup process is roughly equivalent to setting up Forge and Fabric independently and should be very familiar to anyone who has worked with their MDKs. + +1. Clone or download this repository to your computer. +2. Configure the project by editing the `group`, `mod_name`, `mod_author`, and `mod_id` properties in the `gradle.properties` file. You will also need to change the `rootProject.name` property in `settings.gradle`. +3. Open the template's root folder as a new project in IDEA. This is the folder that contains this README file and the gradlew executable. +4. If your default JVM/JDK is not Java 17 you will encounter an error when opening the project. This error is fixed by going to `File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JVM`and changing the value to a valid Java 17 JVM. You will also need to set the Project SDK to Java 17. This can be done by going to `File > Project Structure > Project SDK`. Once both have been set open the Gradle tab in IDEA and click the refresh button to reload the project. +5. Open the Gradle tab in IDEA if it has not already been opened. Navigate to `Your Project > Common > Tasks > vanilla gradle > decompile`. Run this task to decompile Minecraft. +6. Open the Gradle tab in IDEA if it has not already been opened. Navigate to `Your Project > Forge > Tasks > forgegradle runs > genIntellijRuns`. Run this task to set up run configurations for Forge. +7. Open your Run/Debug Configurations. Under the Application category there should now be options to run Forge and Fabric projects. Select one of the client options and try to run it. +8. Assuming you were able to run the game in step 7 your workspace should now be set up. + +### Eclipse +While it is possible to use this template in Eclipse it is not recommended. During the development of this template multiple critical bugs and quirks related to Eclipse were found at nearly every level of the required build tools. While we continue to work with these tools to report and resolve issues support for projects like these are not there yet. For now Eclipse is considered unsupported by this project. The development cycle for build tools is notoriously slow so there are no ETAs available. + +## Development Guide +When using this template the majority of your mod is developed in the Common project. The Common project is compiled against the vanilla game and is used to hold code that is shared between the different loader-specific versions of your mod. The Common project has no knowledge or access to ModLoader specific code, apis, or concepts. Code that requires something from a specific loader must be done through the project that is specific to that loader, such as the Forge or Fabric project. + +Loader specific projects such as the Forge and Fabric project are used to load the Common project into the game. These projects also define code that is specific to that loader. Loader specific projects can access all of the code in the Common project. It is important to remember that the Common project can not access code from loader specific projects. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c789a22 --- /dev/null +++ b/build.gradle @@ -0,0 +1,66 @@ +subprojects { + + apply plugin: 'java' + + java.toolchain.languageVersion = JavaLanguageVersion.of(17) + java.withSourcesJar() + java.withJavadocJar() + + jar { + from(rootProject.file("LICENSE")) { + rename { "${it}_${mod_name}" } + } + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : mod_author, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version' : project.jar.archiveVersion, + 'Implementation-Vendor' : mod_author, + 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + 'Timestamp' : System.currentTimeMillis(), + 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", + 'Built-On-Minecraft' : minecraft_version + ]) + } + } + + sourcesJar { + from(rootProject.file("LICENSE")) { + rename { "${it}_${mod_name}" } + } + } + + repositories { + + mavenCentral() + + maven { + name = 'Sponge / Mixin' + url = 'https://repo.spongepowered.org/repository/maven-public/' + } + + maven { + name = 'BlameJared Maven (CrT / Bookshelf)' + url = 'https://maven.blamejared.com' + } + + maven { url 'https://squiddev.cc/maven/' } + maven { url "https://cursemaven.com"} + } + + tasks.withType(JavaCompile).configureEach { + + it.options.encoding = 'UTF-8' + it.options.release = 17 + } + + // Disables Gradle's custom module metadata from being published to maven. The + // metadata includes mapped dependencies which are not reasonably consumable by + // other mod developers. + tasks.withType(GenerateModuleMetadata) { + + enabled = false + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ac39d09 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,28 @@ +# Project +version=0.9 +group=su.a71.tardim_ic + +# Common +minecraft_version=1.19.2 +common_runs_enabled=false +common_client_run_name=Common Client +common_server_run_name=Common Server + +# Forge +forge_version=43.1.30 +//forge_ats_enabled=true + +# Fabric +fabric_version=0.62.0+1.19.2 +fabric_loader_version=0.14.9 + +# Mod options +mod_name="TARDIM: In Control" +mod_author=Andrew_7_1 +mod_id=tardim_ic + +# Gradle +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false + +cc_version=1.100.9 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ae04661 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..b4f908a --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +ARGV=("$@") +eval set -- $DEFAULT_JVM_OPTS + +IFS=$' +' read -rd '' -a JAVA_OPTS_ARR <<< "$(echo $JAVA_OPTS | xargs -n1)" +IFS=$' +' read -rd '' -a GRADLE_OPTS_ARR <<< "$(echo $GRADLE_OPTS | xargs -n1)" + +exec "$JAVACMD" "$@" "${JAVA_OPTS_ARR[@]}" "${GRADLE_OPTS_ARR[@]}" "-Dorg.gradle.appname=$APP_BASE_NAME" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "${ARGV[@]}" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/scripts/basicTest.lua b/scripts/basicTest.lua new file mode 100644 index 0000000..0918304 --- /dev/null +++ b/scripts/basicTest.lua @@ -0,0 +1,12 @@ +-- This is a very basic test script +-- This basically just verifies the mod works + +local int = peripheral.find("digital_tardim_interface") +if int == nil then + error("No interface found") +end + +print(int.getOwnerName() .. "'s TARDIM") +print("FUEL: " .. int.getFuel() .. "/100") +print("IN FLIGHT? " .. int.isInFlight()) +print("IS LOCKED? " .. int.isLocked()) diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..299e94c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + maven { + name = 'Sponge Snapshots' + url = 'https://repo.spongepowered.org/repository/maven-public/' + } + } +} + +rootProject.name = 'tardim_ic' +include("Common", "Fabric", "Forge") \ No newline at end of file