diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 75fe2e0b1..12fd35338 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,7 +1,7 @@ name: Bug Report description: Report bugs and problems labels: ["bug", "needs review"] -projects: ["IntelligenceModding/2"] +projects: "IntelligenceModding/2" body: - type: markdown attributes: @@ -41,14 +41,14 @@ body: multiple: false options: - Own compiled build. - - 1.20.1-0.7.38r (Latest 1.20.1) - - 1.20.1-0.7.37r - - 1.20.1-0.7.36r - - 1.20.1-0.7.35b - - 1.19.2-0.7.34r (Latest 1.19.2) - - 1.19.2-0.7.33r - - 1.19.2-0.7.32r - - 1.19.2-0.7.31r + - 1.20.1-0.7.41r (Latest 1.20.1) + - 1.20.1-0.7.40r + - 1.20.1-0.7.39r + - 1.20.1-0.7.38r + - 1.19.2-0.7.37r (Latest 1.19.2) + - 1.19.2-0.7.36r + - 1.19.2-0.7.35r + - 1.19.2-0.7.34r - 1.18.2-0.7.31r (Latest 1.18.2) - 1.18.2-0.7.30r - 1.18.2-0.7.29r diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2e659f12e..77d36901d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ * **Please check if the PR fulfills these requirements** - [ ] The commit message are well described -- [ ] Docs have been added / updated (for features or maybe bugs which were noted). If not, please update the needed documentation [here](https://github.com/SirEndii/Advanced-Peripherals-Documentation/pulls). This is not mandatory +- [ ] Docs have been added / updated (for features or maybe bugs which were noted). If not, please update the needed documentation [here](https://github.com/SirEndii/Advanced-Peripherals-Documentation/pulls). Feel free to remove this check if you don't need it - [ ] All changes have fully been tested * **What kind of change does this PR introduce?** (Bug fix, feature, ...) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index cbe07dbd7..3e33d0adf 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -1,25 +1,13 @@ -name: build-and-test -run-name: Build and test the changes -on: [push, pull_request, workflow_dispatch] +name: Build and Test + +on: + workflow_dispatch: + push: + pull_request: + types: + - opened + - synchronize + jobs: - test: - name: Test - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - - name: Build with Gradle - run: ./gradlew check - build: - name: Build - runs-on: ubuntu-latest - needs: test - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - - name: Build with Gradle - run: ./gradlew build \ No newline at end of file + build-and-test: + uses: IntelligenceModding/actions/.github/workflows/build-and-test.yaml@master diff --git a/.gitignore b/.gitignore index 8fa3a9245..72bc08a3f 100644 --- a/.gitignore +++ b/.gitignore @@ -19,8 +19,9 @@ build # other eclipse -run +runs/ server +run # Files from Forge MDK forge*changelog.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index afbe5287e..0f841ca9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,56 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [1.20.4-0.7.42a] - 2024-12-22 + +### Fixed +- Fixed ME Bridge not connecting to AE2 grids +- Fixed some recipes +- Every energy, item or fluid interacting block should now work like the energy detector or some ME/RS functions +- Fixed that the inventory manager would not open the screen + +## [1.20.1-0.7.41r] - 2024-10-21 + +### Added +- Wandering Trader config + +### Changed +- Save the owner of the memory card to the inventory manager after a player places the card into the manager and clear the card after. Resolves a security issue where players could eventually steal memory cards from other players + +### Fixed +- [#660] Fixed that the inventory manager's `getItemInHand` function adds a blank nbt tag to the item +- [#636] Fixed that the automata's `useOnBlock` function will return PASS in some specific case +- [#645] Fixed that the inventory functions for the powah integration would always return nil +- Fixed that some entity operations don't have enough range +- [#642] Fixed that some powah integrations clashes with the generic energy peripheral from CC which disables some functions +- [#640] Fixed null pointer exception when invoking `getName` +- [#662] Use tick time instead of epoch time for our chunk manager, fixes an issue where chunks unload if some ticks are skipped (lag) + +## [1.20.1-0.7.40r] - 2024-06-11 + +### Added +- [Features/#43] Up/down versions of automata block functions using pitch and yaw - Thanks to @zyxkad +- [Features/#9] Added shift sneaking version of `useOnBlock` - Thanks to @zyxkad + +### Fixed +- [#582] Reworked the chunky turtle logic to fix several issues with them - Thanks to @zyxkad +- Fixed a crash with the ME Bridge while trying to iterate through storage busses without a connected storage block +- Fixed `isOnEnchantedSoil()` for the mana flower integration +- [#419] Fixed that the automata `digBlock` function does not use breaking directions the right way. Fixes several issues with hammers or other AOE tools. - Thanks to @zyxkad +- [#629] Fixed that placed blocks do not retain their custom block name when destroyed - Thanks to @WiggleWizzard +- [#621] Fixed that the `listCells` function for the ME Bridge does not search in third party drives - Thanks to @michele-grifa +- [#632] Fixed that the chat box allows sending chat messages with negative range - Thanks to @zyxkad +- [#619] Fixed that the chat box can spoof people to click message to run danger commands - Thanks to @zyxkad +- [#617] Fixed that sending invalid nbt data for some mod items through the chat box can cause a client crash - Thanks to @zyxkad +- [#603] Fixed that the note block integration does not trigger allays - Thanks to @zyxkad +- [#599] Fixed that turtle upgrades can't be equipped with custom NBT values - Thanks to @zyxkad +- [#595] Fixed that `scanEntities` does not include living entity fields - Thanks to @zyxkad +- [#581] Fixed concurrency issues with our server worker, fixes a crash when CC is set to use multiple threads - Thanks to @zyxkad + +### Changed +- [#588] Changed the misspelled `maxHealth` parameter in the player detector, the misspelled attribute is still included in the table for backwards compatibility - Thanks to @zyxkad +- [#613] Clamp analog output of the `setAnalogOutput` function between 0-15 - Thanks to @zyxkad + ## [1.20.1-0.7.39r] - 2024-04-12 ### Fixed - [#578] Re-Added botania integration with a few new functions diff --git a/README.md b/README.md index dd7741d5c..69ad5b0cb 100644 --- a/README.md +++ b/README.md @@ -65,9 +65,9 @@ will close pull requests related to translations. [Documentation]: https://advancedperipherals.madefor.cc/ -[Contributors]: https://github.com/Seniorendi/AdvancedPeripherals/graphs/contributors +[Contributors]: https://github.com/IntelligenceModding/AdvancedPeripherals/graphs/contributors [CurseForge]: https://www.curseforge.com/minecraft/mc-mods/advanced-peripherals -[Actions]: https://github.com/Seniorendi/AdvancedPeripherals/actions +[Actions]: https://github.com/IntelligenceModding/AdvancedPeripherals/actions [Crowdin]: https://crowdin.com/project/advanced-peripherals [Discord]: https://discord.intelligence-modding.de [Banner]: https://www.bisecthosting.com/images/CF/Advanced_Peripherals/BH_AP_Header.png 'Advanced Peripherals' @@ -77,7 +77,7 @@ will close pull requests related to translations. [@FatalMerlin]: https://github.com/FatalMerlin [@SirEdvin]: https://github.com/SirEdvin -[@Srendi]: https://github.com/Seniorendi +[@Srendi]: https://github.com/IntelligenceModding [@Olfi01]: https://github.com/Olfi01 [License]: LICENSE diff --git a/build.gradle b/build.gradle index 4020b9b72..6cbe3022d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,25 +1,29 @@ import net.darkhax.curseforgegradle.TaskPublishCurseForge import java.text.SimpleDateFormat +import net.neoforged.gradle.dsl.common.runs.run.Run plugins { id "maven-publish" id 'net.darkhax.curseforgegradle' version '1.1.16' id 'org.jetbrains.changelog' version '1.2.1' id "com.modrinth.minotaur" version "2.+" - id "org.jetbrains.kotlin.jvm" version "1.6.10" - id 'net.neoforged.gradle' version '[6.0.18,6.2)' - id 'org.spongepowered.mixin' version '0.7.+' + id 'net.neoforged.gradle.userdev' version '7.0.145' id "com.github.breadmoirai.github-release" version "2.5.2" id 'checkstyle' id 'java' } -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + withSourcesJar() +} wrapper { - gradleVersion = '8.4' - distributionType = Wrapper.DistributionType.ALL + gradleVersion = '8.11' + distributionType = Wrapper.DistributionType.BIN } def isSnapshotVersion = project.hasProperty('teamcityBuild') @@ -51,116 +55,33 @@ def repositoryKey = secretEnv["PUBLIC_REP_KEY"] ?: System.getenv("PUBLIC_REP_KEY def githubKey = secretEnv["GITHUB_KEY"] ?: System.getenv("GITHUB_KEY") // Include resources generated by data generators. -sourceSets { - main.resources { - srcDir 'src/generated/resources' - } - testMod {} -} - -minecraft { +sourceSets.main.resources { srcDir 'src/generated/resources' } +minecraft.accessTransformers.file rootProject.file('src/main/resources/META-INF/accesstransformer.cfg') - mappings channel: "${mappings_channel}", version: "${mappings_version}" +runs { + // applies to all the run configs below + configureEach { + systemProperty 'forge.logging.markers', 'REGISTRIES' - accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg') - accessTransformer file('src/testMod/resources/META-INF/accesstransformer.cfg') + systemProperty 'forge.logging.console.level', 'debug' - runs { - client { - workingDirectory project.file('run') - - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" - properties 'forge.logging.console.level': 'debug' - - mods { - advancedperipherals { - source sourceSets.main - } - } - if (project.hasProperty('mc_uuid')) { - args '--uuid', project.getProperty('mc_uuid') - } - if (project.hasProperty('mc_username')) { - args '--username', project.getProperty('mc_username') - } - if (project.hasProperty('mc_accessToken')) { - args '--accessToken', project.getProperty('mc_accessToken') - } - } - - server { - workingDirectory project.file('server') - - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" - property 'forge.logging.console.level', 'info' - - mods { - advancedperipherals { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" - property 'forge.logging.console.level', 'debug' - - args '--mod', 'advancedperipherals', '--all', - '--existing', file('src/main/resources').toString(), - '--existing', file('src/generated/resources').toString(), - '--output', file('src/generated/resources/') - - mods { - advancedperipherals { - source sourceSets.main - } - } - } - - testClient { - workingDirectory project.file('test-files/client') - parent runs.client - - mods { - aptest { - source sourceSets.testMod - } - } + modSource project.sourceSets.main + } - lazyToken('minecraft_classpath') { - (configurations.implementationExtra.copyRecursive().resolve()) - .collect { it.absolutePath } - .join(File.pathSeparator) - } - } + client { run -> setupClientAcc(run) } - testServer { - workingDirectory project.file('test-files/server') - parent runs.server + server { + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + } - mods { - aptest { - source sourceSets.testMod - } - } + gameTestServer { + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + } - lazyToken('minecraft_classpath') { - (configurations.implementationExtra.copyRecursive().resolve()) - .collect { it.absolutePath } - .join(File.pathSeparator) - } - } + data { + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() } } - repositories { mavenCentral() maven { @@ -207,7 +128,6 @@ repositories { url = "https://maven.tterrag.com/" content { includeGroup("com.simibubi.create") - includeGroup("com.jozufozu.flywheel") includeGroup("com.tterrag.registrate") } } @@ -255,6 +175,8 @@ configurations { implementationExtra testModImplementation.extendsFrom(implementation) testModImplementation.extendsFrom(testImplementation) + runtimeClasspath.extendsFrom localRuntime + } dependencies { @@ -263,76 +185,72 @@ dependencies { // Minimal requirements compileOnly "org.jetbrains:annotations:${jb_annotations}" - minecraft "net.neoforged:forge:${minecraft_version}-${neo_version}" - implementation fg.deobf("cc.tweaked:cc-tweaked-${minecraft_version}-forge:${cc_version}") - // Compile-time API required - // Ae2 - compileOnly fg.deobf("appeng:appliedenergistics2-forge:${appliedenergistics_version}") - // Curios - compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}:api") + implementation "net.neoforged:neoforge:${neo_version}" + implementation "cc.tweaked:cc-tweaked-${minecraft_version}-forge:${cc_version}" + // Minimal requirements end // Extended requirements // We don't use the api since we need a specific class from mekanism - compileOnly fg.deobf("mekanism:Mekanism:${mekanism_version}") - runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}") - - // runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}")// core + compileOnly "mekanism:Mekanism:${mekanism_version}" + runtimeOnly "mekanism:Mekanism:${mekanism_version}" // Applied Energistics 2 - runtimeOnly fg.deobf("appeng:appliedenergistics2-forge:${appliedenergistics_version}") + runtimeOnly "appeng:appliedenergistics2-neoforge:${appliedenergistics_version}" + compileOnly "appeng:appliedenergistics2-neoforge:${appliedenergistics_version}" // Applied Mekanistics - implementation fg.deobf("curse.maven:applied-mekanistics-574300:${appliedmekanistics_version}") + runtimeOnly "curse.maven:applied-mekanistics-574300:${appliedmekanistics_version}" + compileOnly "curse.maven:applied-mekanistics-574300:${appliedmekanistics_version}" // Curios - runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}") + runtimeOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}" + compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}:api" // Refined Storage - implementation fg.deobf("com.refinedmods:refinedstorage:${refinedstorage_version}") { - transitive false - } + compileOnly "curse.maven:refined-storage-243076:${refinedstorage_version}" + runtimeOnly "curse.maven:refined-storage-243076:${refinedstorage_version}" // AE2 Things - compileOnly fg.deobf("curse.maven:ae2things-609977:${ae2things_version}-sources") - runtimeOnly fg.deobf("curse.maven:ae2things-609977:${ae2things_version}-sources") + //compileOnly "curse.maven:ae2things-609977:${ae2things_version}-sources" + //runtimeOnly "curse.maven:ae2things-609977:${ae2things_version}-sources" // AE2 Additions - compileOnly fg.deobf("curse.maven:ae-additions-493962:${ae2additions_version}") - runtimeOnly fg.deobf("curse.maven:ae-additions-493962:${ae2additions_version}") + //compileOnly "curse.maven:ae-additions-493962:${ae2additions_version}" + //runtimeOnly "curse.maven:ae-additions-493962:${ae2additions_version}" - implementation fg.deobf("thedarkcolour:kotlinforforge:${kotlinforforge_version}") + //implementation "thedarkcolour:kotlinforforge:${kotlinforforge_version}" // Botania - compileOnly fg.deobf("vazkii.botania:Botania:${botania_version}") - runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") + //compileOnly "vazkii.botania:Botania:${botania_version}" + //runtimeOnly "vazkii.botania:Botania:${botania_version}" // Minecolonies // Remove/Comment this section if you want to use runData. - //runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") - //runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") - //runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") - //runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") + //runtimeOnly "com.ldtteam:minecolonies:${minecolonies_version}" + //runtimeOnly "com.ldtteam:structurize:${structurize_version}" + //runtimeOnly "com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal" + //runtimeOnly "com.ldtteam:blockui:${blockui_version}" - compileOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") - compileOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") - compileOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") - compileOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") + //compileOnly "com.ldtteam:minecolonies:${minecolonies_version}" + //compileOnly "com.ldtteam:structurize:${structurize_version}" + //compileOnly "com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal" + //compileOnly "com.ldtteam:blockui:${blockui_version}" //Patchouli - runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}-FORGE") + //runtimeOnly "vazkii.patchouli:Patchouli:${patchouli_version}-FORGE" // Create - compileOnly fg.deobf("com.simibubi.create:create-1.20.1:${create_version}:all") - runtimeOnly fg.deobf("com.simibubi.create:create-1.20.1:${create_version}:all") + //compileOnly "com.simibubi.create:create-1.20.1:${create_version}:all" + //runtimeOnly "com.simibubi.create:create-1.20.1:${create_version}:all" //Powah - implementation fg.deobf("curse.maven:powah-633483:${powah_version}") - implementation fg.deobf("me.shedaniel.cloth:cloth-config-forge:11.1.106") - implementation fg.deobf("dev.architectury:architectury-forge:9.1.10") + implementation "curse.maven:powah-633483:${powah_version}" + implementation "me.shedaniel.cloth:cloth-config-forge:11.1.106" + implementation "dev.architectury:architectury-forge:9.1.10" //Removed until fully ported - //testImplementation fg.deobf("site.siredvin.ttoolkit:ttoolkit-${minecraft_version}:${ttoolkit_version}") + //testImplementation "site.siredvin.ttoolkit:ttoolkit-${minecraft_version}:${ttoolkit_version}" testImplementation "org.junit.jupiter:junit-jupiter-api:${junit_version}" testImplementation "org.junit.jupiter:junit-jupiter-params:${junit_version}" @@ -344,11 +262,11 @@ dependencies { testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junit_version}" // Testing stuff // JEI - implementation fg.deobf("mezz.jei:jei-${jei_version}") + implementation "mezz.jei:jei-${jei_version}" // Create Crafts & Additions - compileOnly fg.deobf("curse.maven:createaddition-439890:${createadditions_version}") - runtimeOnly fg.deobf("curse.maven:createaddition-439890:${createadditions_version}") + //compileOnly "curse.maven:createaddition-439890:${createadditions_version}" + //runtimeOnly "curse.maven:createaddition-439890:${createadditions_version}" } @@ -367,45 +285,6 @@ changelog { groups = [] } -compileTestModJava { - dependsOn(compileJava) -} - -task setupServer(type: Copy) { - group "test server" - description "Sets up the environment for the test server." - - from("src/testMod/server-files") { - include "eula.txt" - include "server.properties" - } - into "test-files/server" -} - -["Client", "Server"].forEach { name -> - tasks.register("test$name", JavaExec.class).configure { - it.group('In-game tests') - it.description("Runs tests on a temporary Minecraft instance.") - it.dependsOn(setupServer, "prepareRunTest$name", "cleanTest$name", 'compileTestModJava') - - JavaExec exec = tasks.getByName("runTest$name") - exec.copyTo(it) - it.setClasspath(exec.getClasspath()) - it.mainClass = exec.mainClass - it.setArgs(exec.getArgs()) - - it.systemProperty('forge.logging.console.level', 'debug') - it.systemProperty('ttoolkit.run', 'true') - } -} - -test { - useJUnitPlatform() - testLogging { - events "skipped", "failed" - } -} - afterEvaluate { tasks.withType(JavaCompile) { options.compilerArgs << "-Xmaxerrs" << "2000" @@ -425,8 +304,6 @@ jar { archiveFileName = "AdvancedPeripherals-${minecraft_version}-${mod_version}.jar" } -jar.finalizedBy('reobfJar') - tasks.withType(Checkstyle) { reports { xml.required = false @@ -437,7 +314,7 @@ tasks.withType(Checkstyle) { outputs.upToDateWhen { false } } -tasks.named('processResources', ProcessResources).configure { +tasks.withType(ProcessResources).configureEach { var replaceProperties = [minecraft_version : minecraft_version, neo_version : neo_version, loader_version : loader_version, @@ -456,24 +333,8 @@ tasks.named('processResources', ProcessResources).configure { inputs.properties replaceProperties - filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { - expand replaceProperties + [project: project] - } -} - -// Used to do some magic with teamcity -task commitAndPush() { - doLast { - def baseMessage = project.hasProperty('commitMessage') ? commitMessage : 'No commit message provided' - def message = baseMessage.replace("{version}", "${minecraft_version}-${version}") - - exec { - commandLine 'git', 'add', '.' - } - - exec { - commandLine 'git', 'commit', '-m', message - } + filesMatching(['META-INF/mods.toml']) { + expand replaceProperties } } @@ -504,7 +365,7 @@ tasks.register('publishCurseForge', TaskPublishCurseForge, { task -> addRequirement('cc-tweaked') - addModLoader("forge", "neoforge") + addModLoader("neoforge") releaseType = "${release_type}" } @@ -520,12 +381,12 @@ githubRelease { tagName = "${minecraft_version}-${version}" releaseName = "${minecraft_version}-${version}" targetCommitish = "release/${minecraft_version}" - generateReleaseNotes = false + generateReleaseNotes = true try { - body = "${project.changelog.get("${minecraft_version}-${version}").withHeader(false).toText()}" + //body = "${project.changelog.get("${minecraft_version}-${version}").withHeader(false).toText()}" } catch (err) { System.out.println(err) - body = "" + //body = "" } draft = false prerelease = !release_type.equalsIgnoreCase("release") @@ -539,7 +400,7 @@ modrinth { versionType = release_type uploadFile = jar gameVersions = [minecraft_version] - loaders = ["forge", "neoforge"] + loaders = ["neoforge"] dependencies { required.project "cc-tweaked" } @@ -552,6 +413,30 @@ modrinth { } } +// Stolen from mekanism +static void setupClientAcc(Run run) { + //The below if statements are to add args to your gradle.properties file in user home + // (DO NOT add them directly to the gradle.properties file for this project) + // Setting the below properties allows use of your normal Minecraft account in the + // dev environment including having your skin load. Each property also has a comment + // explaining what information to set the value to/format it expects + // One thing to note is because of the caching that goes on, after changing these + // variables, you need to refresh the project and rerun genIntellijRuns/genEclipseRuns + if (run.project.hasProperty('mc_uuid')) { + //Your uuid without any dashes in the middle + run.programArguments('--uuid', (String) run.project.property('mc_uuid')) + } + if (run.project.hasProperty('mc_username')) { + //Your username/display name, this is the name that shows up in chat + // Note: This is not your email, even if you have a Mojang account + run.programArguments('--username', (String) run.project.property('mc_username')) + } + if (run.project.hasProperty('mc_accessToken')) { + //Your access token, you can find it in your '.minecraft/launcher_accounts.json' file + run.programArguments('--accessToken', (String) run.project.property('mc_accessToken')) + } +} + publishing { publications { PublicationContainer publicationContainer -> publicationContainer.register("maven", MavenPublication) { MavenPublication publication -> @@ -559,7 +444,7 @@ publishing { publication.groupId = project.group publication.version = isSnapshotVersion ? "${minecraft_version}-${version}-${project.teamcityBuild}" : "${minecraft_version}-${version}" publication.artifactId = isSnapshotVersion ? "advancedperipherals-snapshots" : "advancedperipherals" - publication.artifacts = [jar] + publication.artifacts = [jar, sourcesJar] publication.pom { name.set("AdvancedPeripherals") packaging = 'jar' @@ -583,10 +468,8 @@ publishing { NodeList dependencies = asNode().dependencies NodeList allDeps = dependencies.'*' - //TODO: Needs to be changed in 1.20.2 since neoforge then changes the packages names. - // Remove forge deps allDeps. findAll() { Node el -> - el.artifactId.text() == 'forge' && el.groupId.text() == 'net.minecraftforge' + el.artifactId.text() == 'forge' && el.groupId.text() == 'net.neoforged' }.forEach() { Node el -> el.parent().remove(el) } @@ -615,3 +498,11 @@ publishing { } } } + +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 1489af619..32a1fa308 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,13 @@ org.gradle.logging.level=info # Minecraft related mod_id=advancedperipherals -minecraft_version=1.20.1 -neo_version=47.1.99 -loader_version=47 -mod_version=0.7.40r -release_type=release -mappings_channel=official -#mappings_version=2022.11.27-1.19.2 -mappings_version=1.20.1 +minecraft_version=1.20.4 +neo_version=20.4.231 +loader_version=20 +mod_version=0.7.42a +release_type=alpha +neogradle.subsystems.parchment.minecraftVersion=1.20.4 +neogradle.subsystems.parchment.mappingsVersion=2024.04.14 jb_annotations=21.0.1 # Test dependencies @@ -22,21 +21,21 @@ kotlinx_coroutines_version=1.6.0-RC3 ttoolkit_version=0.1.3 # Mod dependencies -cc_version=1.110.0 -curios_version=5.2.0+1.20.1 +cc_version=1.110.2 +curios_version=7.4.3+1.20.4 minecolonies_version=1.20.1-1.1.472-BETA -appliedenergistics_version=15.0.9-beta +appliedenergistics_version=17.13.0-beta patchouli_version=1.20.1-84 -refinedstorage_version=1.12.3 +refinedstorage_version=5165548 botania_version=1.20.1-443-FORGE create_version=0.5.1.f-27 createca_version=5099757 -mekanism_version=1.20.1-10.4.2.16 +mekanism_version=1.20.4-10.5.20.41 ae2things_version=4616683 powah_version=4638301 ae2additions_version=5077081 kotlinforforge_version=4.10.0 -appliedmekanistics_version=4842281 +appliedmekanistics_version=5294358 # Mod dependencies which are needed for other mods # For minecolonies @@ -45,9 +44,6 @@ multipiston_version=1.20-1.2.30-ALPHA blockui_version=1.20.1-0.0.101-ALPHA domumornamentum_version=1.20-1.0.150-BETA -# For Create -flywheel_version=0.6.8.a-1 - # Mod dependencies for testing stuff(Only used in the dev environment) -jei_version=1.20.1-forge:15.2.0.22 +jei_version=1.20.4-neoforge:17.3.1.5 createadditions_version=5099752 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e..a4b76b953 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 309b4e18d..94113f200 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cbb4..f5feea6d6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,7 +85,9 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +134,13 @@ 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. + if ! command -v java >/dev/null 2>&1 + then + 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 fi # Increase the maximum file descriptors if we can. @@ -141,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +205,11 @@ fi # 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"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f1..9d21a2183 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/settings.gradle b/settings.gradle index b8b50083c..b8f37d184 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,11 +5,12 @@ pluginManagement { maven { name = 'NeoForged' url = 'https://maven.neoforged.net/releases' - content { includeGroup("net.minecraftforge") + includeGroup("net.neoforged.gradle.userdev") includeGroup("net.neoforged.gradle") includeGroup("net.neoforged") + includeGroup("codechicken") includeGroup("org.spongepowered.mixin") includeGroup("org.spongepowered") } @@ -18,5 +19,5 @@ pluginManagement { } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } \ No newline at end of file diff --git a/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b b/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b index f6da03ce6..9d4678740 100644 --- a/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b +++ b/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b @@ -1,2 +1,2 @@ -// 1.20.1 2023-06-25T19:50:12.2494647 AP POI Type Tags +// 1.20.4 2024-12-22T16:09:31.6895785 AP POI Type Tags d3d6b837660a4e213f287ad9d11e12368b90cd8e data/minecraft/tags/point_of_interest_type/acquirable_job_site.json diff --git a/src/generated/resources/.cache/2f719b8031aed5e605ed8d6694b19245ca45c6ca b/src/generated/resources/.cache/2f719b8031aed5e605ed8d6694b19245ca45c6ca new file mode 100644 index 000000000..a43e67e3f --- /dev/null +++ b/src/generated/resources/.cache/2f719b8031aed5e605ed8d6694b19245ca45c6ca @@ -0,0 +1,2 @@ +// 1.20.4 2024-12-22T16:09:31.694585 Languages: en_us for mod: advancedperipherals +d669461c50102af6d4058086e2f12af8b0020157 assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 21704c05c..6200b5c67 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,14 +1,13 @@ -// 1.20.1 2023-10-08T00:39:38.7989175 Loot Tables -d83e42ffe1cb1b2c2f3feed0148f44fa31ca9ac8 data/advancedperipherals/loot_tables/blocks/block_reader.json -177b57033208131e377193a8c15bbeec0138dee3 data/advancedperipherals/loot_tables/blocks/chat_box.json -093b500c291b6f3a4e9990c5cd8b2cf0801bd26f data/advancedperipherals/loot_tables/blocks/colony_integrator.json -f6c42ab447af7bd948e609e926ac053b1dc72c44 data/advancedperipherals/loot_tables/blocks/energy_detector.json -1d11eef7114c1fa41841cb0c0f5766901b6eca21 data/advancedperipherals/loot_tables/blocks/environment_detector.json -3023e33353c226c18212ec0df3a88906f6bde1dd data/advancedperipherals/loot_tables/blocks/geo_scanner.json -9d97568cf422184ba1ce940abb3c53b4fb5fc419 data/advancedperipherals/loot_tables/blocks/inventory_manager.json -0f7096e4b313f59985d063f3eca7b9b1c62898ca data/advancedperipherals/loot_tables/blocks/me_bridge.json -9ab5190ac8f1ac6cb900709e278a71dc10ff49c4 data/advancedperipherals/loot_tables/blocks/nbt_storage.json -75b3fa426dbba542747d50323892494532655e00 data/advancedperipherals/loot_tables/blocks/peripheral_casing.json -50a4d6a8736ccf85e6be11fdd816686140caaa48 data/advancedperipherals/loot_tables/blocks/player_detector.json -8c9cbcfa464970683e0fad6628a6440851e333e9 data/advancedperipherals/loot_tables/blocks/redstone_integrator.json -4dd3918b564ef180c05ab88a80f202eae3a9504d data/advancedperipherals/loot_tables/blocks/rs_bridge.json +// 1.20.4 2024-12-22T16:09:31.6905785 Loot Tables +fdf4d9f8220d3a5207f8e4334bff2f06cd203b04 data/advancedperipherals/loot_tables/blocks/block_reader.json +8c3dba853066f5f8da0a27b0783e68fc33e8bebc data/advancedperipherals/loot_tables/blocks/chat_box.json +765df45ccaef4e908a480da9cb6f13ab1b4d7545 data/advancedperipherals/loot_tables/blocks/energy_detector.json +9144fbb590a4c6e9cf7b8ef87fc80faf321c7e16 data/advancedperipherals/loot_tables/blocks/environment_detector.json +4e184ec10657d1dc11ee7da33f244b2e23d61460 data/advancedperipherals/loot_tables/blocks/geo_scanner.json +266e98d8eeec6ef465832cac664e5ab05bca96af data/advancedperipherals/loot_tables/blocks/inventory_manager.json +ee86218933f0da283ae1dd6617d74ed41a04575b data/advancedperipherals/loot_tables/blocks/me_bridge.json +6aec9d25423531f9236266e2535d6c4633129935 data/advancedperipherals/loot_tables/blocks/nbt_storage.json +e9ed113da52cddcce17768d0999d4f9aefb4cfa7 data/advancedperipherals/loot_tables/blocks/peripheral_casing.json +33c81013355b11d7c8630c811ddd80232d3c1c7c data/advancedperipherals/loot_tables/blocks/player_detector.json +e88dae55b3850e66ce81752eb060b1e0fe8f707e data/advancedperipherals/loot_tables/blocks/redstone_integrator.json +dfb4e28d40828f2ef96dc9bd7b2a67e40fcd0c78 data/advancedperipherals/loot_tables/blocks/rs_bridge.json diff --git a/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf index 90e51a759..8a5b83224 100644 --- a/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf +++ b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf @@ -1,4 +1,4 @@ -// 1.20.1 2023-06-25T19:50:12.2474647 Turtle Upgrades +// 1.20.4 2024-12-22T16:09:31.6865744 Turtle Upgrades b8f19ae0fb5bb898facc08e3787e0f96c8211881 data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json fe98c60e7d61139aacf2d0872873e610aac8a37b data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json ae619da638ad89d7302d832d6c09e2c87401c539 data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 7168a4c10..60ae63aa6 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,38 +1,39 @@ -// 1.20.1 2023-10-08T00:39:38.7999168 Recipes -4583269c092ba4675590cc2459d6752402d77c5e data/advancedperipherals/advancements/recipes/redstone/block_reader.json -4d34f4a48ef2b2bb3564a8ffea9f661d359d99b4 data/advancedperipherals/advancements/recipes/redstone/chat_box.json -16b276a74cbf7e9c269554ad347c8d5003288498 data/advancedperipherals/advancements/recipes/redstone/chunk_controller.json -1afcd6f775d847d39438db4873373029b1469e1b data/advancedperipherals/advancements/recipes/redstone/computer_tool.json -9132eebd5951dfe8475cf6e3456422d1cd0ec3db data/advancedperipherals/advancements/recipes/redstone/energy_detector.json -aac3e4423f12c97874bba065b108a15289fdb13a data/advancedperipherals/advancements/recipes/redstone/environment_detector.json -fbfca76ba2537315b926301c7c2b3edad1cfc313 data/advancedperipherals/advancements/recipes/redstone/geo_scanner.json -27d23ed38f12f40bc4e0ccad373f8802a88158fb data/advancedperipherals/advancements/recipes/redstone/inventory_manager.json -82d71aa569221d0008a0a863db10855c0a5e1b33 data/advancedperipherals/advancements/recipes/redstone/memory_card.json -c1c350bf3c992053919a9c416d89d9fd144eee96 data/advancedperipherals/advancements/recipes/redstone/nbt_storage.json -3f1e1d4920d2f14779a931b99f9ceb2f19e7140d data/advancedperipherals/advancements/recipes/redstone/overpowered_end_automata_core.json -45a177020b32caac44f5d117535933d19c52b6b1 data/advancedperipherals/advancements/recipes/redstone/overpowered_husbandry_automata_core.json -6c080df8d9cb2b784c513581bfa73be81bb7cbc2 data/advancedperipherals/advancements/recipes/redstone/overpowered_weak_automata_core.json -3bf86565fb7df34dc71c9095741a33c2851d4fc3 data/advancedperipherals/advancements/recipes/redstone/peripheral_casing.json -fc3eaf68f3770dd22927b821a3dbbb48e5e0b924 data/advancedperipherals/advancements/recipes/redstone/player_detector.json -8f7e69e7b5ac6d28a6a9bc04414f58ddf104a477 data/advancedperipherals/advancements/recipes/redstone/redstone_integrator.json -3d9cf822b0bac6e57daa83588859abe38047f678 data/advancedperipherals/advancements/recipes/redstone/weak_automata_core.json -f333205e00752aff54c10e8cc3f5d6188a62144e data/advancedperipherals/recipes/block_reader.json -bb9e1d4dd3127edd608e66ab5cd75a2cf0de076c data/advancedperipherals/recipes/chat_box.json -a8c1b8efb8c3aa0919b68b42c219e04ca832f8a4 data/advancedperipherals/recipes/chunk_controller.json -94f38f923d667ca81f34e2c302433bfb50f6631a data/advancedperipherals/recipes/colony_integrator.json -6da200c706175646a4e1c3d374492b9ed174db0c data/advancedperipherals/recipes/computer_tool.json -2c0c55a9e9394a2dd4d0a9ec90dc54140cdfcb2f data/advancedperipherals/recipes/energy_detector.json -b6b63dd597fdb21743fe7fd971cf5c4b10fa69a3 data/advancedperipherals/recipes/environment_detector.json -03f66d550e188a4e26630f1910b77b41cfac0e8f data/advancedperipherals/recipes/geo_scanner.json -21c72aa7c869801f78f022a5478c6e1fbe6fa11e data/advancedperipherals/recipes/inventory_manager.json -d7f425d9dec1faae92e6774b9b12d22e9a08f333 data/advancedperipherals/recipes/memory_card.json -33d91990842986e5bdd87d6d4ee796567c8f098c data/advancedperipherals/recipes/me_bridge.json -be94465ca9a3765da6b64a414f85b486b993805c data/advancedperipherals/recipes/nbt_storage.json +// 1.20.4 2024-12-26T22:13:53.2984235 Recipes +81b2ee485995edeeb21c577d141a3fb3008561a4 data/advancedperipherals/advancements/recipes/redstone/block_reader.json +4900b8e92c78828e42f434730ad93917bb298a4a data/advancedperipherals/advancements/recipes/redstone/chat_box.json +397a6604bd3c093806aac1eabaa30819a83362ce data/advancedperipherals/advancements/recipes/redstone/chunk_controller.json +15310470ad28a44c968a2e3c56b4107c081f78cd data/advancedperipherals/advancements/recipes/redstone/computer_tool.json +2df5ece90c2fe8855feafab794beab1d00458f63 data/advancedperipherals/advancements/recipes/redstone/energy_detector.json +4b4ad3153a2061dd69646750e437ee85668c2a31 data/advancedperipherals/advancements/recipes/redstone/environment_detector.json +3bafb8fde05ec490e8f0211b0e97382fe713c08e data/advancedperipherals/advancements/recipes/redstone/geo_scanner.json +6f48a77e11a886df80c6672a514bd320915c9dee data/advancedperipherals/advancements/recipes/redstone/inventory_manager.json +7e27b6eb8d0d192dc319f646ba6447d2c9f4bd01 data/advancedperipherals/advancements/recipes/redstone/memory_card.json +e43499b6608246efc710214f24aa8c0ec4a65188 data/advancedperipherals/advancements/recipes/redstone/me_bridge.json +6550380146553418c22f70bef035aa7948fe58c5 data/advancedperipherals/advancements/recipes/redstone/nbt_storage.json +60949a6e0f4e50aee869fe617c256673b37e05f6 data/advancedperipherals/advancements/recipes/redstone/overpowered_end_automata_core.json +f7aaa36a885ee058e357422ef3261ed2e0e06c2f data/advancedperipherals/advancements/recipes/redstone/overpowered_husbandry_automata_core.json +6f8a6c4e74a4208915ec1f4c0065d62294c67c15 data/advancedperipherals/advancements/recipes/redstone/overpowered_weak_automata_core.json +1b08adf8952253e016be01157f749f6ab1bd3f0d data/advancedperipherals/advancements/recipes/redstone/peripheral_casing.json +6cefb0700ed4ff952ade60ca4ef9e48a9c0ff3fb data/advancedperipherals/advancements/recipes/redstone/player_detector.json +8f28aab37ae3dd8935ba3f827f2f0b1101852565 data/advancedperipherals/advancements/recipes/redstone/redstone_integrator.json +66277f490809169783247e32f37b501be83dfa6c data/advancedperipherals/advancements/recipes/redstone/rs_bridge.json +712fb0a23a9ab7cadab8bd05175c247a0b5295b4 data/advancedperipherals/advancements/recipes/redstone/weak_automata_core.json +f8acf88364459d1b38a9ac0fc3a2e87821f98edf data/advancedperipherals/recipes/block_reader.json +b1f3b9f50e62e2f53b23ad14248cb91acb745c37 data/advancedperipherals/recipes/chat_box.json +3c6f45e5977b200c900a71bad4b531d2b7e1164c data/advancedperipherals/recipes/chunk_controller.json +a39d46363291e5d98a8b96e17bfcfd44fbe3789d data/advancedperipherals/recipes/computer_tool.json +66d1e3ed636629a9a5f7e1a8b0b7d222f0300e00 data/advancedperipherals/recipes/energy_detector.json +85920e576d404f5ad78ba228f9d6cb9aed3d4962 data/advancedperipherals/recipes/environment_detector.json +4bf49ae496c60e5487c1e87013ef25e14bb13e3a data/advancedperipherals/recipes/geo_scanner.json +2eb633f159ac1b9feaffab383548f56b573f1519 data/advancedperipherals/recipes/inventory_manager.json +dbefebf13084fce55660cffabb955f25901a30f9 data/advancedperipherals/recipes/memory_card.json +f270bf14c921f717d294d8009356deeabf403053 data/advancedperipherals/recipes/me_bridge.json +fddcb2d34c37f4fd5834e077efd27f2cb6127c73 data/advancedperipherals/recipes/nbt_storage.json afb8673c5643adbbf69a469776ac4cd908ab17e8 data/advancedperipherals/recipes/overpowered_end_automata_core.json 7c98974c9e5999b0186011ff7f910ae2b3cc76b6 data/advancedperipherals/recipes/overpowered_husbandry_automata_core.json 40110dc9c8616e5c9b30b087cfc2f9254c433025 data/advancedperipherals/recipes/overpowered_weak_automata_core.json -5332d59dca4350114c1f8cd2eef6fe6049a7cc34 data/advancedperipherals/recipes/peripheral_casing.json -ebd7c031c57c3693859ff4ae21821f228a2dc732 data/advancedperipherals/recipes/player_detector.json -b31d886d6c4d7bc78aba6eea9ae891812f902a54 data/advancedperipherals/recipes/redstone_integrator.json -3a78a31651c0cd1f16ae1b9677fd4e4361ae2245 data/advancedperipherals/recipes/rs_bridge.json -7f1fb7f1753cc39dbfe6f36e33161d42b9478bca data/advancedperipherals/recipes/weak_automata_core.json +346dd97a088087077c157c29cb1ac7b25b0a0cef data/advancedperipherals/recipes/peripheral_casing.json +cba141d36a134a03ae91869abb91c9695bd92898 data/advancedperipherals/recipes/player_detector.json +d5a72afad727dd9814f4c8ef6b177a0db0bc9989 data/advancedperipherals/recipes/redstone_integrator.json +6354df82d465eba4f7f6c2bedf744a97bd6c8de6 data/advancedperipherals/recipes/rs_bridge.json +96aadb6d4a930083832331a5ad6f1b7970fa4cc7 data/advancedperipherals/recipes/weak_automata_core.json diff --git a/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c index b7bd57842..dd38e436c 100644 --- a/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c +++ b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c @@ -1,6 +1,5 @@ -// 1.20.1 2023-09-24T00:39:52.2388436 Pocket Computer Upgrades +// 1.20.4 2024-12-22T16:09:31.6935769 Pocket Computer Upgrades b672635324c0df354e587efc81d0b19a581eae2f data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json -30b8f663613c7ce77048fd69631afcc11a682276 data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json d4647159c2f2693a9c5e8d12bf740635751d29a8 data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json 8216a0a7d8ebe3ae738c8fc3626df25eb0a2e07a data/advancedperipherals/computercraft/pocket_upgrades/geoscanner_pocket.json a38aa83593f7ad0ace98e01bb3b5f06f272ef734 data/advancedperipherals/computercraft/pocket_upgrades/player_pocket.json diff --git a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 index d2722c405..52588e36c 100644 --- a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 +++ b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 @@ -1,7 +1,6 @@ -// 1.20.1 2023-10-08T00:39:38.8019181 Block States: advancedperipherals +// 1.20.4 2024-12-22T16:09:31.694585 Block States: advancedperipherals 5e28ce1be9a6996d982641e5df1fa7162090b8cc assets/advancedperipherals/blockstates/block_reader.json f42bdde60f84fdb312f7cf3b2be461d9c11ebdc8 assets/advancedperipherals/blockstates/chat_box.json -1227aa092fcf1327547ace6ccc9db230e45891b0 assets/advancedperipherals/blockstates/colony_integrator.json 67420f28031606ca03db9a044141bb22b0fa78b7 assets/advancedperipherals/blockstates/energy_detector.json 340b5baa62e5e6a2c35a05b4411be5937ac2bbb8 assets/advancedperipherals/blockstates/environment_detector.json 57c00996bcf1d783116a9210842f246612089555 assets/advancedperipherals/blockstates/geo_scanner.json @@ -14,7 +13,6 @@ ff12c7217911184266589813a2c8f9b0d46cfd65 assets/advancedperipherals/blockstates/ 6b176e8fdb048f7b6678bfbc1c4baf2bcfa67a1f assets/advancedperipherals/blockstates/rs_bridge.json 544ff1ecb58622350b58940036b4b1908e1146da assets/advancedperipherals/models/block/block_reader.json b28693973b6bbbb61e0c1ffc59e8ca98d8bb7e97 assets/advancedperipherals/models/block/chat_box.json -8361da86b709e26f17374dfd46637940894a2212 assets/advancedperipherals/models/block/colony_integrator.json 96ef564804fdc2b5184462747935f52baa35c651 assets/advancedperipherals/models/block/energy_detector.json 41556ddf5c5e67def6efd8e2e0645718d950af25 assets/advancedperipherals/models/block/environment_detector.json ba233597a497c1032d884fc3058e27b9d965725e assets/advancedperipherals/models/block/geo_scanner.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 deleted file mode 100644 index cfb07eae4..000000000 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2023-10-08T00:39:38.8019181 Languages: en_us -d2006c7f1d9c5f1f768b50a3c445dc8b566bf9dd assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 index a48a99130..c2b367e41 100644 --- a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 +++ b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 @@ -1,4 +1,4 @@ -// 1.20.1 2023-10-08T00:39:38.7954032 Block tags +// 1.20.4 2024-12-22T16:09:31.6885763 Block tags e1f71dcb4f9e7e36e29b0ad09d6520dc3adfa4a6 data/forge/tags/blocks/needs_wood_tool.json -dcbdeb0bc268b24e9970e4bada12e8e8da97b8d5 data/minecraft/tags/blocks/mineable/pickaxe.json -1017ee5cf2a99941ddfc00c2c5e07a19644470b6 data/minecraft/tags/blocks/needs_iron_tool.json +c51355cf8bc6acdfc555d90d3a4562790e0e006b data/minecraft/tags/blocks/mineable/pickaxe.json +9359859937d9d03ddcb8a5cba399bdea6300c89b data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/colony_integrator.json b/src/generated/resources/assets/advancedperipherals/blockstates/colony_integrator.json deleted file mode 100644 index 22543544e..000000000 --- a/src/generated/resources/assets/advancedperipherals/blockstates/colony_integrator.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "variants": { - "orientation=down_east": { - "model": "advancedperipherals:block/colony_integrator", - "x": 90, - "y": 90 - }, - "orientation=down_north": { - "model": "advancedperipherals:block/colony_integrator", - "x": 90 - }, - "orientation=down_south": { - "model": "advancedperipherals:block/colony_integrator", - "x": 90, - "y": 180 - }, - "orientation=down_west": { - "model": "advancedperipherals:block/colony_integrator", - "x": 90, - "y": 270 - }, - "orientation=east_up": { - "model": "advancedperipherals:block/colony_integrator", - "y": 90 - }, - "orientation=north_up": { - "model": "advancedperipherals:block/colony_integrator" - }, - "orientation=south_up": { - "model": "advancedperipherals:block/colony_integrator", - "y": 180 - }, - "orientation=up_east": { - "model": "advancedperipherals:block/colony_integrator", - "x": 270, - "y": 90 - }, - "orientation=up_north": { - "model": "advancedperipherals:block/colony_integrator", - "x": 270 - }, - "orientation=up_south": { - "model": "advancedperipherals:block/colony_integrator", - "x": 270, - "y": 180 - }, - "orientation=up_west": { - "model": "advancedperipherals:block/colony_integrator", - "x": 270, - "y": 270 - }, - "orientation=west_up": { - "model": "advancedperipherals:block/colony_integrator", - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index ed66cc743..bc55241ae 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -18,7 +18,6 @@ "advancements.advancedperipherals.weak_automata_core.description": "Does the afterlife exist in minecraft?", "block.advancedperipherals.block_reader": "Block Reader", "block.advancedperipherals.chat_box": "Chat Box", - "block.advancedperipherals.colony_integrator": "Colony Integrator", "block.advancedperipherals.energy_detector": "Energy Detector", "block.advancedperipherals.environment_detector": "Environment Detector", "block.advancedperipherals.geo_scanner": "Geo Scanner", @@ -41,7 +40,6 @@ "item.advancedperipherals.tooltip.block_reader": "&7Reads nbt data of blocks to interact with blocks which do not have computer support.", "item.advancedperipherals.tooltip.chat_box": "&7Interacts with the ingame chat, can read and write messages.", "item.advancedperipherals.tooltip.chunk_controller": "&7A crafting ingredient for the Chunky Turtle.", - "item.advancedperipherals.tooltip.colony_integrator": "&7Interacts with Minecolonies to read data about your colony and citizens.", "item.advancedperipherals.tooltip.computer_tool": "&7This tool was made to tune our blocks. But for now, it's just a blue useless wrench.", "item.advancedperipherals.tooltip.disabled": "&cThis item is disabled in the config, so you can craft it, but it'll not have any functionality.", "item.advancedperipherals.tooltip.end_automata_core": "&7Upgrade for turtles, that allows basic interaction with the world and teleportation in one dimension.", diff --git a/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json b/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json deleted file mode 100644 index 884006124..000000000 --- a/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "advancedperipherals:block/colony_integrator", - "down": "minecraft:block/oak_log_top", - "particle": "advancedperipherals:block/colony_integrator", - "up": "minecraft:block/oak_log_top" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/block_reader.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/block_reader.json index 949f03885..baff01fb2 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/block_reader.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/block_reader.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:block_reader" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chat_box.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chat_box.json index fa3020ac7..69aff301e 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chat_box.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chat_box.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:chat_box" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chunk_controller.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chunk_controller.json index 7a519f67b..9146a4ebe 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chunk_controller.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/chunk_controller.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:chunk_controller" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/computer_tool.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/computer_tool.json index d6c3c9119..d9d0b79fe 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/computer_tool.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/computer_tool.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:computer_tool" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/energy_detector.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/energy_detector.json index 660293fbc..165dc38bd 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/energy_detector.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/energy_detector.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:energy_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/environment_detector.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/environment_detector.json index d1e165256..d56a7c98e 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/environment_detector.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/environment_detector.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:environment_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/geo_scanner.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/geo_scanner.json index f7d069717..1b5f3e59a 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/geo_scanner.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/geo_scanner.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:geo_scanner" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/inventory_manager.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/inventory_manager.json index 4b4fda90b..9cfc93ca8 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/inventory_manager.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/inventory_manager.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:inventory_manager" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/me_bridge.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/me_bridge.json new file mode 100644 index 000000000..930c9e93c --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/me_bridge.json @@ -0,0 +1,40 @@ +{ + "neoforge:conditions": [ + { + "type": "neoforge:mod_loaded", + "modid": "ae2" + } + ], + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:me_bridge" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:me_bridge" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/memory_card.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/memory_card.json index d608174d3..e5330b121 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/memory_card.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/memory_card.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:memory_card" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/nbt_storage.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/nbt_storage.json index 50c7aa148..5bfb877ae 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/nbt_storage.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/nbt_storage.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:nbt_storage" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_end_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_end_automata_core.json index e44856075..79d0548be 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_end_automata_core.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_end_automata_core.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:overpowered_end_automata_core" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_husbandry_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_husbandry_automata_core.json index 882aee2e7..8b6951afc 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_husbandry_automata_core.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_husbandry_automata_core.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:overpowered_husbandry_automata_core" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_weak_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_weak_automata_core.json index ab624469c..c3381a9d6 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_weak_automata_core.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/overpowered_weak_automata_core.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:overpowered_weak_automata_core" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/peripheral_casing.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/peripheral_casing.json index 7030d3379..7b892d630 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/peripheral_casing.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/peripheral_casing.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:peripheral_casing" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/player_detector.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/player_detector.json index de2cea45d..48537c8b4 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/player_detector.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/player_detector.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:player_detector" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/redstone_integrator.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/redstone_integrator.json index 421a133b2..1c5a17343 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/redstone_integrator.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/redstone_integrator.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:redstone_integrator" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/rs_bridge.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/rs_bridge.json new file mode 100644 index 000000000..fb191d49d --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/rs_bridge.json @@ -0,0 +1,40 @@ +{ + "neoforge:conditions": [ + { + "type": "neoforge:mod_loaded", + "modid": "refinedstorage" + } + ], + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "advancedperipherals:peripheral_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:rs_bridge" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:rs_bridge" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/weak_automata_core.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/weak_automata_core.json index 0bf16c300..40d82492e 100644 --- a/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/weak_automata_core.json +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/redstone/weak_automata_core.json @@ -22,14 +22,13 @@ }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ "advancedperipherals:weak_automata_core" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json deleted file mode 100644 index 7bc588c1d..000000000 --- a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "advancedperipherals:colony_pocket", - "item": "advancedperipherals:colony_integrator" -} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json index cd740e279..c6c5746be 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/block_reader.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:block_reader" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json index 9319c45bf..1c2aef2a3 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/chat_box.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:chat_box" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/colony_integrator.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/colony_integrator.json deleted file mode 100644 index df9476c77..000000000 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/colony_integrator.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "advancedperipherals:colony_integrator" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "advancedperipherals:blocks/colony_integrator" -} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json index 16e1f5a7e..2b4c2c7b2 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/energy_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:energy_detector" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json index 310bc5f25..47cbb35c0 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/environment_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:environment_detector" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json index c3a81e225..7f9d55082 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/geo_scanner.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:geo_scanner" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json index 0746f9ee0..de0e972f6 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/inventory_manager.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:inventory_manager" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json index 938982af6..1921ca589 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/me_bridge.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:me_bridge" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json index 634aa47ed..5b96bf783 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/nbt_storage.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:nbt_storage" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json index 97ac3c44d..ebc512b29 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/peripheral_casing.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:peripheral_casing" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json index f772b7b89..9c06f68ef 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/player_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:player_detector" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json index 67b7755a8..771e2e3d3 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/redstone_integrator.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:redstone_integrator" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json index 27f0576fe..5065b7f85 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/rs_bridge.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:rs_bridge" } ], diff --git a/src/generated/resources/data/advancedperipherals/recipes/block_reader.json b/src/generated/resources/data/advancedperipherals/recipes/block_reader.json index b242818f9..e93bf3731 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/block_reader.json +++ b/src/generated/resources/data/advancedperipherals/recipes/block_reader.json @@ -25,6 +25,5 @@ ], "result": { "item": "advancedperipherals:block_reader" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/chat_box.json b/src/generated/resources/data/advancedperipherals/recipes/chat_box.json index 120a9e711..832cb15db 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/chat_box.json +++ b/src/generated/resources/data/advancedperipherals/recipes/chat_box.json @@ -19,6 +19,5 @@ ], "result": { "item": "advancedperipherals:chat_box" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json b/src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json index 6dd3718fe..437a46c6c 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json +++ b/src/generated/resources/data/advancedperipherals/recipes/chunk_controller.json @@ -19,6 +19,5 @@ ], "result": { "item": "advancedperipherals:chunk_controller" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/colony_integrator.json b/src/generated/resources/data/advancedperipherals/recipes/colony_integrator.json deleted file mode 100644 index edcb64594..000000000 --- a/src/generated/resources/data/advancedperipherals/recipes/colony_integrator.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "type": "forge:conditional", - "recipes": [ - { - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "minecolonies" - } - ], - "recipe": { - "type": "minecraft:crafting_shaped", - "category": "redstone", - "key": { - "A": { - "item": "advancedperipherals:peripheral_casing" - }, - "B": { - "item": "minecolonies:build_goggles" - }, - "O": { - "tag": "minecraft:logs" - }, - "R": { - "item": "minecolonies:blockminecoloniesrack" - }, - "S": { - "item": "structurize:sceptergold" - } - }, - "pattern": [ - "ORO", - "BAS", - "ORO" - ], - "result": { - "item": "advancedperipherals:colony_integrator" - }, - "show_notification": true - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/computer_tool.json b/src/generated/resources/data/advancedperipherals/recipes/computer_tool.json index d612fa0f9..17ad1fb4b 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/computer_tool.json +++ b/src/generated/resources/data/advancedperipherals/recipes/computer_tool.json @@ -16,6 +16,5 @@ ], "result": { "item": "advancedperipherals:computer_tool" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/energy_detector.json b/src/generated/resources/data/advancedperipherals/recipes/energy_detector.json index a5e2e7f38..c5a2e3adb 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/energy_detector.json +++ b/src/generated/resources/data/advancedperipherals/recipes/energy_detector.json @@ -25,6 +25,5 @@ ], "result": { "item": "advancedperipherals:energy_detector" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/environment_detector.json b/src/generated/resources/data/advancedperipherals/recipes/environment_detector.json index ac9b348a3..819f1e9fe 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/environment_detector.json +++ b/src/generated/resources/data/advancedperipherals/recipes/environment_detector.json @@ -25,6 +25,5 @@ ], "result": { "item": "advancedperipherals:environment_detector" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json b/src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json index 0278cc802..250c20e3d 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json +++ b/src/generated/resources/data/advancedperipherals/recipes/geo_scanner.json @@ -25,6 +25,5 @@ ], "result": { "item": "advancedperipherals:geo_scanner" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json b/src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json index 1461f2a19..e6f605ca9 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json +++ b/src/generated/resources/data/advancedperipherals/recipes/inventory_manager.json @@ -19,6 +19,5 @@ ], "result": { "item": "advancedperipherals:inventory_manager" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/me_bridge.json b/src/generated/resources/data/advancedperipherals/recipes/me_bridge.json index a40bf6ac6..964ed8bb9 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/me_bridge.json +++ b/src/generated/resources/data/advancedperipherals/recipes/me_bridge.json @@ -1,37 +1,29 @@ { - "type": "forge:conditional", - "recipes": [ + "neoforge:conditions": [ { - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ae2" - } - ], - "recipe": { - "type": "minecraft:crafting_shaped", - "category": "redstone", - "key": { - "A": { - "item": "advancedperipherals:peripheral_casing" - }, - "F": { - "item": "ae2:fluix_block" - }, - "I": { - "item": "ae2:interface" - } - }, - "pattern": [ - "FIF", - "IAI", - "FIF" - ], - "result": { - "item": "advancedperipherals:me_bridge" - }, - "show_notification": true - } + "type": "neoforge:mod_loaded", + "modid": "ae2" } - ] + ], + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "F": { + "item": "ae2:fluix_block" + }, + "I": { + "item": "ae2:interface" + } + }, + "pattern": [ + "FIF", + "IAI", + "FIF" + ], + "result": { + "item": "advancedperipherals:me_bridge" + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/memory_card.json b/src/generated/resources/data/advancedperipherals/recipes/memory_card.json index 536095670..65cae3b62 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/memory_card.json +++ b/src/generated/resources/data/advancedperipherals/recipes/memory_card.json @@ -22,6 +22,5 @@ ], "result": { "item": "advancedperipherals:memory_card" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json b/src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json index 88032c655..b933398b0 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json +++ b/src/generated/resources/data/advancedperipherals/recipes/nbt_storage.json @@ -22,6 +22,5 @@ ], "result": { "item": "advancedperipherals:nbt_storage" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json b/src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json index d51bbfd98..b2c43ded1 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json +++ b/src/generated/resources/data/advancedperipherals/recipes/peripheral_casing.json @@ -19,6 +19,5 @@ ], "result": { "item": "advancedperipherals:peripheral_casing" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/player_detector.json b/src/generated/resources/data/advancedperipherals/recipes/player_detector.json index b92197a07..6473313fc 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/player_detector.json +++ b/src/generated/resources/data/advancedperipherals/recipes/player_detector.json @@ -19,6 +19,5 @@ ], "result": { "item": "advancedperipherals:player_detector" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json b/src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json index e8d822469..2608082bd 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json +++ b/src/generated/resources/data/advancedperipherals/recipes/redstone_integrator.json @@ -19,6 +19,5 @@ ], "result": { "item": "advancedperipherals:redstone_integrator" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json b/src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json index 01b771458..7a08c1400 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json +++ b/src/generated/resources/data/advancedperipherals/recipes/rs_bridge.json @@ -1,37 +1,29 @@ { - "type": "forge:conditional", - "recipes": [ + "neoforge:conditions": [ { - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "refinedstorage" - } - ], - "recipe": { - "type": "minecraft:crafting_shaped", - "category": "redstone", - "key": { - "A": { - "item": "advancedperipherals:peripheral_casing" - }, - "I": { - "item": "refinedstorage:interface" - }, - "Q": { - "item": "refinedstorage:quartz_enriched_iron" - } - }, - "pattern": [ - "QIQ", - "IAI", - "QIQ" - ], - "result": { - "item": "advancedperipherals:rs_bridge" - }, - "show_notification": true - } + "type": "neoforge:mod_loaded", + "modid": "refinedstorage" } - ] + ], + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "A": { + "item": "advancedperipherals:peripheral_casing" + }, + "I": { + "item": "refinedstorage:interface" + }, + "Q": { + "item": "refinedstorage:quartz_enriched_iron" + } + }, + "pattern": [ + "QIQ", + "IAI", + "QIQ" + ], + "result": { + "item": "advancedperipherals:rs_bridge" + } } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json b/src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json index 6a11db3e3..1b9646b21 100644 --- a/src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json +++ b/src/generated/resources/data/advancedperipherals/recipes/weak_automata_core.json @@ -9,10 +9,10 @@ "tag": "forge:gems/diamond" }, "L": { - "type": "forge:nbt", - "count": 1, + "type": "neoforge:nbt", "item": "minecraft:potion", - "nbt": "{Potion:\"minecraft:long_regeneration\"}" + "strict": true, + "tag": "{Potion:\"minecraft:long_regeneration\"}" }, "R": { "tag": "forge:storage_blocks/redstone" @@ -28,6 +28,5 @@ ], "result": { "item": "advancedperipherals:weak_automata_core" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index ada8618ef..c1f24be18 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -11,7 +11,6 @@ "advancedperipherals:redstone_integrator", "advancedperipherals:block_reader", "advancedperipherals:geo_scanner", - "advancedperipherals:colony_integrator", "advancedperipherals:nbt_storage" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json index 002d1e917..b3d6c2415 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -10,7 +10,6 @@ "advancedperipherals:redstone_integrator", "advancedperipherals:block_reader", "advancedperipherals:geo_scanner", - "advancedperipherals:colony_integrator", "advancedperipherals:nbt_storage" ] } \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java b/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java index 9a20520f8..7b923bc7a 100644 --- a/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java +++ b/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java @@ -8,7 +8,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; import java.util.Collection; import java.util.Set; @@ -17,7 +17,7 @@ public class APCreativeTab { public static void populateCreativeTabBuilder(CreativeModeTab.Builder builder) { builder.displayItems((set, out) -> { - Registration.ITEMS.getEntries().stream().map(RegistryObject::get).forEach(out::accept); + Registration.ITEMS.getEntries().stream().map(DeferredHolder::get).forEach(out::accept); out.acceptAll(pocketUpgrade(CCRegistration.ID.COLONY_POCKET)); out.acceptAll(pocketUpgrade(CCRegistration.ID.CHATTY_POCKET)); out.acceptAll(pocketUpgrade(CCRegistration.ID.PLAYER_POCKET)); diff --git a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java index dea0499e0..b29cd9c27 100644 --- a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java +++ b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java @@ -1,17 +1,20 @@ package de.srendi.advancedperipherals; +import appeng.api.AECapabilities; +import dan200.computercraft.api.peripheral.PeripheralCapability; import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.blocks.base.ICapabilityProvider; import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.common.setup.BlockEntityTypes; import de.srendi.advancedperipherals.common.setup.Registration; - -import de.srendi.advancedperipherals.network.APNetworking; +import de.srendi.advancedperipherals.common.util.ChunkManager; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -26,20 +29,21 @@ public class AdvancedPeripherals { public static final Logger LOGGER = LogManager.getLogger(NAME); public static final Random RANDOM = new Random(); - public AdvancedPeripherals() { + public AdvancedPeripherals(IEventBus modBus) { LOGGER.info("AdvancedPeripherals says hello!"); - IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); APConfig.register(ModLoadingContext.get()); modBus.addListener(this::commonSetup); - Registration.register(); - MinecraftForge.EVENT_BUS.register(this); + modBus.addListener(this::registerCapabilities); + modBus.addListener(ChunkManager::registerTicketController); + + Registration.register(modBus); } public static void debug(String message) { if (APConfig.GENERAL_CONFIG.enableDebugMode.get()) - LOGGER.debug("[DEBUG] {}", message); + LOGGER.info("[DEBUG] {}", message); } public static void debug(String message, Level level) { @@ -53,7 +57,52 @@ public static ResourceLocation getRL(String resource) { public void commonSetup(FMLCommonSetupEvent event) { APAddons.commonSetup(); - APNetworking.init(); } + public void registerCapabilities(RegisterCapabilitiesEvent event) { + Registration.BLOCK_ENTITIES.getEntries().forEach((entry) -> { + + event.registerBlockEntity( + PeripheralCapability.get(), + entry.get(), + (blockEntity, side) -> { + if (blockEntity instanceof ICapabilityProvider provider) + return provider.createPeripheralCap(side); + return null; + }); + + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + entry.get(), + (blockEntity, side) -> { + if (blockEntity instanceof ICapabilityProvider provider) + return provider.createItemHandlerCap(side); + return null; + }); + + event.registerBlockEntity( + Capabilities.FluidHandler.BLOCK, + entry.get(), + (blockEntity, side) -> { + if (blockEntity instanceof ICapabilityProvider provider) + return provider.createFluidHandlerCap(side); + return null; + }); + + event.registerBlockEntity( + Capabilities.EnergyStorage.BLOCK, + entry.get(), + (blockEntity, side) -> { + if (blockEntity instanceof ICapabilityProvider provider) + return provider.createEnergyStorageCap(side); + return null; + }); + }); + + if (APAddons.ae2Loaded) + event.registerBlockEntity( + AECapabilities.IN_WORLD_GRID_NODE_HOST, + BlockEntityTypes.ME_BRIDGE.get(), + (blockEntity, side) -> blockEntity); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index 160836009..766009aa8 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -1,6 +1,6 @@ package de.srendi.advancedperipherals.client; -import dan200.computercraft.api.client.ComputerCraftAPIClient; +import dan200.computercraft.api.client.turtle.RegisterTurtleModellersEvent; import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.container.InventoryManagerScreen; @@ -9,12 +9,12 @@ import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.ModelEvent; -import net.minecraftforge.client.event.RegisterKeyMappingsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.event.ModelEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class ClientRegistry { @@ -31,29 +31,26 @@ public static void registerModels(ModelEvent.RegisterAdditional event) { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { MenuScreens.register(ContainerTypes.INVENTORY_MANAGER_CONTAINER.get(), InventoryManagerScreen::new); + } - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.CHUNKY_TURTLE.get(), TurtleUpgradeModeller.flatItem()); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.COMPASS_TURTLE.get(), TurtleUpgradeModeller.flatItem()); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.CHAT_BOX_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_chat_box_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_chat_box_upgrade_right"), "inventory"))); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.ENVIRONMENT_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_environment_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_environment_upgrade_right"), "inventory"))); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.GEO_SCANNER_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_geoscanner_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_geoscanner_upgrade_right"), "inventory"))); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.PLAYER_DETECTOR_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_player_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_player_upgrade_right"), "inventory"))); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.OP_END_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.OP_HUSBANDRY_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.OP_WEAK_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.HUSBANDRY_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.END_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); - ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.WEAK_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); + @SubscribeEvent + public static void onUpgradeModeller(RegisterTurtleModellersEvent event) { + event.register(CCRegistration.CHUNKY_TURTLE.get(), TurtleUpgradeModeller.flatItem()); + event.register(CCRegistration.COMPASS_TURTLE.get(), TurtleUpgradeModeller.flatItem()); + event.register(CCRegistration.CHAT_BOX_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_chat_box_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_chat_box_upgrade_right"), "inventory"))); + event.register(CCRegistration.ENVIRONMENT_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_environment_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_environment_upgrade_right"), "inventory"))); + event.register(CCRegistration.GEO_SCANNER_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_geoscanner_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_geoscanner_upgrade_right"), "inventory"))); + event.register(CCRegistration.PLAYER_DETECTOR_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_player_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_player_upgrade_right"), "inventory"))); + event.register(CCRegistration.OP_END_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); + event.register(CCRegistration.OP_HUSBANDRY_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); + event.register(CCRegistration.OP_WEAK_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); + event.register(CCRegistration.HUSBANDRY_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); + event.register(CCRegistration.END_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); + event.register(CCRegistration.WEAK_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); } @SubscribeEvent public static void onClientSetup(RegisterKeyMappingsEvent event) { KeyBindings.register(event); } - - //TODO change the icon of the curio icon - /*@SubscribeEvent - public static void onTextureStitching(TextureStitchEvent.Pre event) { - event.addSprite(new ResourceLocation(AdvancedPeripherals.MOD_ID, "item/empty_glasses_slot")); - }*/ } diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientUUIDCache.java b/src/main/java/de/srendi/advancedperipherals/client/ClientUUIDCache.java new file mode 100644 index 000000000..f0283501e --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientUUIDCache.java @@ -0,0 +1,41 @@ +package de.srendi.advancedperipherals.client; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.network.APNetworking; +import de.srendi.advancedperipherals.network.toserver.RetrieveUsernamePacket; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +/** + * Used for client side messages where we don't have a username, only a UUID + * See {@link de.srendi.advancedperipherals.common.items.MemoryCardItem#appendHoverText(ItemStack, Level, List, TooltipFlag)} as example + *

+ * Probably the most useless feature, but I love it - endi + */ +public class ClientUUIDCache { + + private static final HashMap CACHE = new HashMap<>(); + + private ClientUUIDCache() { } + + @Nullable + public static String getUsername(UUID uuid, UUID requester) { + if (CACHE.containsKey(uuid)) + return CACHE.get(uuid); + + APNetworking.sendToServer(new RetrieveUsernamePacket(uuid, requester)); + return null; + } + + public static void putUsername(UUID uuid, String username) { + CACHE.put(uuid, username); + AdvancedPeripherals.debug(String.format("Putting username %s with uuid %s into cache", username, uuid)); + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java b/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java index 2cbd46438..7bccb2b59 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java +++ b/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.client; import net.minecraft.client.KeyMapping; -import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import org.lwjgl.glfw.GLFW; public class KeyBindings { diff --git a/src/main/java/de/srendi/advancedperipherals/client/MetaTurtleUpgradeModeller.java b/src/main/java/de/srendi/advancedperipherals/client/MetaTurtleUpgradeModeller.java index 38f624e6e..fbf19a891 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/MetaTurtleUpgradeModeller.java +++ b/src/main/java/de/srendi/advancedperipherals/client/MetaTurtleUpgradeModeller.java @@ -9,6 +9,7 @@ import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.common.util.DataStorageUtil; import de.srendi.advancedperipherals.lib.turtle.ClockwiseAnimatedTurtleUpgrade; +import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,7 +17,7 @@ public class MetaTurtleUpgradeModeller getObjectFromItemStack(Pair private static Map getObjectFromFluidStack(Pair stack, @Nullable ICraftingService craftingService) { Map map = new HashMap<>(); long amount = stack.getLeft(); - map.put("name", ForgeRegistries.FLUIDS.getKey(stack.getRight().getFluid()).toString()); + map.put("name", stack.getRight().getFluid().builtInRegistryHolder().key().registry().toString()); map.put("amount", amount); map.put("displayName", stack.getRight().getDisplayName().getString()); map.put("tags", LuaConverter.tagsToList(() -> stack.getRight().getFluid().builtInRegistryHolder().tags())); @@ -330,20 +335,6 @@ public static long getTotalItemStorage(IGridNode node) { if (cell.getKeyType().getClass().isAssignableFrom(AEKeyType.items().getClass())) { total += cell.getBytes(null); } - } else if (APAddons.aeThingsLoaded && stack.getItem() instanceof DISKDrive disk) { - if (disk.getKeyType().toString().equals("ae2:i")) { - total += disk.getBytes(null); - } - } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof SuperStorageCell superStorageCell)) { - total += superStorageCell.getKiloBytes() * 1024L; - } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof StorageCell storageCell)) { - if (storageCell.getKeyType() != AEKeyType.items()) - continue; - total += storageCell.getKiloBytes() * 1024L; - } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof StorageCell storageCell)) { - if (storageCell.getKeyType() != AEKeyType.items()) - continue; - total += storageCell.getKiloBytes() * 1024; } } } @@ -354,13 +345,11 @@ public static long getTotalItemStorage(IGridNode node) { StorageBusPart bus = (StorageBusPart) iterator.next().getService(IStorageProvider.class); net.minecraft.world.level.Level level = bus.getLevel(); BlockPos connectedInventoryPos = bus.getHost().getBlockEntity().getBlockPos().relative(bus.getSide()); - BlockEntity connectedInventoryEntity = level.getBlockEntity(connectedInventoryPos); - LazyOptional itemHandler = connectedInventoryEntity.getCapability(ForgeCapabilities.ITEM_HANDLER); - if (itemHandler.isPresent()) { - IItemHandler handler = itemHandler.orElse(null); - for (int i = 0; i < handler.getSlots(); i++) { - total += handler.getSlotLimit(i); + IItemHandler itemHandler = level.getCapability(Capabilities.ItemHandler.BLOCK, connectedInventoryPos, bus.getSide()); + if (itemHandler != null) { + for (int i = 0; i < itemHandler.getSlots(); i++) { + total += itemHandler.getSlotLimit(i); } } } @@ -389,16 +378,6 @@ public static long getTotalFluidStorage(IGridNode node) { if (cell.getKeyType().getClass().isAssignableFrom(AEKeyType.fluids().getClass())) { total += cell.getBytes(null); } - } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof SuperStorageCell superStorageCell) { - total += superStorageCell.getKiloBytes() * 1024L; - } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof StorageCell storageCell)) { - if (storageCell.getKeyType() != AEKeyType.fluids()) - continue; - total += storageCell.getKiloBytes() * 1024L; - } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof StorageCell storageCell)) { - if (storageCell.getKeyType() != AEKeyType.fluids()) - continue; - total += storageCell.getKiloBytes() * 1024; } } } @@ -409,13 +388,11 @@ public static long getTotalFluidStorage(IGridNode node) { StorageBusPart bus = (StorageBusPart) iterator.next().getService(IStorageProvider.class); net.minecraft.world.level.Level level = bus.getLevel(); BlockPos connectedInventoryPos = bus.getHost().getBlockEntity().getBlockPos().relative(bus.getSide()); - BlockEntity connectedInventoryEntity = level.getBlockEntity(connectedInventoryPos); - LazyOptional fluidHandler = connectedInventoryEntity.getCapability(ForgeCapabilities.FLUID_HANDLER); - if (fluidHandler.isPresent()) { - IFluidHandler handler = fluidHandler.orElse(null); - for (int i = 0; i < handler.getTanks(); i++) { - total += handler.getTankCapacity(i); + IFluidHandler fluidHandler = level.getCapability(Capabilities.FluidHandler.BLOCK, connectedInventoryPos, bus.getSide()); + if (fluidHandler != null) { + for (int i = 0; i < fluidHandler.getTanks(); i++) { + total += fluidHandler.getTankCapacity(i); } } } @@ -451,27 +428,6 @@ public static long getUsedItemStorage(IGridNode node) { used += ((int) Math.ceil(((double) numItemsInCell) / 8)) + ((long) bytesPerType * numOfType); } - } else if (APAddons.aeThingsLoaded && stack.getItem() instanceof DISKDrive disk) { - if (disk.getKeyType().toString().equals("ae2:i")) { - if (stack.getTag() == null) - continue; - long numBytesInCell = stack.getTag().getLong("ic"); - used += numBytesInCell; - } - } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof SuperStorageCell) { - if (stack.getTag() == null) - continue; - long numItemsInCell = stack.getTag().getLong("ic"); - - used += numItemsInCell; - } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof StorageCell storageCell) { - if (storageCell.getKeyType() != AEKeyType.items()) - continue; - if (stack.getTag() == null) - continue; - long numItemsInCell = stack.getTag().getLong("ic"); - - used += numItemsInCell; } } } @@ -517,20 +473,6 @@ public static long getUsedFluidStorage(IGridNode node) { used += ((int) Math.ceil(((double) numBucketsInCell) / 8)) + ((long) bytesPerType * numOfType); } - } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof SuperStorageCell) { - if (stack.getTag() == null) - continue; - long numItemsInCell = stack.getTag().getLong("ic"); - - used += numItemsInCell; - } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof StorageCell storageCell) { - if (storageCell.getKeyType() != AEKeyType.fluids()) - continue; - if (stack.getTag() == null) - continue; - long numItemsInCell = stack.getTag().getLong("ic"); - - used += numItemsInCell; } } } @@ -542,7 +484,7 @@ public static long getUsedFluidStorage(IGridNode node) { KeyCounter keyCounter = bus.getInternalHandler().getAvailableStacks(); for (Object2LongMap.Entry aeKey : keyCounter) { - if (aeKey.getKey() instanceof AEFluidKey fluidKey) { + if (aeKey.getKey() instanceof AEFluidKey) { used += aeKey.getLongValue(); } } @@ -562,15 +504,15 @@ public static long getAvailableFluidStorage(IGridNode node) { public static List listCells(IGridNode node) { List items = new ArrayList<>(); - Iterator iterator = node.getGrid().getMachineNodes(DriveBlockEntity.class).iterator(); + Iterator iterator = node.getGrid().getNodes().iterator(); if (!iterator.hasNext()) return items; while (iterator.hasNext()) { - DriveBlockEntity entity = (DriveBlockEntity) iterator.next().getService(IStorageProvider.class); - if (entity == null) + IStorageProvider entity = iterator.next().getService(IStorageProvider.class); + if (!(entity instanceof DriveBlockEntity driveEntity)) continue; - InternalInventory inventory = entity.getInternalInventory(); + InternalInventory inventory = driveEntity.getInternalInventory(); for (int i = 0; i < inventory.size(); i++) { ItemStack stack = inventory.getStackInSlot(i); @@ -580,10 +522,6 @@ public static List listCells(IGridNode node) { if (stack.getItem() instanceof IBasicCellItem cell) { items.add(getObjectFromCell(cell, stack)); - } else if (APAddons.aeThingsLoaded && stack.getItem() instanceof DISKDrive disk) { - items.add(getObjectFromDisk(disk, stack)); - } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof SuperStorageCell superStorageCell) { - items.add(getObjectFromSuperCell(superStorageCell, stack)); } } } @@ -611,35 +549,4 @@ private static Map getObjectFromCell(IBasicCellItem cell, ItemSt return map; } - private static Map getObjectFromDisk(DISKDrive drive, ItemStack stack) { - Map map = new HashMap<>(); - - map.put("item", stack.getItem().toString()); - - String cellType = ""; - - if (drive.getKeyType().toString().equals("ae2:i")) { - cellType = "item"; - } else if (drive.getKeyType().toString().equals("ae2:f")) { - cellType = "fluid"; - } - - map.put("cellType", cellType); - map.put("totalBytes", drive.getBytes(null)); - - return map; - } - - private static Map getObjectFromSuperCell(SuperStorageCell cell, ItemStack stack) { - Map map = new HashMap<>(); - - map.put("item", stack.getItem().toString()); - - String cellType = "all"; - - map.put("cellType", cellType); - map.put("totalBytes", cell.getBytes(stack)); - - return map; - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java index 1b2d5d9a9..0587af7d7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java @@ -2,7 +2,11 @@ import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; -import appeng.api.networking.crafting.*; +import appeng.api.networking.crafting.CalculationStrategy; +import appeng.api.networking.crafting.ICraftingCPU; +import appeng.api.networking.crafting.ICraftingPlan; +import appeng.api.networking.crafting.ICraftingService; +import appeng.api.networking.crafting.ICraftingSimulationRequester; import appeng.api.networking.security.IActionSource; import appeng.api.stacks.AEKey; import dan200.computercraft.api.lua.ILuaCallback; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java index 8072a777d..fb29729b1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java @@ -7,7 +7,7 @@ import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; import de.srendi.advancedperipherals.common.util.inventory.IStorageSystemFluidHandler; -import net.minecraftforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.FluidStack; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/Integration.java deleted file mode 100644 index f2cabb6aa..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/Integration.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.botania; - -import dan200.computercraft.api.ComputerCraftAPI; - -public class Integration implements Runnable { - - @Override - public void run() { - ComputerCraftAPI.registerGenericSource(new ManaFlowerIntegration()); - ComputerCraftAPI.registerGenericSource(new ManaPoolIntegration()); - ComputerCraftAPI.registerGenericSource(new SpreaderIntegration()); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaFlowerIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaFlowerIntegration.java deleted file mode 100644 index 7db9f0559..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaFlowerIntegration.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.botania; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import vazkii.botania.api.block_entity.GeneratingFlowerBlockEntity; - -public class ManaFlowerIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "manaFlower"; - } - - @LuaFunction(mainThread = true) - public final boolean isFloating(GeneratingFlowerBlockEntity blockEntity) { - return blockEntity.isFloating(); - } - - @LuaFunction(mainThread = true) - public final int getMaxMana(GeneratingFlowerBlockEntity blockEntity) { - return blockEntity.getMaxMana(); - } - - @LuaFunction(mainThread = true) - public final int getMana(GeneratingFlowerBlockEntity blockEntity) { - return blockEntity.getMana(); - } - - @LuaFunction(mainThread = true) - public final boolean isOnEnchantedSoil(GeneratingFlowerBlockEntity blockEntity) { - return blockEntity.overgrowth; - } - - @LuaFunction(mainThread = true) - public final boolean isFull(GeneratingFlowerBlockEntity blockEntity) { - return blockEntity.getMana() >= blockEntity.getMaxMana(); - } - - @LuaFunction(mainThread = true) - public final boolean isEmpty(GeneratingFlowerBlockEntity blockEntity) { - return blockEntity.getMana() == 0; - } - -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaPoolIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaPoolIntegration.java deleted file mode 100644 index b05146cf5..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaPoolIntegration.java +++ /dev/null @@ -1,79 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.botania; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.common.util.LuaConverter; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.AABB; -import vazkii.botania.common.block.block_entity.mana.ManaPoolBlockEntity; - -import java.util.List; -import java.util.stream.Collectors; - -public class ManaPoolIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "manaPool"; - } - - @LuaFunction(mainThread = true) - public final int getMana(ManaPoolBlockEntity blockEntity) { - return blockEntity.getCurrentMana(); - } - - @LuaFunction(mainThread = true) - public final int getMaxMana(ManaPoolBlockEntity blockEntity) { - return blockEntity.getMaxMana(); - } - - @LuaFunction(mainThread = true) - public final int getManaNeeded(ManaPoolBlockEntity blockEntity) { - return blockEntity.getAvailableSpaceForMana(); - } - - @LuaFunction(mainThread = true) - public final boolean isFull(ManaPoolBlockEntity blockEntity) { - return blockEntity.isFull(); - } - - @LuaFunction(mainThread = true) - public final boolean isEmpty(ManaPoolBlockEntity blockEntity) { - return blockEntity.getCurrentMana() == 0; - } - - @LuaFunction(mainThread = true) - public final boolean canChargeItem(ManaPoolBlockEntity blockEntity) { - return blockEntity.isOutputtingPower(); - } - - @LuaFunction(mainThread = true) - public final boolean hasItems(ManaPoolBlockEntity blockEntity) { - return !getPoolItems(blockEntity).isEmpty(); - } - - @LuaFunction(mainThread = true) - public final Object getItems(ManaPoolBlockEntity blockEntity) { - List items = getPoolItems(blockEntity); - if(items.isEmpty()) - return null; - Object[] luaStacks = new Object[items.size()]; - - for (int item = 0; item < items.size(); item++) { - luaStacks[item] = LuaConverter.stackToObject(items.get(item)); - } - - return luaStacks; - } - - private List getPoolItems(ManaPoolBlockEntity blockEntity) { - BlockPos position = blockEntity.getBlockPos(); - return blockEntity.getLevel().getEntitiesOfClass(ItemEntity.class, new AABB(position, position.offset(1, 1, 1))) - .stream() - .map(ItemEntity::getItem) - .collect(Collectors.toList()); - } - -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/SpreaderIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/SpreaderIntegration.java deleted file mode 100644 index a090f7c4d..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/SpreaderIntegration.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.botania; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.common.util.LuaConverter; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import net.minecraft.world.item.ItemStack; -import vazkii.botania.common.block.block_entity.mana.ManaSpreaderBlockEntity; - -public class SpreaderIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "manaSpreader"; - } - - @LuaFunction(mainThread = true) - public final int getMana(ManaSpreaderBlockEntity blockEntity) { - return blockEntity.getCurrentMana(); - } - - @LuaFunction(mainThread = true) - public final int getMaxMana(ManaSpreaderBlockEntity blockEntity) { - return blockEntity.getMaxMana(); - } - - @LuaFunction(mainThread = true) - public final Object getBounding(ManaSpreaderBlockEntity blockEntity) { - if (blockEntity.getBinding() == null) return null; - return LuaConverter.posToObject(blockEntity.getBinding()); - } - - @LuaFunction(mainThread = true) - public final String getVariant(ManaSpreaderBlockEntity blockEntity) { - return blockEntity.getVariant().toString(); - } - - @LuaFunction(mainThread = true) - public final boolean isFull(ManaSpreaderBlockEntity blockEntity) { - return blockEntity.isFull(); - } - - @LuaFunction(mainThread = true) - public final boolean isEmpty(ManaSpreaderBlockEntity blockEntity) { - return blockEntity.getCurrentMana() == 0; - } - - @LuaFunction(mainThread = true) - public final boolean hasLens(ManaSpreaderBlockEntity blockEntity) { - return blockEntity.getItem(0) != ItemStack.EMPTY; - } - - @LuaFunction(mainThread = true) - public final Object getLens(ManaSpreaderBlockEntity blockEntity) { - if(blockEntity.getItem(0) == ItemStack.EMPTY) - return null; - return LuaConverter.stackToObject(blockEntity.getItem(0)); - } - -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java index a5d8af260..53acc7a6d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java @@ -1,19 +1,12 @@ package de.srendi.advancedperipherals.common.addons.computercraft.integrations; import dan200.computercraft.api.ComputerCraftAPI; -import dan200.computercraft.api.peripheral.IPeripheral; -import dan200.computercraft.api.peripheral.IPeripheralProvider; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.Platform; import de.srendi.advancedperipherals.lib.integrations.IPeripheralIntegration; import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.NoteBlock; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.util.LazyOptional; -import org.jetbrains.annotations.NotNull; import java.util.Comparator; import java.util.Optional; @@ -21,9 +14,9 @@ import java.util.function.Function; import java.util.function.Predicate; -public class IntegrationPeripheralProvider implements IPeripheralProvider { +public class IntegrationPeripheralProvider { - private static final String[] SUPPORTED_MODS = new String[]{"powah", "create", "mekanism", "botania"}; + private static final String[] SUPPORTED_MODS = new String[]{"mekanism"}; private static final PriorityQueue integrations = new PriorityQueue<>(Comparator.comparingInt(IPeripheralIntegration::getPriority)); @@ -91,13 +84,13 @@ public static void load() { } } - @NotNull + /*@NotNull @Override public LazyOptional getPeripheral(@NotNull Level level, @NotNull BlockPos blockPos, @NotNull Direction direction) { for (IPeripheralIntegration integration : integrations) { - if (integration.isSuitable(level, blockPos, direction)) - return LazyOptional.of(() -> integration.buildPeripheral(level, blockPos, direction)); - } - return LazyOptional.empty(); - } +// if (integration.isSuitable(level, blockPos, direction)) +// return LazyOptional.of(() -> integration.buildPeripheral(level, blockPos, direction)); +// } +// return LazyOptional.empty(); +// }*/ } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/NoteBlockIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/NoteBlockIntegration.java index b0b5c83c7..756463db6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/NoteBlockIntegration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/NoteBlockIntegration.java @@ -7,6 +7,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.NoteBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.neoforged.neoforge.common.CommonHooks; import org.jetbrains.annotations.NotNull; public class NoteBlockIntegration extends BlockIntegrationPeripheral { @@ -24,7 +26,7 @@ public String getType() { @LuaFunction(mainThread = true) public final int changeNote() { BlockState state = world.getBlockState(pos); - int newNote = net.minecraftforge.common.ForgeHooks.onNoteChange(world, pos, state, state.getValue(NoteBlock.NOTE), state.cycle(NoteBlock.NOTE).getValue(NoteBlock.NOTE)); + int newNote = CommonHooks.onNoteChange(world, pos, state, state.getValue(NoteBlock.NOTE), state.cycle(NoteBlock.NOTE).getValue(NoteBlock.NOTE)); if (newNote == -1) return -1; state = state.setValue(NoteBlock.NOTE, newNote); world.setBlock(pos, state, 3); @@ -50,6 +52,7 @@ public final int getNote() { public final void playNote() { if (world.isEmptyBlock(pos.above())) { world.blockEvent(pos, getBlock(), 0, 0); + world.gameEvent(null, GameEvent.NOTE_BLOCK_PLAY, pos); } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/AutomataCoreTier.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/AutomataCoreTier.java index 2166839f8..39f55b8ca 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/AutomataCoreTier.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/AutomataCoreTier.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.common.addons.computercraft.operations; import de.srendi.advancedperipherals.lib.metaphysics.IAutomataCoreTier; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; public enum AutomataCoreTier implements IAutomataCoreTier { TIER1(2, 2), @@ -11,8 +11,8 @@ public enum AutomataCoreTier implements IAutomataCoreTier { private final int defaultInteractionRadius; private final int defaultMaxFuelConsumptionRate; - private ForgeConfigSpec.IntValue interactionRadius; - private ForgeConfigSpec.IntValue maxFuelConsumptionRate; + private ModConfigSpec.IntValue interactionRadius; + private ModConfigSpec.IntValue maxFuelConsumptionRate; AutomataCoreTier(int defaultInteractionRadius, int defaultMaxFuelConsumptionRate) { this.defaultInteractionRadius = defaultInteractionRadius; @@ -32,7 +32,7 @@ public int getMaxFuelConsumptionRate() { } @Override - public void addToConfig(ForgeConfigSpec.Builder builder) { + public void addToConfig(ModConfigSpec.Builder builder) { interactionRadius = builder.defineInRange(settingsName() + "InteractionRadius", defaultInteractionRadius, 1, 64); maxFuelConsumptionRate = builder.defineInRange(settingsName() + "MaxFuelConsumptionRate", defaultMaxFuelConsumptionRate, 1, 32); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java index b86b1aa39..c6d9895cb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.common.addons.computercraft.operations; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.HashMap; import java.util.Map; @@ -10,15 +10,15 @@ public enum SimpleFreeOperation implements IPeripheralOperation { CHAT_MESSAGE(100); private final int defaultCooldown; - private ForgeConfigSpec.IntValue cooldown; + private ModConfigSpec.IntValue cooldown; SimpleFreeOperation(int defaultCooldown) { this.defaultCooldown = defaultCooldown; } @Override - public void addToConfig(ForgeConfigSpec.Builder builder) { - cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 1_000, Integer.MAX_VALUE); + public void addToConfig(ModConfigSpec.Builder builder) { + cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 0, Integer.MAX_VALUE); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java index 08ebd3c6b..5dc17a210 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.common.addons.computercraft.operations; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.HashMap; import java.util.Map; @@ -13,7 +13,8 @@ public enum SingleOperation implements IPeripheralOperation computerDescription() { } @Override - public void addToConfig(ForgeConfigSpec.Builder builder) { - cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 1_000, Integer.MAX_VALUE); + public void addToConfig(ModConfigSpec.Builder builder) { + cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 0, Integer.MAX_VALUE); cost = builder.defineInRange(settingsName() + "Cost", defaultCost, 0, Integer.MAX_VALUE); } public enum DistancePolicy { IGNORED(d -> 1), + LINEAR(d -> d), SQRT(d -> (int) Math.sqrt(d)); private final Function factorFunction; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java index 147b06400..7e060f148 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java @@ -2,7 +2,7 @@ import com.google.common.math.IntMath; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.HashMap; import java.util.Map; @@ -15,10 +15,10 @@ public enum SphereOperation implements IPeripheralOperation extends FuelAbility> { @@ -14,15 +15,18 @@ public TileEntityFuelAbility(@NotNull BlockEntityPeripheralOwner owner) { @Override protected boolean consumeFuel(int count) { - return owner.tileEntity.getCapability(ForgeCapabilities.ENERGY).map(storage -> { + IEnergyStorage energyStorage = owner.getLevel().getCapability(Capabilities.EnergyStorage.BLOCK, owner.getPos(), null); + if (energyStorage != null) { int energyCount = count * APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get(); - int extractedCount = storage.extractEnergy(energyCount, true); + int extractedCount = energyStorage.extractEnergy(energyCount, true); if (extractedCount == energyCount) { - storage.extractEnergy(energyCount, false); + energyStorage.extractEnergy(energyCount, false); return true; } return false; - }).orElse(false); + + } + return false; } @Override @@ -37,19 +41,24 @@ public boolean isFuelConsumptionDisable() { @Override public int getFuelCount() { - return owner.tileEntity.getCapability(ForgeCapabilities.ENERGY).map(storage -> storage.getEnergyStored() / APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get()).orElse(0); + IEnergyStorage energyStorage = owner.getLevel().getCapability(Capabilities.EnergyStorage.BLOCK, owner.getPos(), null); + if (energyStorage != null) + return energyStorage.getEnergyStored() / APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get(); + return 0; } @Override public int getFuelMaxCount() { - return owner.tileEntity.getCapability(ForgeCapabilities.ENERGY).map(storage -> storage.getMaxEnergyStored() / APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get()).orElse(0); + IEnergyStorage energyStorage = owner.getLevel().getCapability(Capabilities.EnergyStorage.BLOCK, owner.getPos(), null); + if (energyStorage != null) + return energyStorage.getEnergyStored() / APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get(); + return 0; } @Override public void addFuel(int count) { - owner.tileEntity.getCapability(ForgeCapabilities.ENERGY).ifPresent(storage -> { - int energyCount = count * APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get(); - storage.receiveEnergy(energyCount, false); - }); + IEnergyStorage energyStorage = owner.getLevel().getCapability(Capabilities.EnergyStorage.BLOCK, owner.getPos(), null); + if (energyStorage != null) + energyStorage.receiveEnergy(count * APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get(), false); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java index d3a842800..2d7446e1c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java @@ -53,13 +53,10 @@ public Direction getFacing() { return turtle.getDirection(); } - /** - * Not used for turtles - */ @NotNull @Override public FrontAndTop getOrientation() { - return FrontAndTop.NORTH_UP; + return FrontAndTop.fromFrontAndTop(getFacing(), Direction.UP); } @Nullable diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java index 086fa4fe9..9ffa730e4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java @@ -7,11 +7,11 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Property; -import net.minecraftforge.registries.ForgeRegistries; import java.util.HashMap; import java.util.Map; @@ -32,7 +32,7 @@ public boolean isEnabled() { @LuaFunction(mainThread = true) public final String getBlockName() { if (getBlockInFront().is(Blocks.AIR)) return "none"; - return ForgeRegistries.BLOCKS.getKey(getBlockInFront().getBlock()).toString(); + return BuiltInRegistries.BLOCK.getKey(getBlockInFront().getBlock()).toString(); } @LuaFunction(mainThread = true) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java index 4c323d31c..18f134a59 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java @@ -18,6 +18,7 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.events.Events; import de.srendi.advancedperipherals.common.util.CoordUtil; +import de.srendi.advancedperipherals.common.util.StringUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralFunction; import de.srendi.advancedperipherals.network.APNetworking; @@ -27,7 +28,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; -import net.minecraftforge.server.ServerLifecycleHooks; +import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; import java.util.Optional; @@ -110,8 +111,7 @@ public final MethodResult sendFormattedMessage(@NotNull IArguments arguments) th return withChatOperation(ignored -> { String message = arguments.getString(0); int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get(); - int range = arguments.optInt(4, maxRange); - range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get()); + int range = arguments.optInt(4, -1); ResourceKey dimension = getLevel().dimension(); MutableComponent component = Component.Serializer.fromJson(message); if (component == null) @@ -121,14 +121,14 @@ public final MethodResult sendFormattedMessage(@NotNull IArguments arguments) th return MethodResult.of(null, "incorrect bracket string (e.g. [], {}, <>, ...)"); MutableComponent preparedMessage = appendPrefix( - arguments.optString(1, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get()).replaceAll("&", "\u00a7"), + StringUtil.convertAndToSectionMark(arguments.optString(1, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())), arguments.optString(2, "[]"), - arguments.optString(3, "").replaceAll("&", "\u00a7") + StringUtil.convertAndToSectionMark(arguments.optString(3, "")) ).append(component); for (ServerPlayer player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) { if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.level().dimension() != dimension) continue; - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) player.sendSystemMessage(preparedMessage); } return MethodResult.of(true); @@ -140,21 +140,20 @@ public final MethodResult sendMessage(@NotNull IArguments arguments) throws LuaE return withChatOperation(ignored -> { String message = arguments.getString(0); int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get(); - int range = arguments.optInt(4, maxRange); - range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get()); + int range = arguments.optInt(4, -1); ResourceKey dimension = getLevel().dimension(); if (checkBrackets(arguments.optString(2))) return MethodResult.of(null, "incorrect bracket string (e.g. [], {}, <>, ...)"); MutableComponent preparedMessage = appendPrefix( - arguments.optString(1, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get()).replaceAll("&", "\u00a7"), + StringUtil.convertAndToSectionMark(arguments.optString(1, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())), arguments.optString(2, "[]"), - arguments.optString(3, "").replaceAll("&", "\u00a7") + StringUtil.convertAndToSectionMark(arguments.optString(3, "")) ).append(message); for (ServerPlayer player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) { if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.level().dimension() != dimension) continue; - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) player.sendSystemMessage(preparedMessage); } return MethodResult.of(true); @@ -167,8 +166,7 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum String message = arguments.getString(0); String playerName = arguments.getString(1); int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get(); - int range = arguments.optInt(5, maxRange); - range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get()); + int range = arguments.optInt(5, -1); ResourceKey dimension = getLevel().dimension(); ServerPlayer player = getPlayer(playerName); if (player == null) @@ -182,14 +180,14 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum return MethodResult.of(null, "incorrect bracket string (e.g. [], {}, <>, ...)"); MutableComponent preparedMessage = appendPrefix( - arguments.optString(2, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get()).replaceAll("&", "\u00a7"), + StringUtil.convertAndToSectionMark(arguments.optString(2, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())), arguments.optString(3, "[]"), - arguments.optString(4, "").replaceAll("&", "\u00a7") + StringUtil.convertAndToSectionMark(arguments.optString(4, "")) ).append(component); if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.level().dimension() != dimension) return MethodResult.of(false, "NOT_SAME_DIMENSION"); - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) player.sendSystemMessage(preparedMessage); return MethodResult.of(true); }); @@ -203,8 +201,7 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen String title = arguments.getString(1); String playerName = arguments.getString(2); int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get(); - int range = arguments.optInt(6, maxRange); - range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get()); + int range = arguments.optInt(6, -1); ResourceKey dimension = getLevel().dimension(); ServerPlayer player = getPlayer(playerName); if (player == null) @@ -222,17 +219,17 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen return MethodResult.of(null, "incorrect bracket string (e.g. [], {}, <>, ,,,)"); MutableComponent preparedMessage = appendPrefix( - arguments.optString(3, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get()).replaceAll("&", "\u00a7"), + StringUtil.convertAndToSectionMark(arguments.optString(3, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())), arguments.optString(4, "[]"), - arguments.optString(5, "").replaceAll("&", "\u00a7") + StringUtil.convertAndToSectionMark(arguments.optString(5, "")) ).append(messageComponent); if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.level().dimension() != dimension) return MethodResult.of(false, "NOT_SAME_DIMENSION"); - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { ToastToClientPacket packet = new ToastToClientPacket(titleComponent, preparedMessage); - APNetworking.sendTo(packet, player); + APNetworking.sendTo(player, packet); } return MethodResult.of(true); @@ -245,8 +242,7 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr String message = arguments.getString(0); String playerName = arguments.getString(1); int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get(); - int range = arguments.optInt(5, maxRange); - range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get()); + int range = arguments.optInt(5, -1); ResourceKey dimension = getLevel().dimension(); ServerPlayer player = getPlayer(playerName); if (player == null) @@ -256,14 +252,14 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr return MethodResult.of(null, "incorrect bracket string (e.g. [], {}, <>, ...)"); MutableComponent preparedMessage = appendPrefix( - arguments.optString(2, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get()).replaceAll("&", "\u00a7"), + StringUtil.convertAndToSectionMark(arguments.optString(2, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())), arguments.optString(3, "[]"), - arguments.optString(4, "").replaceAll("&", "\u00a7") + StringUtil.convertAndToSectionMark(arguments.optString(4, "")) ).append(message); if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.level().dimension() != dimension) return MethodResult.of(false, "NOT_SAME_DIMENSION"); - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) player.sendSystemMessage(preparedMessage, false); return MethodResult.of(true); }); @@ -276,8 +272,7 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw String title = arguments.getString(1); String playerName = arguments.getString(2); int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get(); - int range = arguments.optInt(6, maxRange); - range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get()); + int range = arguments.optInt(6, -1); ResourceKey dimension = getLevel().dimension(); ServerPlayer player = getPlayer(playerName); if (player == null) @@ -287,17 +282,17 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw return MethodResult.of(null, "incorrect bracket string (e.g. [], {}, <>, ...)"); MutableComponent preparedMessage = appendPrefix( - arguments.optString(3, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get()).replaceAll("&", "\u00a7"), + StringUtil.convertAndToSectionMark(arguments.optString(3, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())), arguments.optString(4, "[]"), - arguments.optString(5, "").replaceAll("&", "\u00a7") + StringUtil.convertAndToSectionMark(arguments.optString(5, "")) ).append(message); if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.level().dimension() != dimension) return MethodResult.of(false, "NOT_SAME_DIMENSION"); - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { ToastToClientPacket packet = new ToastToClientPacket(Component.literal(title), preparedMessage); - APNetworking.sendTo(packet, player); + APNetworking.sendTo(player, packet); } return MethodResult.of(true); }); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java index b244e3eb1..94829b12f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java @@ -20,7 +20,7 @@ public class ChunkyPeripheral extends BasePeripheral { public static final String PERIPHERAL_TYPE = "chunky"; private static final String UUID_TAG = "uuid"; - private @Nullable ChunkPos loadedCentralChunk; + private @Nullable ChunkPos loadedCentralChunk = null; public ChunkyPeripheral(ITurtleAccess turtle, TurtleSide side) { super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(turtle, side)); @@ -45,36 +45,51 @@ public boolean isEnabled() { } public void updateChunkState() { + // TODO: should find someway to update after turtle moved or while moving, but not every tick ServerLevel level = (ServerLevel) getLevel(); ChunkManager manager = ChunkManager.get(level); ChunkPos currentChunk = getChunkPos(); - if (loadedCentralChunk == null || !loadedCentralChunk.equals(currentChunk)) { - setLoadedChunk(currentChunk, manager, level); - } else { - manager.touch(getUUID()); - } + setLoadedChunk(currentChunk, manager, level); + manager.touch(getUUID()); } protected void setLoadedChunk(@Nullable ChunkPos newChunk, ChunkManager manager, ServerLevel level) { if (loadedCentralChunk != null) { - manager.removeForceChunk(level, getUUID(), loadedCentralChunk); - //Should not be used - //level.setChunkForced(loadedChunk.x, loadedChunk.z, false); + if (loadedCentralChunk.equals(newChunk)) { + return; + } + manager.removeForceChunk(level, getUUID()); + // Should not be used + // level.setChunkForced(loadedChunk.x, loadedChunk.z, false); loadedCentralChunk = null; } if (newChunk != null) { loadedCentralChunk = newChunk; manager.addForceChunk(level, getUUID(), loadedCentralChunk); - //Should not be used - //level.setChunkForced(newChunk.x, newChunk.z, true); + // Should not be used + // level.setChunkForced(newChunk.x, newChunk.z, true); } } @Override - public void detach(@NotNull IComputerAccess computer) { - super.detach(computer); + public void attach(IComputerAccess computer) { + super.attach(computer); ServerLevel level = (ServerLevel) owner.getLevel(); ChunkManager manager = ChunkManager.get(Objects.requireNonNull(level)); - setLoadedChunk(null, manager, level); + ChunkPos currentChunk = getChunkPos(); + setLoadedChunk(currentChunk, manager, level); + } + + @Override + public void detach(@NotNull IComputerAccess computer) { + super.detach(computer); + // Should not remove the loaded chunk when detaching, + // because CC:T will detach all peripherals before server stopped. + // So the chunk record will never be saved if we removed the chunk record when detaching. + // The records will be automatically removed by the ChunkManager if they have not been touched a while ago. + + // ServerLevel level = (ServerLevel) owner.getLevel(); + // ChunkManager manager = ChunkManager.get(Objects.requireNonNull(level)); + // setLoadedChunk(null, manager, level); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java deleted file mode 100644 index d1e29a9c2..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java +++ /dev/null @@ -1,298 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; - -import com.minecolonies.api.IMinecoloniesAPI; -import com.minecolonies.api.colony.ICivilianData; -import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.IVisitorData; -import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.colony.managers.interfaces.IRegisteredStructureManager; -import com.minecolonies.api.colony.requestsystem.manager.IRequestManager; -import com.minecolonies.api.colony.requestsystem.request.IRequest; -import com.minecolonies.api.colony.requestsystem.requestable.IDeliverable; -import com.minecolonies.api.colony.requestsystem.resolver.player.IPlayerRequestResolver; -import com.minecolonies.api.colony.requestsystem.resolver.retrying.IRetryingRequestResolver; -import com.minecolonies.api.colony.requestsystem.token.IToken; -import com.minecolonies.api.colony.workorders.IWorkOrder; -import com.minecolonies.api.research.IGlobalResearchTree; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import dan200.computercraft.api.lua.LuaException; -import dan200.computercraft.api.lua.LuaFunction; -import dan200.computercraft.api.pocket.IPocketAccess; -import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.PocketPeripheralOwner; -import de.srendi.advancedperipherals.common.addons.minecolonies.MineColonies; -import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; -import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.common.util.LuaConverter; -import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fml.ModList; - -import java.util.*; -import java.util.stream.Collectors; - -public class ColonyPeripheral extends BasePeripheral { - - public static final String PERIPHERAL_TYPE = "colonyIntegrator"; - - protected boolean hasPermission = true; - - public ColonyPeripheral(PeripheralBlockEntity tileEntity) { - super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); - } - - public ColonyPeripheral(IPocketAccess access) { - super(PERIPHERAL_TYPE, new PocketPeripheralOwner(access)); - } - - @Override - public boolean isEnabled() { - return ModList.get().isLoaded("minecolonies") && APConfig.PERIPHERALS_CONFIG.enableColonyIntegrator.get(); - } - - @LuaFunction(mainThread = true) - public final boolean isInColony() { - return getColonyWithoutPermission() != null; - } - - @LuaFunction(mainThread = true) - public final boolean isWithin(Map pos) throws LuaException { - IColony colony = getColonyWithoutPermission(); - - if(colony == null) - return false; - - if (!(pos.containsKey("x") && pos.containsKey("y") && pos.containsKey("z"))) - throw new LuaException("Coordinates expected"); - BlockPos p = new BlockPos(((Number) pos.get("x")).intValue(), ((Number) pos.get("y")).intValue(), ((Number) pos.get("z")).intValue()); - - return colony.isCoordInColony(this.getLevel(), p); - } - - @LuaFunction(mainThread = true) - public final Object getCitizens() throws LuaException { - IColony colony = getColony(); - - List list = new ArrayList<>(); - colony.getCitizenManager().getCitizens().forEach(citizen -> { - list.add(MineColonies.citizenToObject(citizen)); - }); - - return list; - } - - @LuaFunction(mainThread = true) - public final int amountOfConstructionSites() throws LuaException { - return MineColonies.getAmountOfConstructionSites(getColony()); - } - - @LuaFunction(mainThread = true) - public final int getColonyID() throws LuaException { - IColony colony = getColony(); - - return colony.getID(); - } - - @LuaFunction(mainThread = true) - public final String getColonyName() throws LuaException { - IColony colony = getColony(); - - return colony.getName(); - } - - @LuaFunction(mainThread = true) - public final String getColonyStyle() throws LuaException { - IColony colony = getColony(); - - return colony.getStructurePack(); - } - - @LuaFunction(mainThread = true) - public final boolean isActive() throws LuaException { - IColony colony = getColony(); - - return colony.isActive(); - } - - @LuaFunction(mainThread = true) - public final double getHappiness() throws LuaException { - IColony colony = getColony(); - - return colony.getOverallHappiness(); - } - - @LuaFunction(mainThread = true) - public final Object getLocation() throws LuaException { - IColony colony = getColony(); - - return LuaConverter.posToObject(colony.getCenter()); - } - - @LuaFunction(mainThread = true) - public final boolean isUnderAttack() throws LuaException { - IColony colony = getColony(); - - return colony.isColonyUnderAttack(); - } - - @LuaFunction(mainThread = true) - public final boolean isUnderRaid() throws LuaException { - IColony colony = getColony(); - - return colony.getRaiderManager().isRaided(); - } - - @LuaFunction(mainThread = true) - public final int amountOfCitizens() throws LuaException { - IColony colony = getColony(); - - return colony.getCitizenManager().getCurrentCitizenCount(); - } - - @LuaFunction(mainThread = true) - public final int maxOfCitizens() throws LuaException { - IColony colony = getColony(); - - return colony.getCitizenManager().getMaxCitizens(); - } - - @LuaFunction(mainThread = true) - public final int amountOfGraves() throws LuaException { - IColony colony = getColony(); - - return colony.getGraveManager().getGraves().size(); - } - - @LuaFunction(mainThread = true) - public final Object getVisitors() throws LuaException { - IColony colony = getColony(); - - List list = new ArrayList<>(); - for (ICivilianData civilian : colony.getVisitorManager().getCivilianDataMap().values()) { - if (!(civilian instanceof IVisitorData visitorData)) - continue; - list.add(MineColonies.visitorToObject(visitorData)); - } - return list; - } - - @LuaFunction(mainThread = true) - public final Object getBuildings() throws LuaException { - IColony colony = getColony(); - - IRegisteredStructureManager manager = colony.getBuildingManager(); - List buildingData = new ArrayList<>(); - for (Map.Entry building : manager.getBuildings().entrySet()) { - buildingData.add(MineColonies.buildingToObject(manager, building.getValue(), building.getKey())); - } - - return buildingData; - } - - @LuaFunction(mainThread = true) - public final Object getWorkOrders() throws LuaException { - IColony colony = getColony(); - - List worksData = new ArrayList<>(); - for (IWorkOrder workOrder : colony.getWorkManager().getWorkOrders().values()) - worksData.add(MineColonies.workOrderToObject(workOrder)); - - return worksData; - } - - @LuaFunction(mainThread = true) - public final Object getResearch() throws LuaException { - IColony colony = getColony(); - - IGlobalResearchTree globalTree = IGlobalResearchTree.getInstance(); - - Map result = new HashMap<>(); - for (ResourceLocation branch : globalTree.getBranches()) { - try { - result.put(branch.toString(), MineColonies.getResearch(branch, globalTree.getPrimaryResearch(branch), colony)); - } catch (CommandSyntaxException ex) { - AdvancedPeripherals.debug("Error getting research for branch " + branch + ": " + ex.getMessage(), org.apache.logging.log4j.Level.WARN); - ex.printStackTrace(); - } - } - - return result; - } - - @LuaFunction(mainThread = true) - public final Object getWorkOrderResources(int id) throws LuaException { - IColony colony = getColony(); - - IWorkOrder workOrder = colony.getWorkManager().getWorkOrder(id); - if (workOrder == null) return null; - - return MineColonies.builderResourcesToObject(colony, workOrder.getClaimedBy()); - } - - @LuaFunction(mainThread = true) - public final Object getBuilderResources(Map pos) throws LuaException { - IColony colony = getColony(); - - if (!(pos.containsKey("x") && pos.containsKey("y") && pos.containsKey("z"))) - throw new LuaException("Coordinates expected"); - BlockPos blockPos = LuaConverter.convertToBlockPos(pos); - - return MineColonies.builderResourcesToObject(colony, blockPos); - } - - @LuaFunction(mainThread = true) - public final Object getRequests() throws LuaException { - IColony colony = getColony(); - - IRequestManager requestManager = colony.getRequestManager(); - //All requests assigned to players - IPlayerRequestResolver playerResolver = requestManager.getPlayerResolver(); - //All requests not assigned to players - IRetryingRequestResolver requestResolver = requestManager.getRetryingRequestResolver(); - - Set> tokens = new HashSet<>(); - tokens.addAll(playerResolver.getAllAssignedRequests()); - tokens.addAll(requestResolver.getAllAssignedRequests()); - - List> requests = new ArrayList<>(); - for (IToken token : tokens) { - IRequest request = requestManager.getRequestForToken(token); - if (request.getRequest() instanceof IDeliverable) - requests.add(request); - } - - List result = new ArrayList<>(); - requests.forEach(request -> { - IDeliverable deliverableRequest = (IDeliverable) request.getRequest(); - Map map = new HashMap<>(); - map.put("id", request.getId().getIdentifier().toString()); - map.put("name", ChatFormatting.stripFormatting(request.getShortDisplayString().getString())); - map.put("desc", ChatFormatting.stripFormatting(request.getLongDisplayString().getString())); - map.put("state", request.getState().toString()); - map.put("count", deliverableRequest.getCount()); - map.put("minCount", deliverableRequest.getMinimumCount()); - map.put("items", request.getDisplayStacks().stream().map(LuaConverter::stackToObject).collect(Collectors.toList())); - map.put("target", request.getRequester().getRequesterDisplayName(requestManager, request).getString()); - result.add(map); - }); - return result; - } - - private IColony getColony() throws LuaException { - IMinecoloniesAPI api = IMinecoloniesAPI.getInstance(); - IColony colony = api.getColonyManager().getColonyByPosFromWorld(getLevel(), getPos()); - this.hasPermission = !(owner instanceof PocketPeripheralOwner) || MineColonies.hasAccess(owner.getOwner(), colony); - if (colony == null || !this.hasPermission) - throw new LuaException("Here is no colony or you don't have the right permissions"); - return colony; - } - - private IColony getColonyWithoutPermission() { - IMinecoloniesAPI api = IMinecoloniesAPI.getInstance(); - return api.getColonyManager().getColonyByPosFromWorld(getLevel(), getPos()); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/CompassPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/CompassPeripheral.java index fb24c8c1a..5ee6e8eee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/CompassPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/CompassPeripheral.java @@ -11,8 +11,12 @@ public class CompassPeripheral extends BasePeripheral { public static final String PERIPHERAL_TYPE = "compass"; + protected CompassPeripheral(TurtlePeripheralOwner owner) { + super(PERIPHERAL_TYPE, owner); + } + public CompassPeripheral(ITurtleAccess turtle, TurtleSide side) { - super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(turtle, side)); + this(new TurtlePeripheralOwner(turtle, side)); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index ef0b1817e..7113c7614 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -32,13 +32,20 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.server.ServerLifecycleHooks; +import net.neoforged.bus.api.Event; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.player.SleepingTimeCheckEvent; +import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.function.Function; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperation.SCAN_ENTITIES; @@ -238,7 +245,7 @@ public final MethodResult canSleepPlayer(String playername) { return MethodResult.of(false, "not_allowed_in_dimension"); SleepingTimeCheckEvent evt = new SleepingTimeCheckEvent(player, Optional.empty()); - MinecraftForge.EVENT_BUS.post(evt); + NeoForge.EVENT_BUS.post(evt); Event.Result canContinueSleep = evt.getResult(); if (canContinueSleep == Event.Result.DEFAULT) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java index 438815585..fbd0cd492 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java @@ -18,14 +18,14 @@ import de.srendi.advancedperipherals.common.util.ScanUtils; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraftforge.common.Tags; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.Tags; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -69,7 +69,7 @@ public GeoScannerPeripheral(IPocketAccess pocket) { data.put("z", pos.getZ()); Block block = state.getBlock(); - ResourceLocation name = ForgeRegistries.BLOCKS.getKey(block); + ResourceLocation name = BuiltInRegistries.BLOCK.getKey(block); data.put("name", name == null ? "unknown" : name.toString()); data.put("tags", LuaConverter.tagsToList(() -> block.builtInRegistryHolder().tags())); @@ -110,7 +110,7 @@ public final MethodResult chunkAnalyze() throws LuaException { for (int z = chunkPos.getMinBlockZ(); z <= chunkPos.getMaxBlockZ(); z++) { for (int y = level.dimensionType().minY(); y < level.dimensionType().height(); y++) { BlockState block = chunk.getBlockState(new BlockPos(x, y, z)); - ResourceLocation name = ForgeRegistries.BLOCKS.getKey(block.getBlock()); + ResourceLocation name = BuiltInRegistries.BLOCK.getKey(block.getBlock()); if (name != null) { if (block.is(Tags.Blocks.ORES)) { data.put(name.toString(), data.getOrDefault(name.toString(), 0) + 1); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java index 73e9213a6..59eba61bf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java @@ -18,11 +18,12 @@ import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.PlayerArmorInvWrapper; -import net.minecraftforge.items.wrapper.PlayerInvWrapper; -import net.minecraftforge.items.wrapper.PlayerOffhandInvWrapper; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.PlayerArmorInvWrapper; +import net.neoforged.neoforge.items.wrapper.PlayerInvWrapper; +import net.neoforged.neoforge.items.wrapper.PlayerOffhandInvWrapper; +import org.apache.logging.log4j.Level; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -58,22 +59,23 @@ public final MethodResult addItemToPlayer(String invDirection, Map item) t if (filter.rightPresent()) return MethodResult.of(0, filter.getRight()); - return MethodResult.of(addItemCommon(invDirection, filter.getLeft()), null); + return addItemCommon(invDirection, filter.getLeft()); } - private int addItemCommon(String invDirection, ItemFilter filter) throws LuaException { + private MethodResult addItemCommon(String invDirection, ItemFilter filter) throws LuaException { Direction direction = validateSide(invDirection); - BlockEntity targetEntity = owner.getLevel().getBlockEntity(owner.getPos().relative(direction)); - IItemHandler inventoryFrom = targetEntity != null ? targetEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, direction).resolve().orElse(null) : null; Pair inventoryTo = getHandlerFromSlot(filter.getToSlot()); + IItemHandler inventoryFrom = getLevel().getCapability(Capabilities.ItemHandler.BLOCK, owner.getPos().relative(direction), direction.getOpposite()); + if (inventoryFrom == null) + return MethodResult.of(0, "INVENTORY_FROM_INVALID"); inventoryTo.ifRightPresent(slot -> filter.toSlot = slot); //if (invSlot >= inventoryTo.getSlots() || invSlot < 0) // throw new LuaException("Inventory out of bounds " + invSlot + " (max: " + (inventoryTo.getSlots() - 1) + ")"); - return InventoryUtil.moveItem(inventoryFrom, inventoryTo.getLeft(), filter); + return MethodResult.of(InventoryUtil.moveItem(inventoryFrom, inventoryTo.getLeft(), filter)); } @LuaFunction(mainThread = true) @@ -88,9 +90,8 @@ public final MethodResult removeItemFromPlayer(String invDirection, Map it private MethodResult removeItemCommon(String invDirection, ItemFilter filter) throws LuaException { Direction direction = validateSide(invDirection); - BlockEntity targetEntity = owner.getLevel().getBlockEntity(owner.getPos().relative(direction)); Pair inventoryFrom = getHandlerFromSlot(filter.getFromSlot()); - IItemHandler inventoryTo = targetEntity != null ? targetEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, direction).resolve().orElse(null) : null; + IItemHandler inventoryTo = getLevel().getCapability(Capabilities.ItemHandler.BLOCK, owner.getPos().relative(direction), direction.getOpposite()); if (inventoryTo == null) return MethodResult.of(0, "INVENTORY_TO_INVALID"); @@ -119,7 +120,7 @@ public final MethodResult getItemsChest(String target) throws LuaException { Direction direction = validateSide(target); BlockEntity targetEntity = owner.getLevel().getBlockEntity(owner.getPos().relative(direction)); - IItemHandler inventoryTo = targetEntity != null ? targetEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, direction).resolve().orElse(null) : null; + IItemHandler inventoryTo = null; //targetEntity != null ? targetEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, direction).resolve().orElse(null) : null; if (inventoryTo == null) return MethodResult.of(null, "INVENTORY_TO_INVALID"); @@ -189,12 +190,12 @@ public final int getFreeSlot() throws LuaException { @LuaFunction(mainThread = true) public final Map getItemInHand() throws LuaException { - return LuaConverter.stackToObject(getOwnerPlayer().getMainHandItem()); + return LuaConverter.stackToObject(getOwnerPlayer().getMainHandItem().copy()); } @LuaFunction(mainThread = true) public final Map getItemInOffHand() throws LuaException { - return LuaConverter.stackToObject(getOwnerPlayer().getOffhandItem()); + return LuaConverter.stackToObject(getOwnerPlayer().getOffhandItem().copy()); } private Player getOwnerPlayer() throws LuaException { @@ -249,7 +250,7 @@ public static int getSlotForItem(ItemStack stack) { } } } - AdvancedPeripherals.LOGGER.warn("Tried to get armor item slot for non armor item " + stack + ". Returning 0"); + AdvancedPeripherals.debug("Tried to get armor item slot for non armor item " + stack + ". Returning 0", Level.WARN); return 0; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index 731e451f4..14cf55fd1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -26,8 +26,8 @@ import de.srendi.advancedperipherals.common.util.inventory.InventoryUtil; import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -420,7 +420,10 @@ public final MethodResult getItem(IArguments arguments) throws LuaException { if (parsedFilter.isEmpty()) return MethodResult.of(null, "EMPTY_FILTER"); - return MethodResult.of(AppEngApi.getObjectFromStack(AppEngApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter), getCraftingService())); + Pair item = AppEngApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter); + if (item.getRight() == null && item.getLeft() == 0) + return MethodResult.of(null, "NOT_FOUND"); + return MethodResult.of(AppEngApi.getObjectFromStack(item, getCraftingService())); } @LuaFunction(mainThread = true) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java index 12d7dd184..225f90fcd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java @@ -21,9 +21,13 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraftforge.server.ServerLifecycleHooks; +import net.neoforged.neoforge.server.ServerLifecycleHooks; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class PlayerDetectorPeripheral extends BasePeripheral { @@ -97,7 +101,7 @@ public final List getPlayersInRange(int range) { for (ServerPlayer player : getPlayers()) { if (!isAllowedMultiDimensional() && player.level().dimension() != dimension) continue; - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) playersName.add(player.getName().getString()); } return playersName; @@ -142,7 +146,7 @@ public final boolean isPlayersInRange(int range) { for (ServerPlayer player : getPlayers()) { if (!isAllowedMultiDimensional() && player.level().dimension() != dimension) continue; - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) return true; + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) return true; } return false; } @@ -185,7 +189,7 @@ public final boolean isPlayerInRange(int range, String username) { for (Player player : getPlayers()) { if (!isAllowedMultiDimensional() && player.level().dimension() != dimension) continue; - if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) { + if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) { if(player.getName().getString().equals(username)) return true; } @@ -250,16 +254,17 @@ public final Map getPlayerPos(IArguments arguments) throws LuaEx int decimals = Math.min(arguments.optInt(1, 0), 4); - info.put("x", Math.floor(x * Math.pow(10, decimals)) / Math.pow(10, decimals)); - info.put("y", Math.floor(y * Math.pow(10, decimals)) / Math.pow(10, decimals)); - info.put("z", Math.floor(z * Math.pow(10, decimals)) / Math.pow(10, decimals)); + final double unit = Math.pow(10, decimals); + info.put("x", Math.floor(x * unit) / unit); + info.put("y", Math.floor(y * unit) / unit); + info.put("z", Math.floor(z * unit) / unit); if (APConfig.PERIPHERALS_CONFIG.morePlayerInformation.get()) { info.put("yaw", existingPlayer.yRotO); info.put("pitch", existingPlayer.xRotO); info.put("dimension", existingPlayer.level().dimension().location().toString()); info.put("eyeHeight", existingPlayer.getEyeHeight()); info.put("health", existingPlayer.getHealth()); - info.put("maxHeatlh", existingPlayer.getMaxHealth()); + info.put("maxHealth", existingPlayer.getMaxHealth()); info.put("airSupply", existingPlayer.getAirSupply()); info.put("respawnPosition", LuaConverter.posToObject(existingPlayer.getRespawnPosition())); info.put("respawnDimension", existingPlayer.getRespawnDimension().location().toString()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index e298a59f3..d5afa7248 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -18,12 +18,16 @@ import de.srendi.advancedperipherals.common.blocks.blockentities.RsBridgeEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; -import de.srendi.advancedperipherals.common.util.inventory.*; +import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; +import de.srendi.advancedperipherals.common.util.inventory.FluidUtil; +import de.srendi.advancedperipherals.common.util.inventory.InventoryUtil; +import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; +import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -74,7 +78,7 @@ public final MethodResult listCraftableItems() { return notConnected(); List items = new ArrayList<>(); - RefinedStorage.getCraftableItems(getNetwork()).forEach(item -> items.add(RefinedStorage.getObjectFromStack(item.copy(), getNetwork()))); + RefinedStorage.getCraftableItems(getNetwork()).forEach(item -> items.add(RefinedStorage.getObjectFromStack(item, getNetwork()))); return MethodResult.of(items); } @@ -299,7 +303,10 @@ public final MethodResult getItem(IArguments arguments) throws LuaException { if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - return MethodResult.of(RefinedStorage.getObjectFromStack(RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); + ItemStack item = RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); + if (item.isEmpty()) + return MethodResult.of(null, "NOT_FOUND"); + return MethodResult.of(RefinedStorage.getObjectFromStack(item, getNetwork())); } @LuaFunction(mainThread = true) @@ -313,7 +320,7 @@ public final MethodResult craftItem(IArguments arguments) throws LuaException { return MethodResult.of(null, filter.getRight()); ItemStack stack = RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); - if (stack == null) + if (stack.isEmpty()) return MethodResult.of(null, "NOT_CRAFTABLE"); ICalculationResult result = getNetwork().getCraftingManager().create(stack, filter.getLeft().getCount()); @@ -334,7 +341,7 @@ public final MethodResult craftFluid(IArguments arguments) throws LuaException { return MethodResult.of(null, filter.getRight()); FluidStack stack = RefinedStorage.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); - if (stack == null) + if (stack.isEmpty()) return MethodResult.of(null, "NOT_CRAFTABLE"); ICalculationResult result = getNetwork().getCraftingManager().create(stack, filter.getLeft().getCount()); @@ -355,7 +362,7 @@ public final MethodResult isItemCrafting(IArguments arguments) throws LuaExcepti return MethodResult.of(null, filter.getRight()); ItemStack stack = RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); - if (stack == null) + if (stack.isEmpty()) return MethodResult.of(null, "NOT_CRAFTABLE"); for (ICraftingTask task : getNetwork().getCraftingManager().getTasks()) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index f4022a219..b61417e15 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -1,19 +1,49 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.api.turtle.ITurtleAccess; +import dan200.computercraft.api.turtle.TurtleSide; +import dan200.computercraft.core.apis.TableHelper; +import dan200.computercraft.shared.turtle.core.TurtlePlayer; +import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.CompassPeripheral; +import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.StringUtil; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SignItem; +import net.minecraft.world.item.context.DirectionalPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.entity.SignText; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.CommonHooks; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.DIG; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.USE_ON_BLOCK; +import java.util.Collections; +import java.util.Map; +import java.util.stream.Stream; + +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.*; public class AutomataBlockHandPlugin extends AutomataCorePlugin { @@ -27,32 +57,181 @@ public AutomataBlockHandPlugin(AutomataCorePeripheral automataCore) { } @LuaFunction(mainThread = true) - public final MethodResult digBlock() throws LuaException { + public final MethodResult digBlock(@NotNull IArguments arguments) throws LuaException { + Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + boolean sneak = TableHelper.optBooleanField(opts, "sneak", false); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; return automataCore.withOperation(DIG, context -> { TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); - Pair result = owner.withPlayer(apFakePlayer -> apFakePlayer.digBlock(owner.getFacing().getOpposite())); + Pair result = owner.withPlayer(APFakePlayer.wrapActionWithShiftKey(sneak, APFakePlayer.wrapActionWithRot(yaw, pitch, APFakePlayer::digBlock))); if (!result.getLeft()) { return MethodResult.of(null, result.getRight()); } - if (automataCore.hasAttribute(AutomataCorePeripheral.ATTR_STORING_TOOL_DURABILITY)) + if (automataCore.hasAttribute(AutomataCorePeripheral.ATTR_STORING_TOOL_DURABILITY)) { selectedTool.setDamageValue(previousDamageValue); + } return MethodResult.of(true); }); } @LuaFunction(mainThread = true) - public final MethodResult useOnBlock() throws LuaException { + public final MethodResult useOnBlock(@NotNull IArguments arguments) throws LuaException { + Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + boolean sneak = TableHelper.optBooleanField(opts, "sneak", false); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; return automataCore.withOperation(USE_ON_BLOCK, context -> { TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); - InteractionResult result = owner.withPlayer(APFakePlayer::useOnBlock); - if (automataCore.hasAttribute(AutomataCorePeripheral.ATTR_STORING_TOOL_DURABILITY)) + InteractionResult result = owner.withPlayer(APFakePlayer.wrapActionWithShiftKey(sneak, APFakePlayer.wrapActionWithRot(yaw, pitch, APFakePlayer::useOnBlock))); + if (automataCore.hasAttribute(AutomataCorePeripheral.ATTR_STORING_TOOL_DURABILITY)) { selectedTool.setDamageValue(previousDamageValue); - return MethodResult.of(true, result.toString()); + } + return MethodResult.of(result.consumesAction(), result.toString()); }); } + /** + * placeBlock method will let turtle place a block with more details when compass has equipped. + * It should not able to place fluids / use any item, because compass do not recognize them. + * + * @param options A table contains how to place the block: + * x: the x offset relative to the turtle. Default 0 + * y: the y offset relative to the turtle. Default 0 + * z: the z offset relative to the turtle. Default 0 + * anchor: the direction the block is going to hanging on. Default is the direction of the turtle + * front: the direction the block is going to facing. Default is same as anchor + * top: the direction the block's top is going to facing. Default is TOP + * text: the text going to write on the sign's front side. Default is null + * backText: the text going to write on the sign's back side. Default is null + */ + @LuaFunction(mainThread = true) + public MethodResult placeBlock(@NotNull Map options) throws LuaException { + ITurtleAccess turtle = automataCore.getPeripheralOwner().getTurtle(); + CompassPeripheral compassPeripheral = Stream.of(TurtleSide.values()).map(side -> turtle.getPeripheral(side) instanceof CompassPeripheral compass ? compass : null).filter(peripheral -> peripheral != null).findFirst().orElse(null); + if (compassPeripheral == null || !compassPeripheral.isEnabled()) { + return MethodResult.of(false, "COMPASS_NOT_EQUIPPED"); + } + int x = TableHelper.optIntField(options, "x", 0); + int y = TableHelper.optIntField(options, "y", 0); + int z = TableHelper.optIntField(options, "z", 0); + final int maxDist = APConfig.PERIPHERALS_CONFIG.compassAccurePlaceRadius.get(); + final int freeDist = APConfig.PERIPHERALS_CONFIG.compassAccurePlaceFreeRadius.get(); + if (Math.abs(x) > maxDist || Math.abs(y) > maxDist || Math.abs(z) > maxDist) { + return MethodResult.of(null, "OUT_OF_RANGE"); + } + String anchor = TableHelper.optStringField(options, "anchor", null); + String front = TableHelper.optStringField(options, "front", null); + String top = TableHelper.optStringField(options, "top", null); + Direction anchorDir = anchor != null ? automataCore.validateSide(anchor) : null; + Direction frontDir = front != null ? automataCore.validateSide(front) : null; + Direction topDir = top != null ? automataCore.validateSide(top) : null; + + int distance = + Math.max(0, Math.abs(x) - freeDist) + + Math.max(0, Math.abs(y) - freeDist) + + Math.max(0, Math.abs(z) - freeDist); + return automataCore.withOperation(ACCURE_PLACE, new SingleOperationContext(1, distance), context -> { + ItemStack stack = turtle.getInventory().getItem(turtle.getSelectedSlot()); + if (stack.isEmpty()) { + return MethodResult.of(null, "EMPTY_SLOT"); + } + BlockPos position = turtle.getPosition().offset(x, y, z); + String err = deployOn(stack, position, anchorDir, frontDir, topDir, options); + if (err != null) { + return MethodResult.of(null, err); + } + return MethodResult.of(true); + }, null); + } + + /** + * @return A nullable string of the error. null means the operation is successful + */ + @Nullable + private String deployOn(ItemStack stack, BlockPos position, Direction anchor, Direction front, Direction top, Map options) throws LuaException { + ITurtleAccess turtle = automataCore.getPeripheralOwner().getTurtle(); + Level world = turtle.getLevel(); + if (anchor == null) { + anchor = turtle.getDirection(); + } + if (front == null) { + front = anchor; + } + if (top == null) { + top = Direction.UP; + } + TurtlePlayer turtlePlayer = TurtlePlayer.getWithPosition(turtle, position, front.getOpposite()); + BlockHitResult hit = BlockHitResult.miss(Vec3.atCenterOf(position), top, position); + AdvanceDirectionalPlaceContext context = new AdvanceDirectionalPlaceContext(world, position, anchor, front, stack, top); + PlayerInteractEvent.RightClickBlock event = CommonHooks.onRightClickBlock(turtlePlayer.player(), InteractionHand.MAIN_HAND, position, hit); + if (event.isCanceled()) { + return "EVENT_CANCELED"; + } + Item item = stack.getItem(); + if (!(item instanceof BlockItem)) { + return "NOT_BLOCK"; + } + BlockItem block = (BlockItem) item; + InteractionResult res = block.place(context); + if (!res.consumesAction()) { + return "CANNOT_PLACE"; + } + if (block instanceof SignItem) { + BlockEntity blockEntity = world.getBlockEntity(position); + if (blockEntity instanceof SignBlockEntity sign) { + String text = StringUtil.convertAndToSectionMark(TableHelper.optStringField(options, "text", null)); + setSignText(world, sign, text, true); + String backText = StringUtil.convertAndToSectionMark(TableHelper.optStringField(options, "backText", null)); + setSignText(world, sign, backText, false); + } + } + return null; + } + + private static void setSignText(Level world, SignBlockEntity block, String text, boolean front) { + SignText sign = block.getText(front); + if (text == null) { + for (int i = 0; i < SignText.LINES; i++) { + sign.setMessage(i, Component.literal("")); + } + } else { + String[] lines = text.split("\n"); + for (int i = 0; i < SignText.LINES; i++) { + sign.setMessage(i, Component.literal(i < lines.length ? lines[i] : "")); + } + } + block.setChanged(); + world.sendBlockUpdated(block.getBlockPos(), block.getBlockState(), block.getBlockState(), Block.UPDATE_ALL); + } + + private static class AdvanceDirectionalPlaceContext extends DirectionalPlaceContext { + private final Direction anchor; + + AdvanceDirectionalPlaceContext(Level world, BlockPos pos, Direction anchor, Direction front, ItemStack stack, Direction top) { + super(world, pos, front, stack, top); + this.anchor = anchor; + } + + @Override + public Direction getNearestLookingDirection() { + return this.anchor; + } + + @Override + public Direction[] getNearestLookingDirections() { + return switch (this.anchor) { + case DOWN -> new Direction[]{Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST, Direction.UP}; + case UP -> new Direction[]{Direction.UP, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST, Direction.DOWN}; + case NORTH -> new Direction[]{Direction.NORTH, Direction.EAST, Direction.WEST, Direction.UP, Direction.DOWN, Direction.SOUTH}; + case SOUTH -> new Direction[]{Direction.SOUTH, Direction.EAST, Direction.WEST, Direction.UP, Direction.DOWN, Direction.NORTH}; + case WEST -> new Direction[]{Direction.WEST, Direction.SOUTH, Direction.UP, Direction.NORTH, Direction.DOWN, Direction.EAST}; + case EAST -> new Direction[]{Direction.EAST, Direction.SOUTH, Direction.UP, Direction.NORTH, Direction.DOWN, Direction.WEST}; + }; + } + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java index 2ffdb4d43..ac048fc3a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java @@ -10,7 +10,8 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -31,19 +32,22 @@ public final MethodResult chargeTurtle(@NotNull IArguments arguments) throws Lua ItemStack stack = owner.getToolInMainHand(); int fuel = arguments.optInt(0, -1); - return stack.getCapability(ForgeCapabilities.ENERGY).map(storage -> { + + IEnergyStorage energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (energyStorage != null) { int availableFuelSpace = fuelAbility.getFuelMaxCount() - fuelAbility.getFuelCount(); int requestedRF; if (fuel != -1) { requestedRF = fuel * APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get(); } else { - requestedRF = storage.getEnergyStored(); + requestedRF = energyStorage.getEnergyStored(); } - int realConsumedRF = storage.extractEnergy(Math.min(requestedRF, availableFuelSpace * APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get()), false); + int realConsumedRF = energyStorage.extractEnergy(Math.min(requestedRF, availableFuelSpace * APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get()), false); int receivedFuel = realConsumedRF / APConfig.METAPHYSICS_CONFIG.energyToFuelRate.get(); fuelAbility.addFuel(receivedFuel); automataCore.addRotationCycle(); return MethodResult.of(true, receivedFuel); - }).orElse(MethodResult.of(null, "Item should provide energy ...")); + } + return MethodResult.of(false); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java index 1bc139df1..e5e4514e1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java @@ -1,10 +1,13 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.core.apis.TableHelper; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -15,9 +18,10 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -39,24 +43,32 @@ public AutomataEntityHandPlugin(AutomataCorePeripheral automataCore, Predicate opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + boolean sneak = TableHelper.optBooleanField(opts, "sneak", false); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; return automataCore.withOperation(USE_ON_ANIMAL, context -> { TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); - InteractionResult result = owner.withPlayer(player -> player.useOnFilteredEntity(suitableEntity)); + InteractionResult result = owner.withPlayer(APFakePlayer.wrapActionWithShiftKey(sneak, APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.useOnFilteredEntity(suitableEntity)))); if (automataCore.hasAttribute(AutomataCorePeripheral.ATTR_STORING_TOOL_DURABILITY)) selectedTool.setDamageValue(previousDamageValue); - return MethodResult.of(true, result.toString()); + return MethodResult.of(result.consumesAction(), result.toString()); }); } @LuaFunction(mainThread = true) - public final MethodResult inspectAnimal() { + public final MethodResult inspectAnimal(@NotNull IArguments arguments) throws LuaException { + Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; + automataCore.addRotationCycle(); TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); - HitResult entityHit = owner.withPlayer(player -> player.findHit(false, true, suitableEntity)); + HitResult entityHit = owner.withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.findHit(false, true, suitableEntity))); if (entityHit.getType() == HitResult.Type.MISS) return MethodResult.of(null, "Nothing found"); @@ -73,9 +85,8 @@ public final MethodResult searchAnimals() { TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); BlockPos currentPos = owner.getPos(); AABB box = new AABB(currentPos); - List> entities = new ArrayList<>(); ItemStack itemInHand = owner.getToolInMainHand(); - owner.getLevel().getEntities((Entity) null, box.inflate(automataCore.getInteractionRadius()), suitableEntity).forEach(entity -> entities.add(LuaConverter.completeEntityWithPositionToLua(entity, itemInHand, currentPos))); + List> entities = owner.getLevel().getEntities((Entity) null, box.inflate(automataCore.getInteractionRadius()), suitableEntity).stream().map(entity -> LuaConverter.completeEntityWithPositionToLua(entity, itemInHand, currentPos)).toList(); return MethodResult.of(entities); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java index b99d53de3..27212e8e7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java @@ -1,10 +1,13 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.core.apis.TableHelper; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -15,8 +18,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; - +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.Map; import java.util.function.Predicate; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.CAPTURE_ANIMAL; @@ -69,8 +75,12 @@ protected Entity extractEntity() { @LuaFunction(mainThread = true) - public final MethodResult captureAnimal() throws LuaException { - HitResult entityHit = automataCore.getPeripheralOwner().withPlayer(player -> player.findHit(false, true, suitableEntity)); + public final MethodResult captureAnimal(@NotNull IArguments arguments) throws LuaException { + Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; + + HitResult entityHit = automataCore.getPeripheralOwner().withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.findHit(false, true, suitableEntity))); if (entityHit.getType() == HitResult.Type.MISS) return MethodResult.of(null, "Nothing found"); return automataCore.withOperation(CAPTURE_ANIMAL, context -> { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java index bcc87f781..d844c694e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java @@ -9,12 +9,12 @@ import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; -import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -100,7 +100,7 @@ public final MethodResult collectSpecificItem(@NotNull IArguments arguments) thr List items = getItems(); int requiredQuantity = requiredQuantityArg; for (ItemEntity item : items) { - ResourceLocation itemName = ForgeRegistries.ITEMS.getKey(item.getItem().getItem()); + ResourceLocation itemName = BuiltInRegistries.ITEM.getKey(item.getItem().getItem()); if (itemName == null) continue; if (itemName.toString().equals(technicalName)) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index c79019c53..cf84cc206 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -1,17 +1,23 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.core.apis.TableHelper; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -22,17 +28,21 @@ public AutomataLookPlugin(AutomataCorePeripheral automataCore) { } @LuaFunction(mainThread = true) - public final MethodResult lookAtBlock() { + public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaException { + Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; + automataCore.addRotationCycle(); TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); - HitResult result = owner.withPlayer(apFakePlayer -> apFakePlayer.findHit(true, false)); + HitResult result = owner.withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.findHit(true, false))); if (result.getType() == HitResult.Type.MISS) return MethodResult.of(null, "No block find"); BlockHitResult blockHit = (BlockHitResult) result; BlockState state = owner.getLevel().getBlockState(blockHit.getBlockPos()); Map data = new HashMap<>(); - ResourceLocation blockName = ForgeRegistries.BLOCKS.getKey(state.getBlock()); + ResourceLocation blockName = BuiltInRegistries.BLOCK.getKey(state.getBlock()); if (blockName != null) data.put("name", blockName.toString()); data.put("tags", LuaConverter.tagsToList(() -> state.getBlock().builtInRegistryHolder().tags())); @@ -40,9 +50,13 @@ public final MethodResult lookAtBlock() { } @LuaFunction(mainThread = true) - public final MethodResult lookAtEntity() { + public final MethodResult lookAtEntity(@NotNull IArguments arguments) throws LuaException { + Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; + automataCore.addRotationCycle(); - HitResult result = automataCore.getPeripheralOwner().withPlayer(apFakePlayer -> apFakePlayer.findHit(false, true)); + HitResult result = automataCore.getPeripheralOwner().withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.findHit(false, true))); if (result.getType() == HitResult.Type.MISS) return MethodResult.of(null, "No entity find"); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataSoulFeedingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataSoulFeedingPlugin.java index 79368507e..6f4035522 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataSoulFeedingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataSoulFeedingPlugin.java @@ -24,7 +24,7 @@ public final MethodResult feedSoul() { InteractionResult result = owner.withPlayer(APFakePlayer::useOnEntity); automataCore.addRotationCycle(3); - return MethodResult.of(true, result.toString()); + return MethodResult.of(result.consumesAction(), result.toString()); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketColonyIntegratorUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketColonyIntegratorUpgrade.java deleted file mode 100644 index 752ccb18e..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketColonyIntegratorUpgrade.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.computercraft.pocket; - -import dan200.computercraft.api.pocket.IPocketAccess; -import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.ColonyPeripheral; -import de.srendi.advancedperipherals.lib.pocket.BasePocketUpgrade; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; - -public class PocketColonyIntegratorUpgrade extends BasePocketUpgrade { - - public PocketColonyIntegratorUpgrade(ResourceLocation id, ItemStack stack) { - super(id, stack); - } - - @Override - protected ColonyPeripheral getPeripheral(IPocketAccess access) { - return new ColonyPeripheral(access); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChunkyUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChunkyUpgrade.java index aec241d37..bed242638 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChunkyUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChunkyUpgrade.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull; public class TurtleChunkyUpgrade extends PeripheralTurtleUpgrade { + private int updateTick = 0; public TurtleChunkyUpgrade(ResourceLocation id, ItemStack stack) { super(id, stack); @@ -19,7 +20,7 @@ public TurtleChunkyUpgrade(ResourceLocation id, ItemStack stack) { @Override public ModelResourceLocation getLeftModel() { - return null; //Null, the turtle uses the chunk controller item model. See BaseTurtle.java + return null; // Null, the turtle uses the chunk controller item model. See BaseTurtle.java } @Override @@ -34,10 +35,16 @@ protected ChunkyPeripheral buildPeripheral(@NotNull ITurtleAccess turtle, @NotNu @Override public void update(@NotNull ITurtleAccess turtle, @NotNull TurtleSide side) { - //Add a chunk to the Chunk Manager every 10 ticks, if it's not already forced. - //The turtle can move, so we need to do that. + // Add a chunk to the Chunk Manager every 10 ticks, if it's not already forced. + // The turtle can move, so we need to do that. super.update(turtle, side); if (APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle.get()) { + // TODO: turtle will stop work when crossing chunks if update every 10 ticks + // updateTick++; + // if (updateTick < 10) { + // return; + // } + // updateTick = 0; IPeripheral peripheral = turtle.getPeripheral(side); if (peripheral instanceof ChunkyPeripheral chunkyPeripheral) { chunkyPeripheral.updateChunkState(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java deleted file mode 100644 index cbb4dc46a..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java +++ /dev/null @@ -1,79 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.create; - -import com.simibubi.create.content.processing.basin.BasinBlockEntity; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.common.util.LuaConverter; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -public class BasinIntegration implements APGenericPeripheral { - @NotNull - @Override - public String getPeripheralType() { - return "basin"; - } - - @LuaFunction(mainThread = true) - public final List getInputFluids(BasinBlockEntity blockEntity) { - IFluidHandler handler = blockEntity.getTanks().getFirst().getCapability().orElse(null); - if (handler == null) - return null; - - int size = handler.getTanks(); - List tanks = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - FluidStack fluid = handler.getFluidInTank(i); - Map data = new HashMap<>(); - data.put("amount", fluid.getAmount()); - data.put("fluid", ForgeRegistries.FLUIDS.getKey(fluid.getFluid()).toString()); - tanks.add(data); - } - return tanks; - } - - @LuaFunction(mainThread = true) - public final List getOutputFluids(BasinBlockEntity blockEntity) { - IFluidHandler handler = blockEntity.getTanks().getSecond().getCapability().orElse(null); - if (handler == null) { - return null; - } - int size = handler.getTanks(); - List tanks = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - FluidStack fluid = handler.getFluidInTank(i); - Map data = new HashMap<>(); - data.put("amount", fluid.getAmount()); - data.put("fluid", ForgeRegistries.FLUIDS.getKey(fluid.getFluid()).toString()); - tanks.add(data); - } - return tanks; - } - - @LuaFunction(mainThread = true) - public final Map getFilter(BasinBlockEntity blockEntity) { - return LuaConverter.stackToObject(blockEntity.getFilter().getFilter()); - } - - @LuaFunction(mainThread = true) - public final List getInventory(BasinBlockEntity blockEntity) { - Optional handlerOptional = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).resolve(); - if (handlerOptional.isEmpty()) return null; - IItemHandler handler = handlerOptional.get(); - List items = new ArrayList<>(); - for (int slot = 0; slot < handler.getSlots(); slot++) { - items.add(LuaConverter.stackToObject(handler.getStackInSlot(slot))); - } - return items; - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BlazeBurnerIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BlazeBurnerIntegration.java deleted file mode 100644 index e86d6adbf..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BlazeBurnerIntegration.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.create; - -import com.simibubi.create.content.processing.burner.BlazeBurnerBlockEntity; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; - -public class BlazeBurnerIntegration implements APGenericPeripheral { - @NotNull - @Override - public String getPeripheralType() { - return "blazeBurner"; - } - - @LuaFunction(mainThread = true) - public final Map getInfo(BlazeBurnerBlockEntity blockEntity) { - Map data = new HashMap<>(); - data.put("fuelType", blockEntity.getActiveFuel().toString().toLowerCase()); - data.put("heatLevel", blockEntity.getHeatLevelFromBlock().getSerializedName()); - data.put("remainingBurnTime", blockEntity.getRemainingBurnTime()); - data.put("isCreative", blockEntity.isCreative()); - return data; - } - -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/FluidTankIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/FluidTankIntegration.java deleted file mode 100644 index 121283e5b..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/FluidTankIntegration.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.create; - -import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; - -public class FluidTankIntegration implements APGenericPeripheral { - @NotNull - @Override - public String getPeripheralType() { - return "fluidTank"; - } - - @LuaFunction(mainThread = true) - public final Map getInfo(FluidTankBlockEntity blockEntity) { - Map data = new HashMap<>(); - data.put("capacity", blockEntity.getControllerBE().getTankInventory().getCapacity()); - data.put("amount", blockEntity.getControllerBE().getTankInventory().getFluidAmount()); - data.put("fluid", ForgeRegistries.FLUIDS.getKey(blockEntity.getControllerBE().getTankInventory().getFluid().getFluid()).toString()); - data.put("isBoiler", blockEntity.getControllerBE().boiler.isActive()); - return data; - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/Integration.java deleted file mode 100644 index ce74a5184..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/Integration.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.create; - -import dan200.computercraft.api.ComputerCraftAPI; - -public class Integration implements Runnable { - - @Override - public void run() { - ComputerCraftAPI.registerGenericSource(new BlazeBurnerIntegration()); - ComputerCraftAPI.registerGenericSource(new FluidTankIntegration()); - // Disable until verified that it does not clash with the existing create CC integration - //IntegrationPeripheralProvider.registerBlockEntityIntegration(ScrollValueBehaviourIntegration::new, KineticTileEntity.class, tile -> tile.getBehaviour(ScrollValueBehaviour.TYPE) != null, 10); - ComputerCraftAPI.registerGenericSource(new BasinIntegration()); - ComputerCraftAPI.registerGenericSource(new MechanicalMixerIntegration()); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/MechanicalMixerIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/MechanicalMixerIntegration.java deleted file mode 100644 index cfe58e035..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/MechanicalMixerIntegration.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.create; - -import com.simibubi.create.content.kinetics.mixer.MechanicalMixerBlockEntity; -import com.simibubi.create.content.processing.basin.BasinBlockEntity; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import net.minecraft.world.level.block.entity.BlockEntity; -import org.jetbrains.annotations.NotNull; - -public class MechanicalMixerIntegration implements APGenericPeripheral { - @NotNull - @Override - public String getPeripheralType() { - return "mechanicalMixer"; - } - - @LuaFunction(mainThread = true) - public final boolean isRunning(MechanicalMixerBlockEntity blockEntity) { - return blockEntity.running; - } - - @LuaFunction(mainThread = true) - public final boolean hasBasin(MechanicalMixerBlockEntity blockEntity) { - if (blockEntity.getLevel() == null) return false; - BlockEntity basinTE = blockEntity.getLevel().getBlockEntity(blockEntity.getBlockPos().below(2)); - return basinTE instanceof BasinBlockEntity; - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/ScrollValueBehaviourIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/ScrollValueBehaviourIntegration.java deleted file mode 100644 index 32dbc4a1d..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/ScrollValueBehaviourIntegration.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.create; - -import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral; -import net.minecraft.world.level.block.entity.BlockEntity; -import org.jetbrains.annotations.NotNull; - -/** - * Integration for kinetic tile entities with scroll value behaviours like the speed controller or the creative motor - */ -public class ScrollValueBehaviourIntegration extends BlockEntityIntegrationPeripheral { - - public ScrollValueBehaviourIntegration(BlockEntity entity) { - super(entity); - } - - @NotNull - @Override - public String getType() { - return "scrollBehaviourEntity"; - } - - @LuaFunction(mainThread = true) - public final int getTargetSpeed() { - ScrollValueBehaviour scrollBehaviour = blockEntity.getBehaviour(ScrollValueBehaviour.TYPE); - if (scrollBehaviour == null) return 0; - return scrollBehaviour.getValue(); - } - - @LuaFunction(mainThread = true) - public final boolean setTargetSpeed(int speed) { - ScrollValueBehaviour scrollBehaviour = blockEntity.getBehaviour(ScrollValueBehaviour.TYPE); - if (scrollBehaviour == null) return false; - scrollBehaviour.setValue(speed); - return true; - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/curios/CuriosHelper.java b/src/main/java/de/srendi/advancedperipherals/common/addons/curios/CuriosHelper.java deleted file mode 100644 index 2c6fc1241..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/curios/CuriosHelper.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.curios; - -public class CuriosHelper { - /*public static ICapabilityProvider createARGogglesProvider(ItemStack stackFor) { - return new ICapabilityProvider() { - - @Override - public LazyOptional getCapability(Capability cap, Direction side) { - return CuriosCapability.ITEM.orEmpty(cap, LazyOptional.of(() -> new ICurio() { - - @Override - public void curioTick(String identifier, int index, LivingEntity livingEntity) { - if (!SideHelper.isClientPlayer(livingEntity)) - return; - ARGogglesItem.clientTick((LocalPlayer) livingEntity, stackFor); - } - - @Override - public ItemStack getStack() { - return stackFor; - } - - @Override - public void onUnequip(SlotContext slotContext, ItemStack newStack) { - if (!(slotContext.getWearer() instanceof ServerPlayer serverPlayer)) - return; - MNetwork.sendTo(new ClearHudCanvasMessage(), serverPlayer); - } - - //TODO: add rendering if in Curio slot - })); - } - }; - }*/ -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/Mekanism.java b/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/Mekanism.java index 238413b76..55d44bae0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/Mekanism.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/Mekanism.java @@ -1,9 +1,9 @@ package de.srendi.advancedperipherals.common.addons.mekanism; -import mekanism.api.Coord4D; import mekanism.api.radiation.IRadiationManager; import mekanism.common.util.UnitDisplayUtils; import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; import net.minecraft.world.level.Level; import java.util.HashMap; @@ -18,7 +18,7 @@ private Mekanism() { public static Object getRadiation(Level world, BlockPos pos) { if (!world.isClientSide) { Map map = new HashMap<>(); - String[] radiation = UnitDisplayUtils.getDisplayShort(IRadiationManager.INSTANCE.getRadiationLevel(new Coord4D(pos, world)), UnitDisplayUtils.RadiationUnit.SV, 4).getString().split(" "); + String[] radiation = UnitDisplayUtils.getDisplayShort(IRadiationManager.INSTANCE.getRadiationLevel(GlobalPos.of(world.dimension(), pos)), UnitDisplayUtils.RadiationUnit.SV, 4).getString().split(" "); map.put("radiation", radiation[0]); map.put("unit", radiation[1]); return map; @@ -28,7 +28,7 @@ public static Object getRadiation(Level world, BlockPos pos) { public static double getRadiationRaw(Level world, BlockPos pos) { if (!world.isClientSide) - return IRadiationManager.INSTANCE.getRadiationLevel(new Coord4D(pos, world)); + return IRadiationManager.INSTANCE.getRadiationLevel(GlobalPos.of(world.dimension(), pos)); return 0; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java b/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java deleted file mode 100644 index b6dd3c2a1..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java +++ /dev/null @@ -1,365 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.minecolonies; - -import com.minecolonies.api.colony.ICitizenData; -import com.minecolonies.api.colony.IColony; -import com.minecolonies.api.colony.IVisitorData; -import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.colony.jobs.IJob; -import com.minecolonies.api.colony.managers.interfaces.IRegisteredStructureManager; -import com.minecolonies.api.colony.permissions.Action; -import com.minecolonies.api.colony.workorders.IWorkOrder; -import com.minecolonies.api.entity.citizen.Skill; -import com.minecolonies.api.research.*; -import com.minecolonies.api.research.costs.IResearchCost; -import com.minecolonies.api.research.effects.IResearchEffect; -import com.minecolonies.api.research.util.ResearchState; -import com.minecolonies.core.colony.buildings.AbstractBuildingStructureBuilder; -import com.minecolonies.core.colony.buildings.utils.BuildingBuilderResource; -import com.minecolonies.core.research.BuildingResearchRequirement; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import de.srendi.advancedperipherals.common.util.LuaConverter; -import io.netty.buffer.Unpooled; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Tuple; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.server.command.TextComponentHelper; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class MineColonies { - - /** - * To ensure that the user of a pocket computer has the appropriate rights. - * - * @param entity the user of the pocket computer - * @param colony the colony where the user is in it - * @return true if the user has the appropriate rights - */ - public static boolean hasAccess(Entity entity, IColony colony) { - if (entity instanceof Player player) { - if (colony != null) { - return colony.getPermissions().hasPermission(player, Action.ACCESS_HUTS); - } - } - return false; - } - - /** - * Converts a citizen to a map - * - * @param citizen the citizen - * @return a map with information about the citizen - */ - public static Object citizenToObject(ICitizenData citizen) { - Map map = new HashMap<>(); - map.put("id", citizen.getId()); - map.put("name", citizen.getName()); - map.put("bedPos", LuaConverter.posToObject(citizen.getBedPos())); - map.put("children", citizen.getChildren()); - map.put("location", LuaConverter.posToObject(citizen.getLastPosition())); - map.put("state", citizen.getStatus() == null ? "Idle" : Component.translatable(citizen.getStatus().getTranslationKey()).getString()); - map.put("age", citizen.isChild() ? "child" : "adult"); - map.put("gender", citizen.isFemale() ? "female" : "male"); - map.put("saturation", citizen.getSaturation()); - map.put("happiness", citizen.getCitizenHappinessHandler().getHappiness(citizen.getColony(), citizen)); - map.put("skills", skillsToObject(citizen.getCitizenSkillHandler().getSkills())); - map.put("work", citizen.getWorkBuilding() == null ? null : jobToObject(citizen.getWorkBuilding(), citizen.getJob())); - map.put("home", citizen.getHomeBuilding() == null ? null : homeToObject(citizen.getHomeBuilding())); - map.put("betterFood", citizen.needsBetterFood()); - map.put("isAsleep", map.get("state").toString().toLowerCase().contains("sleeping")); - map.put("isIdle", map.get("state").toString().toLowerCase().contains("idle")); - citizen.getEntity().ifPresent(entity -> { - map.put("health", entity.getHealth()); - map.put("maxHealth", entity.getMaxHealth()); - map.put("armor", entity.getAttributeValue(Attributes.ARMOR)); - map.put("toughness", entity.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); - }); - - return map; - } - - /** - * Converts a visitor {@link IVisitorData} to a map - * - * @param visitor the visitor - * @return a map with information about the visitor - */ - public static Object visitorToObject(IVisitorData visitor) { - Map map = new HashMap<>(); - map.put("id", visitor.getId()); - map.put("name", visitor.getName()); - map.put("location", LuaConverter.posToObject(visitor.getSittingPosition())); - map.put("age", visitor.isChild() ? "child" : "adult"); - map.put("gender", visitor.isFemale() ? "female" : "male"); - map.put("saturation", visitor.getSaturation()); - map.put("happiness", visitor.getCitizenHappinessHandler().getHappiness(visitor.getColony(), visitor)); - map.put("skills", skillsToObject(visitor.getCitizenSkillHandler().getSkills())); - map.put("recruitCost", LuaConverter.stackToObject(visitor.getRecruitCost())); - - return map; - } - - /** - * Converts a building {@link IBuilding} and job {@link IJob} to a map - * - * @param work the home building - * @param job the job - * @return a map with information about the building and job - */ - public static Object jobToObject(IBuilding work, IJob job) { - Map map = new HashMap<>(); - map.put("location", LuaConverter.posToObject(work.getLocation().getInDimensionLocation())); - map.put("type", work.getSchematicName()); - map.put("level", work.getBuildingLevel()); - map.put("name", work.getBuildingDisplayName()); - map.put("job", job.getJobRegistryEntry().getTranslationKey()); - - return map; - } - - /** - * Converts a home {@link IBuilding} to a map - * - * @param home the home building - * @return a map with information about the home building - */ - public static Object homeToObject(IBuilding home) { - Map map = new HashMap<>(); - map.put("location", LuaConverter.posToObject(home.getLocation().getInDimensionLocation())); - map.put("type", home.getSchematicName()); - map.put("level", home.getBuildingLevel()); - - return map; - } - - /** - * Converts a skill {@link Skill} into a map - * - * @param skills skills as list. Can be obtained via {@link ICitizenData#getCitizenSkillHandler} - * @return a map with information about the skill - */ - public static Object skillsToObject(Map> skills) { - Map map = new HashMap<>(); - for (Skill skill : skills.keySet()) { - Map skillData = new HashMap<>(); - skillData.put("level", skills.get(skill).getA()); - skillData.put("xp", skills.get(skill).getB()); - map.put(skill.name(), skillData); - } - - return map; - } - - /** - * Returns information about the building like structure data, the citizens and some other values - * - * @param buildingManager The building manager of the colony - * @param building The building as instance - * @param pos The location of the buildings block - * @return information about the building - */ - public static Object buildingToObject(IRegisteredStructureManager buildingManager, IBuilding building, BlockPos pos) { - Map structureData = new HashMap<>(); - structureData.put("cornerA", LuaConverter.posToObject(building.getCorners().getA())); - structureData.put("cornerB", LuaConverter.posToObject(building.getCorners().getB())); - structureData.put("rotation", building.getRotation()); - structureData.put("mirror", building.isMirrored()); - - List citizensData = new ArrayList<>(); - for (ICitizenData citizen : building.getAllAssignedCitizen()) { - Map citizenData = new HashMap<>(); - citizenData.put("id", citizen.getId()); - citizenData.put("name", citizen.getName()); - citizensData.add(citizenData); - } - - Map map = new HashMap<>(); - map.put("location", LuaConverter.posToObject(pos)); - map.put("type", building.getSchematicName()); - map.put("style", building.getStructurePack()); - map.put("level", building.getBuildingLevel()); - map.put("maxLevel", building.getMaxBuildingLevel()); - map.put("name", building.getBuildingDisplayName()); - map.put("built", building.isBuilt()); - map.put("isWorkingOn", building.hasWorkOrder()); - map.put("priority", building.getPickUpPriority()); - map.put("structure", structureData); - map.put("citizens", citizensData); - map.put("storageBlocks", building.getContainers().size()); - map.put("storageSlots", getStorageSize(building)); - map.put("guarded", buildingManager.hasGuardBuildingNear(building)); - - return map; - } - - /** - * Returns the size of all inventories in this building - * - * @param building the proper building with racks(Or other inventories) - * @return the size of all inventories in this building - */ - public static int getStorageSize(IBuilding building) { - LazyOptional capability = building.getCapability(ForgeCapabilities.ITEM_HANDLER); - IItemHandler handler = capability.resolve().orElse(null); - if (handler != null) - return handler.getSlots(); - - return 0; - } - - public static int getAmountOfConstructionSites(IColony colony) { - int constructionSites = 0; - for (IBuilding building : colony.getBuildingManager().getBuildings().values()) { - if (building.hasWorkOrder()) - constructionSites++; - } - - return constructionSites; - } - - public static Object workOrderToObject(IWorkOrder workOrder) { - Map map = new HashMap<>(); - - map.put("builder", LuaConverter.posToObject(workOrder.getClaimedBy())); - map.put("changed", workOrder.isDirty()); - map.put("id", workOrder.getID()); - map.put("priority", workOrder.getPriority()); - map.put("isClaimed", workOrder.isClaimed()); - map.put("location", LuaConverter.posToObject(workOrder.getLocation())); - map.put("type", workOrder.getClass().getSimpleName()); - map.put("buildingName", workOrder.getDisplayName().getString()); - map.put("targetLevel", workOrder.getTargetLevel()); - map.put("workOrderType", workOrder.getWorkOrderType().toString()); - - return map; - } - - /** - * Returns a list with all possible researches - * - * @param branch The branch, there are only a few branches - * @param researches The primary researches of the branch - * @param colony The colony - * @return a list including maps with all possible researches - */ - public static List getResearch(ResourceLocation branch, List researches, IColony colony) throws CommandSyntaxException { - List result = new ArrayList<>(); - if (researches != null) { - for (ResourceLocation researchName : researches) { - //All global possible researches - IGlobalResearchTree globalTree = IGlobalResearchTree.getInstance(); - //The research tree of the colony - ILocalResearchTree colonyTree = colony.getResearchManager().getResearchTree(); - - IGlobalResearch research = globalTree.getResearch(branch, researchName); - if (research == null) - continue; - if (research.isHidden()) - continue; - ILocalResearch colonyResearch = colonyTree.getResearch(branch, researchName); - - List effects = new ArrayList<>(); - for (IResearchEffect researchEffect : research.getEffects()) - effects.add(TextComponentHelper.createComponentTranslation(null, researchEffect.getDesc().getKey(), researchEffect.getDesc().getArgs()).getString()); - - List> cost = new ArrayList<>(); - for (IResearchCost item : research.getCostList()) { - Map researchCost = new HashMap<>(); - List> researchCostItems = new ArrayList<>(); - - for (Item costItem : item.getItems()) - researchCostItems.add(LuaConverter.itemToObject(costItem)); - - researchCost.put("validItems", researchCostItems); - researchCost.put("count", item.getCount()); - researchCost.put("", item.getType().getId().toString()); - - cost.add(researchCost); - } - - List> requirements = new ArrayList<>(); - for (IResearchRequirement requirement : research.getResearchRequirement()) { - Map requirementItem = new HashMap<>(); - requirementItem.put("fulfilled", requirement.isFulfilled(colony)); - if (requirement instanceof BuildingResearchRequirement buildingRequirement) { - requirementItem.put("type", "building"); - requirementItem.put("building", buildingRequirement.getBuilding()); - requirementItem.put("level", buildingRequirement.getBuildingLevel()); - } else { - requirementItem.put("type", requirement.getClass().getCanonicalName()); - } - requirementItem.put("desc", requirement.getDesc().getString()); - requirements.add(requirementItem); - } - - Map map = new HashMap<>(); - map.put("id", researchName.toString()); - map.put("name", TextComponentHelper.createComponentTranslation(null, research.getName().getKey(), research.getName().getArgs()).getString()); - map.put("requirements", requirements); - map.put("cost", cost); - map.put("researchEffects", effects); - map.put("status", colonyResearch == null ? ResearchState.NOT_STARTED.toString() : colonyResearch.getState().toString()); - map.put("neededTime", colonyResearch == null ? 0 : IGlobalResearchTree.getInstance().getBranchData(colonyResearch.getBranch()).getBaseTime(colonyResearch.getDepth())); - map.put("progress", colonyResearch == null ? 0 : colonyResearch.getProgress()); - - List childrenResearch = getResearch(branch, research.getChildren(), colony); - if (!childrenResearch.isEmpty()) - map.put("children", childrenResearch); - - result.add(map); - } - } - return result; - } - - /** - * Returns the resources(As items) which the builder needs - * - * @param colony The colony - * @param pos The position of the builder's hut block - * @return a map with all needed resources - */ - public static Object builderResourcesToObject(IColony colony, BlockPos pos) { - IBuilding building = colony.getBuildingManager().getBuilding(pos); - if (!(building instanceof AbstractBuildingStructureBuilder builderBuilding)) - return null; - - //We need to tell the building that we want information about it - FriendlyByteBuf buffer = new FriendlyByteBuf(Unpooled.buffer()); - builderBuilding.serializeToView(buffer, false); - buffer.release(); - - List resources = new ArrayList<>(builderBuilding.getNeededResources().values()); - resources.sort(new BuildingBuilderResource.ResourceComparator()); - - List result = new ArrayList<>(); - for (BuildingBuilderResource resource : resources) { - Map map = new HashMap<>(); - ItemStack stack = resource.getItemStack().copy(); - - map.put("item", LuaConverter.stackToObject(stack)); - map.put("displayName", resource.getName()); - map.put("available", resource.getAvailable()); - map.put("delivering", resource.getAmountInDelivery()); - map.put("status", resource.getAvailabilityStatus().toString()); - map.put("needed", resource.getAmount()); - result.add(map); - } - - return result; - } - -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnderCellIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnderCellIntegration.java deleted file mode 100644 index ee8f405c2..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnderCellIntegration.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import owmii.powah.block.ender.EnderCellTile; - -public class EnderCellIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "enderCell"; - } - - @LuaFunction(mainThread = true) - public final double getEnergy(EnderCellTile blockEntity) { - return blockEntity.getEnergy().getEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getMaxEnergy(EnderCellTile blockEntity) { - return blockEntity.getEnergy().getMaxEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final int getChannel(EnderCellTile blockEntity) { - // Lua, and generally slots in MC, seem to be 1 based, make the conversion here - int channel = blockEntity.getChannel().get(); - return channel + 1; - } - - @LuaFunction(mainThread = true) - public final void setChannel(EnderCellTile blockEntity, int channel) { - // Lua, and generally slots in MC, seem to be 1 based, make the conversion here - channel = channel - 1; - blockEntity.getChannel().set(channel); - } - - @LuaFunction(mainThread = true) - public final int getMaxChannels(EnderCellTile blockEntity) { - return blockEntity.getMaxChannels(); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnergyCellIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnergyCellIntegration.java deleted file mode 100644 index e995b4501..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnergyCellIntegration.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import owmii.powah.block.energycell.EnergyCellTile; - -public class EnergyCellIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "energyCell"; - } - - @LuaFunction(mainThread = true) - public final String getName() { - return "Energy Cell"; - } - - @LuaFunction(mainThread = true) - public final double getEnergy(EnergyCellTile blockEntity) { - return blockEntity.getEnergy().getEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getMaxEnergy(EnergyCellTile blockEntity) { - return blockEntity.getEnergy().getMaxEnergyStored(); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/FurnatorIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/FurnatorIntegration.java deleted file mode 100644 index 95c18ee97..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/FurnatorIntegration.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import net.minecraft.world.item.ItemStack; -import owmii.powah.block.furnator.FurnatorTile; - -public class FurnatorIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "furnator"; - } - - @LuaFunction(mainThread = true) - public final boolean isBurning(FurnatorTile blockEntity) { - return blockEntity.isBurning(); - } - - @LuaFunction(mainThread = true) - public final double getEnergy(FurnatorTile blockEntity) { - return blockEntity.getEnergy().getEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getMaxEnergy(FurnatorTile blockEntity) { - return blockEntity.getEnergy().getMaxEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getCarbon(FurnatorTile blockEntity) { - return blockEntity.getCarbon().perCent(); - } - - @LuaFunction(mainThread = true) - public final ItemStack getInventory(FurnatorTile blockEntity) { - return blockEntity.getInventory().getStackInSlot(1); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/Integration.java deleted file mode 100644 index 6a5f1129f..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/Integration.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.ComputerCraftAPI; - -public class Integration implements Runnable { - - @Override - public void run() { - ComputerCraftAPI.registerGenericSource(new ReactorIntegration()); - ComputerCraftAPI.registerGenericSource(new EnergyCellIntegration()); - ComputerCraftAPI.registerGenericSource(new EnderCellIntegration()); - ComputerCraftAPI.registerGenericSource(new SolarPanelIntegration()); - ComputerCraftAPI.registerGenericSource(new FurnatorIntegration()); - ComputerCraftAPI.registerGenericSource(new MagmatorIntegration()); - ComputerCraftAPI.registerGenericSource(new ThermoIntegration()); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/MagmatorIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/MagmatorIntegration.java deleted file mode 100644 index 239b31c0c..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/MagmatorIntegration.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import org.jetbrains.annotations.NotNull; -import owmii.powah.block.magmator.MagmatorTile; - -public class MagmatorIntegration implements APGenericPeripheral { - - @NotNull - @Override - public String getPeripheralType() { - return "magmator"; - } - - @LuaFunction(mainThread = true) - public final double getEnergy(MagmatorTile blockEntity) { - return blockEntity.getEnergy().getEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getMaxEnergy(MagmatorTile blockEntity) { - return blockEntity.getEnergy().getMaxEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final boolean isBurning(MagmatorTile blockEntity) { - return blockEntity.isBurning(); - } - - @LuaFunction(mainThread = true) - public final long getTankCapacity(MagmatorTile blockEntity) { - return blockEntity.getTank().getCapacity(); - } - - @LuaFunction(mainThread = true) - public final long getFluidInTank(MagmatorTile blockEntity) { - return blockEntity.getTank().getFluidAmount(); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java deleted file mode 100644 index ec63fe8db..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java +++ /dev/null @@ -1,84 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import net.minecraft.world.item.ItemStack; -import owmii.powah.block.reactor.ReactorPartTile; - -public class ReactorIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "uraniniteReactor"; - } - - @LuaFunction(mainThread = true) - public final boolean isRunning(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return false; - return blockEntity.core().get().isRunning(); - } - - @LuaFunction(mainThread = true) - public final double getFuel(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return 0.0d; - return blockEntity.core().get().fuel.perCent(); - } - - @LuaFunction(mainThread = true) - public final double getCarbon(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return 0.0d; - return blockEntity.core().get().carbon.perCent(); - } - - @LuaFunction(mainThread = true) - public final double getRedstone(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return 0.0d; - return blockEntity.core().get().redstone.perCent(); - } - - @LuaFunction(mainThread = true) - public final double getEnergy(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return 0.0d; - return blockEntity.core().get().getEnergy().getEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getMaxEnergy(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return 0.0d; - return blockEntity.core().get().getEnergy().getMaxEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getTemperature(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return 0.0d; - return blockEntity.core().get().temp.perCent(); - } - - @LuaFunction(mainThread = true) - public final ItemStack getInventoryUraninite(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return ItemStack.EMPTY; - return blockEntity.core().get().getInventory().getStackInSlot(1); - } - - @LuaFunction(mainThread = true) - public final ItemStack getInventoryRedstone(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return ItemStack.EMPTY; - return blockEntity.core().get().getInventory().getStackInSlot(3); - } - - @LuaFunction(mainThread = true) - public final ItemStack getInventoryCarbon(ReactorPartTile blockEntity) { - if (blockEntity.core().isEmpty()) - return ItemStack.EMPTY; - return blockEntity.core().get().getInventory().getStackInSlot(2); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/SolarPanelIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/SolarPanelIntegration.java deleted file mode 100644 index 3dd965f42..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/SolarPanelIntegration.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import owmii.powah.block.solar.SolarTile; - -public class SolarPanelIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "solarPanel"; - } - - @LuaFunction(mainThread = true) - public final String getName(SolarTile blockEntity) { - return "Solar Panel"; - } - - @LuaFunction(mainThread = true) - public final double getEnergy(SolarTile blockEntity) { - return blockEntity.getEnergy().getEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getMaxEnergy(SolarTile blockEntity) { - return blockEntity.getEnergy().getMaxEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final boolean canSeeSky(SolarTile blockEntity) { - return blockEntity.canSeeSky(); - } - -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ThermoIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ThermoIntegration.java deleted file mode 100644 index f99fc8f5d..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ThermoIntegration.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.powah; - -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.APGenericPeripheral; -import owmii.powah.block.thermo.ThermoTile; - -public class ThermoIntegration implements APGenericPeripheral { - - @Override - public String getPeripheralType() { - return "thermo"; - } - - @LuaFunction(mainThread = true) - public final String getName(ThermoTile blockEntity) { - return "Thermo generator"; - } - - @LuaFunction(mainThread = true) - public final double getEnergy(ThermoTile blockEntity) { - return blockEntity.getEnergy().getEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getMaxEnergy(ThermoTile blockEntity) { - return blockEntity.getEnergy().getMaxEnergyStored(); - } - - @LuaFunction(mainThread = true) - public final double getCoolantInTank(ThermoTile blockEntity) { - return blockEntity.getTank().getFluidAmount(); - } - -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java index f32ea395b..3889a3edf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java @@ -19,17 +19,23 @@ import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.fluids.FluidStack; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.function.Supplier; import java.util.stream.Stream; @@ -55,7 +61,7 @@ public static ItemStack findStackFromStack(INetwork network, @Nullable ICrafting public static ItemStack findStackFromFilter(INetwork network, @Nullable ICraftingManager crafting, ItemFilter filter) { for (StackListEntry temp : network.getItemStorageCache().getList().getStacks()) { - if (filter.test(temp.getStack().copy())) + if (filter.test(temp.getStack())) return temp.getStack().copy(); } @@ -64,7 +70,7 @@ public static ItemStack findStackFromFilter(INetwork network, @Nullable ICraftin for (ICraftingPattern pattern : crafting.getPatterns()) { for(ItemStack stack : pattern.getOutputs()) { - if (filter.test(stack.copy())) + if (filter.test(stack)) return stack.copy(); } } @@ -78,7 +84,7 @@ public static FluidStack findFluidFromStack(INetwork network, @Nullable ICraftin public static FluidStack findFluidFromFilter(INetwork network, @Nullable ICraftingManager crafting, FluidFilter filter) { for (StackListEntry temp : network.getFluidStorageCache().getList().getStacks()) { - if (filter.test(temp.getStack().copy())) + if (filter.test(temp.getStack())) return temp.getStack().copy(); } @@ -165,7 +171,7 @@ public static Object getObjectFromPattern(ICraftingPattern pattern, INetwork net List outputsList = pattern.getOutputs(); List outputs = new ArrayList<>(); for (ItemStack itemStack : outputsList) - outputs.add(getObjectFromStack(itemStack.copy(), network)); + outputs.add(getObjectFromStack(itemStack, network)); map.put("outputs", outputs); @@ -174,7 +180,7 @@ public static Object getObjectFromPattern(ICraftingPattern pattern, INetwork net for (List singleInputList : inputList) { List inputs1 = new ArrayList<>(); for (ItemStack stack : singleInputList) - inputs1.add(getObjectFromStack(stack.copy(), network)); + inputs1.add(getObjectFromStack(stack, network)); inputs.add(inputs1); } @@ -182,7 +188,7 @@ public static Object getObjectFromPattern(ICraftingPattern pattern, INetwork net if (!pattern.isProcessing()) { List byproductsList = pattern.getByproducts(); for (ItemStack stack : byproductsList) - byproducts.add(getObjectFromStack(stack.copy(), network)); + byproducts.add(getObjectFromStack(stack, network)); } map.put("inputs", inputs); @@ -216,7 +222,7 @@ public static Map getObjectFromFluid(@Nullable FluidStack fluidS Map map = new HashMap<>(); Supplier>> tags = () -> fluidStack.getFluid().builtInRegistryHolder().tags(); - map.put("name", ForgeRegistries.FLUIDS.getKey(fluidStack.getFluid()).toString()); + map.put("name", BuiltInRegistries.FLUID.getKey(fluidStack.getFluid()).toString()); map.put("amount", fluidStack.getAmount()); map.put("displayName", fluidStack.getDisplayName().getString()); map.put("isCraftable", isFluidCraftable(network, fluidStack)); @@ -228,7 +234,7 @@ public static Map getObjectFromFluid(@Nullable FluidStack fluidS public static Object getItem(INetwork network, ItemStack item) { for (ItemStack itemStack : getItems(network)) { if (itemStack.is(item.getItem()) && Objects.equals(itemStack.getTag(), item.getTag())) - return getObjectFromStack(itemStack.copy(), network); + return getObjectFromStack(itemStack, network); } return null; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java index f945fb8b6..b099b9f6a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java @@ -5,7 +5,7 @@ import com.refinedmods.refinedstorage.api.util.IComparer; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; import de.srendi.advancedperipherals.common.util.inventory.IStorageSystemFluidHandler; -import net.minecraftforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.FluidStack; import org.jetbrains.annotations.NotNull; public class RsFluidHandler implements IStorageSystemFluidHandler { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java index 8288b7ece..cf58ff9a8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java @@ -3,25 +3,25 @@ import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; import net.minecraft.core.BlockPos; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class APBlockEntityBlock extends BaseBlockEntityBlock { - private final RegistryObject> tileEntity; + private final DeferredHolder, BlockEntityType> tileEntity; - public APBlockEntityBlock(RegistryObject> tileEntity, Properties properties, boolean belongToTickingEntity) { + public APBlockEntityBlock(DeferredHolder, BlockEntityType> tileEntity, Properties properties, boolean belongToTickingEntity) { super(belongToTickingEntity, properties); this.tileEntity = tileEntity; } - public APBlockEntityBlock(RegistryObject> tileEntity, boolean belongToTickingEntity) { + public APBlockEntityBlock(DeferredHolder, BlockEntityType> tileEntity, boolean belongToTickingEntity) { this(tileEntity, Properties.of().sound(SoundType.METAL).mapColor(DyeColor.GRAY), belongToTickingEntity); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java index ed53d8151..49a9c04e2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java @@ -5,12 +5,16 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraftforge.common.Tags; +import net.neoforged.neoforge.common.Tags; import org.jetbrains.annotations.NotNull; public class BaseBlock extends Block implements IHarvestableBlock { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java index 4ca37d78f..5b54d510c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java @@ -4,7 +4,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.BlockTags; -import net.minecraft.world.*; +import net.minecraft.world.Container; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DyeColor; @@ -13,12 +17,12 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,7 +48,7 @@ public InteractionResult use(@NotNull BlockState state, Level levelIn, @NotNull MenuProvider namedContainerProvider = this.getMenuProvider(state, levelIn, pos); if (namedContainerProvider != null) { if (!(player instanceof ServerPlayer serverPlayerEntity)) return InteractionResult.PASS; - NetworkHooks.openScreen(serverPlayerEntity, namedContainerProvider, pos); + serverPlayerEntity.openMenu(namedContainerProvider, pos); } return InteractionResult.SUCCESS; } @@ -64,7 +68,9 @@ public void setPlacedBy(@NotNull Level worldIn, @NotNull BlockPos pos, @NotNull if (worldIn.getBlockEntity(pos) == null) return; //Used for the lua function getName() - worldIn.getBlockEntity(pos).getPersistentData().putString("CustomName", stack.getDisplayName().getString()); + if (stack.hasCustomHoverName() && worldIn.getBlockEntity(pos) instanceof BaseContainerBlockEntity blockEntity) { + blockEntity.setCustomName(stack.getHoverName()); + } } @Nullable diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/ICapabilityProvider.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/ICapabilityProvider.java new file mode 100644 index 000000000..440145cf0 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/ICapabilityProvider.java @@ -0,0 +1,32 @@ +package de.srendi.advancedperipherals.common.blocks.base; + +import dan200.computercraft.api.peripheral.IPeripheral; +import net.minecraft.core.Direction; +import net.neoforged.neoforge.energy.IEnergyStorage; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; +import org.jetbrains.annotations.Nullable; + +public interface ICapabilityProvider { + + @Nullable + default IPeripheral createPeripheralCap(@Nullable Direction side) { + return null; + } + + @Nullable + default IFluidHandler createFluidHandlerCap(@Nullable Direction side) { + return null; + } + + @Nullable + default IItemHandler createItemHandlerCap(@Nullable Direction side) { + return null; + } + + @Nullable + default IEnergyStorage createEnergyStorageCap(@Nullable Direction side) { + return null; + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index 2b6d3ca8f..d2cb59e16 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -2,7 +2,6 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; -import dan200.computercraft.shared.Capabilities; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; @@ -21,28 +20,23 @@ import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.templates.FluidTank; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.SidedInvWrapper; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.fluids.capability.templates.FluidTank; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.SidedInvWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; -public abstract class PeripheralBlockEntity> extends BaseContainerBlockEntity implements WorldlyContainer, MenuProvider, IPeripheralTileEntity { - // TODO: move inventory logic to another tile entity! +public abstract class PeripheralBlockEntity> extends BaseContainerBlockEntity implements WorldlyContainer, MenuProvider, IPeripheralTileEntity, ICapabilityProvider { private static final String PERIPHERAL_SETTINGS_KEY = "peripheralSettings"; protected CompoundTag peripheralSettings; protected NonNullList items; @Nullable protected T peripheral = null; - private LazyOptional handler; - private LazyOptional fluidHandler; - private LazyOptional peripheralCap; + private IItemHandler itemHandler; + private IFluidHandler fluidHandler; public PeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { super(tileEntityTypeIn, pos, state); @@ -54,54 +48,36 @@ public PeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, peripheralSettings = new CompoundTag(); } - @NotNull + @Nullable @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { - if (cap == Capabilities.CAPABILITY_PERIPHERAL) { - if (peripheral == null) - // Perform later peripheral creation, because creating peripheral - // on init of tile entity cause some infinity loop, if peripheral - // are depend on tile entity data - this.peripheral = createPeripheral(); - if (peripheral.isEnabled()) { - if (peripheralCap == null) { - peripheralCap = LazyOptional.of(() -> peripheral); - } else if (!peripheralCap.isPresent()) { - // Recreate peripheral to allow CC: Tweaked correctly handle - // peripheral update logic, so new peripheral and old one will be - // different - peripheral = createPeripheral(); - peripheralCap = LazyOptional.of(() -> peripheral); - } - return peripheralCap.cast(); - } else { - AdvancedPeripherals.debug(peripheral.getType() + " is disabled, you can enable it in the Configuration."); - } - } - - if (cap == ForgeCapabilities.ITEM_HANDLER && !remove && direction != null && this instanceof IInventoryBlock) { - if (handler == null || !handler.isPresent()) - handler = LazyOptional.of(() -> new SidedInvWrapper(this, Direction.NORTH)); - return handler.cast(); + public IPeripheral createPeripheralCap(@Nullable Direction side) { + if (peripheral == null) + // Perform later peripheral creation, because creating peripheral + // on init of tile entity cause some infinity loop, if peripheral + // are depend on tile entity data + this.peripheral = this.createPeripheral(); + if (peripheral.isEnabled()) { + return peripheral; + } else { + AdvancedPeripherals.debug(peripheral.getType() + " is disabled, you can enable it in the Configuration."); } + return null; + } - if (cap == ForgeCapabilities.FLUID_HANDLER && !remove && direction != null) { - if (fluidHandler == null || !fluidHandler.isPresent()) - fluidHandler = LazyOptional.of(() -> new FluidTank(0)); - return fluidHandler.cast(); - } - return super.getCapability(cap, direction); + @Nullable + @Override + public IFluidHandler createFluidHandlerCap(@Nullable Direction side) { + if (fluidHandler == null) + fluidHandler = new FluidTank(0); + return fluidHandler; } + @Nullable @Override - public void invalidateCaps() { - super.invalidateCaps(); - if (peripheralCap != null) - peripheralCap.invalidate(); - if (handler != null) - handler.invalidate(); - if (fluidHandler != null) - fluidHandler.invalidate(); + public IItemHandler createItemHandlerCap(@Nullable Direction side) { + if (itemHandler == null) + itemHandler = new SidedInvWrapper(this, null); + return itemHandler; } @NotNull diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java index bace719d3..e39242118 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java @@ -7,24 +7,21 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.EnergyStorage; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.energy.EnergyStorage; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public abstract class PoweredPeripheralBlockEntity> extends PeripheralBlockEntity { - private final LazyOptional lazyEnergyStorage; + private final IEnergyStorage energyStorage; public PoweredPeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { super(tileEntityTypeIn, pos, state); if (APConfig.PERIPHERALS_CONFIG.enablePoweredPeripherals.get()) { - lazyEnergyStorage = LazyOptional.of(() -> new EnergyStorage(this.getMaxEnergyStored())); + energyStorage = new EnergyStorage(this.getMaxEnergyStored()); } else { - lazyEnergyStorage = LazyOptional.empty(); + energyStorage = null; } } @@ -33,27 +30,21 @@ public PoweredPeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPo @Override public void saveAdditional(@NotNull CompoundTag compound) { super.saveAdditional(compound); - lazyEnergyStorage.ifPresent(iEnergyStorage -> compound.putInt("energy", iEnergyStorage.getEnergyStored())); + if (energyStorage != null) + compound.putInt("energy", energyStorage.getEnergyStored()); } @Override public void load(@NotNull CompoundTag compound) { super.load(compound); - lazyEnergyStorage.ifPresent(iEnergyStorage -> iEnergyStorage.receiveEnergy(compound.getInt("energy") - iEnergyStorage.getEnergyStored(), false)); + if (energyStorage != null) + energyStorage.receiveEnergy(compound.getInt("energy") - energyStorage.getEnergyStored(), false); } + @Nullable @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { - if (cap == ForgeCapabilities.ENERGY && lazyEnergyStorage.isPresent()) { - return lazyEnergyStorage.cast(); - } - return super.getCapability(cap, direction); - } - - @Override - public void invalidateCaps() { - super.invalidateCaps(); - this.lazyEnergyStorage.invalidate(); + public IEnergyStorage createEnergyStorageCap(@Nullable Direction side) { + return energyStorage; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ColonyIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ColonyIntegratorEntity.java deleted file mode 100644 index 8c6504791..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ColonyIntegratorEntity.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.srendi.advancedperipherals.common.blocks.blockentities; - -import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.ColonyPeripheral; -import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; -import de.srendi.advancedperipherals.common.setup.BlockEntityTypes; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.NotNull; - -public class ColonyIntegratorEntity extends PeripheralBlockEntity { - - public ColonyIntegratorEntity(BlockPos pos, BlockState state) { - super(BlockEntityTypes.COLONY_INTEGRATOR.get(), pos, state); - } - - @NotNull - @Override - protected ColonyPeripheral createPeripheral() { - return new ColonyPeripheral(this); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java index f8db556aa..a523f7561 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java @@ -13,16 +13,12 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.EnergyStorage; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.energy.EnergyStorage; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Optional; - public class EnergyDetectorEntity extends PeripheralBlockEntity { //a zero size, zero transfer energy storage to ensure that cables connect @@ -30,12 +26,11 @@ public class EnergyDetectorEntity extends PeripheralBlockEntity energyStorageCap = LazyOptional.of(() -> storageProxy); + IEnergyStorage energyStorageCap = storageProxy; Direction energyInDirection = Direction.NORTH; Direction energyOutDirection = Direction.SOUTH; - LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage); - @NotNull - private Optional outReceivingStorage = Optional.empty(); + IEnergyStorage zeroStorageCap = zeroStorage; + private IEnergyStorage outReceivingStorage = null; public EnergyDetectorEntity(BlockPos pos, BlockState state) { super(BlockEntityTypes.ENERGY_DETECTOR.get(), pos, state); @@ -47,19 +42,18 @@ protected EnergyDetectorPeripheral createPeripheral() { return new EnergyDetectorPeripheral(this); } - @NotNull + @Nullable @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { + public IEnergyStorage createEnergyStorageCap(@Nullable Direction direction) { energyInDirection = getBlockState().getValue(JigsawBlock.ORIENTATION).front(); energyOutDirection = getBlockState().getValue(JigsawBlock.ORIENTATION).front().getOpposite(); - if (cap == ForgeCapabilities.ENERGY) { - if (direction == energyInDirection) { - return energyStorageCap.cast(); - } else if (direction == energyOutDirection) { - return zeroStorageCap.cast(); - } + + if (direction == energyInDirection) { + return energyStorageCap; + } else if (direction == energyOutDirection) { + return zeroStorageCap; } - return super.getCapability(cap, direction); + return null; } @Override @@ -72,7 +66,7 @@ public void saveAdditional(@NotNull CompoundTag compound) { public void handleTick(Level level, BlockState state, BlockEntityType type) { if (!level.isClientSide) { // this handles the rare edge case that receiveEnergy is called multiple times in one tick - transferRate = storageProxy.getTransferedInThisTick(); + transferRate = storageProxy.getTransferredInThisTick(); storageProxy.resetTransferedInThisTick(); } } @@ -84,23 +78,18 @@ public void deserializeNBT(CompoundTag nbt) { } public void invalidateStorages() { - outReceivingStorage = Optional.empty(); + outReceivingStorage = null; } // returns the cached output storage of the receiving block or refetches it if it has been invalidated - @NotNull - public Optional getOutputStorage() { + public IEnergyStorage getOutputStorage() { // the documentation says that the value of the LazyOptional should be cached locally and invallidated using addListener - if (outReceivingStorage.isEmpty()) { + if (outReceivingStorage == null) { BlockEntity teOut = level.getBlockEntity(worldPosition.relative(energyOutDirection)); if (teOut == null) { - return Optional.empty(); + return null; } - LazyOptional lazyOptionalOutStorage = teOut.getCapability(ForgeCapabilities.ENERGY, energyOutDirection.getOpposite()); - outReceivingStorage = lazyOptionalOutStorage.resolve(); - lazyOptionalOutStorage.addListener(l -> { - outReceivingStorage = Optional.empty(); - }); + outReceivingStorage = level.getCapability(Capabilities.EnergyStorage.BLOCK, worldPosition.relative(energyOutDirection), energyOutDirection.getOpposite()); } return outReceivingStorage; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java index fad6ce3d7..315745535 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java @@ -8,18 +8,25 @@ import de.srendi.advancedperipherals.common.setup.BlockEntityTypes; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.server.ServerLifecycleHooks; +import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.UUID; + +import static de.srendi.advancedperipherals.common.items.MemoryCardItem.OWNER_NBT_KEY; + public class InventoryManagerEntity extends PeripheralBlockEntity implements IInventoryBlock { + private UUID owner = null; + public InventoryManagerEntity(BlockPos pos, BlockState state) { super(BlockEntityTypes.INVENTORY_MANAGER.get(), pos, state); } @@ -45,22 +52,51 @@ public boolean canPlaceItemThroughFace(int index, @NotNull ItemStack itemStackIn return itemStackIn.getItem() instanceof MemoryCardItem; } + @Override + public void setItem(int index, @NotNull ItemStack stack) { + if (stack.getItem() instanceof MemoryCardItem) { + if (stack.hasTag() && stack.getTag().contains(OWNER_NBT_KEY)) { + this.owner = stack.getTag().getUUID(OWNER_NBT_KEY); + stack.getTag().remove(OWNER_NBT_KEY); + } else if (stack != this.getItem(index)) { + // Only clear owner when the new card item is not the current item + this.owner = null; + } + } else { + this.owner = null; + } + super.setItem(index, stack); + } + @NotNull @Override public Component getDisplayName() { return Component.translatable("block.advancedperipherals.inventory_manager"); } + @Override + public void load(CompoundTag data) { + if (data.contains("ownerId")) { + this.owner = data.getUUID("ownerId"); + } + super.load(data); + // Fresh the memory card for backward compatibility + this.setItem(0, this.getItem(0)); + } + + @Override + public void saveAdditional(CompoundTag data) { + super.saveAdditional(data); + if (this.owner != null) { + data.putUUID("ownerId", this.owner); + } + } + public Player getOwnerPlayer() { - //Checks if the tile entity has an item in his inventory - if (items.get(0).isEmpty()) return null; - ItemStack stack = items.get(0); - //Checks if the item contains the owner name - if (!stack.getOrCreateTag().contains("owner")) return null; - //Loop through all players and check if the player is online - for (Player entity : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) { - if (entity.getName().getString().equals(stack.getOrCreateTag().getString("owner"))) return entity; + if (this.owner == null) { + return null; } - return null; + Player player = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(this.owner); + return player; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java index d9eb38a98..8e7255c64 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java @@ -1,10 +1,16 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; -import appeng.api.networking.*; +import appeng.api.networking.GridFlags; +import appeng.api.networking.GridHelper; +import appeng.api.networking.IGridNode; +import appeng.api.networking.IInWorldGridNodeHost; +import appeng.api.networking.IManagedGridNode; import appeng.api.networking.crafting.ICraftingSimulationRequester; import appeng.api.networking.security.IActionHost; import appeng.api.networking.security.IActionSource; +import appeng.api.orientation.BlockOrientation; import appeng.api.util.AECableType; +import appeng.me.helpers.IGridConnectedBlockEntity; import de.srendi.advancedperipherals.common.addons.appliedenergistics.CraftJob; import de.srendi.advancedperipherals.common.addons.appliedenergistics.MeBridgeEntityListener; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral; @@ -25,9 +31,10 @@ import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; -public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IActionHost, IInWorldGridNodeHost, ICraftingSimulationRequester { +public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IActionHost, IInWorldGridNodeHost, IGridConnectedBlockEntity, ICraftingSimulationRequester { private final List jobs = new CopyOnWriteArrayList<>(); private boolean initialized = false; @@ -35,6 +42,7 @@ public class MeBridgeEntity extends PeripheralBlockEntity im public MeBridgeEntity(BlockPos pos, BlockState state) { super(BlockEntityTypes.ME_BRIDGE.get(), pos, state); + getMainNode().setExposedOnSides(getGridConnectableSides(null)); } @NotNull @@ -47,14 +55,12 @@ protected MeBridgePeripheral createPeripheral() { public void handleTick(Level level, BlockState state, BlockEntityType type) { if (!this.level.isClientSide) { if (!initialized) { - mainNode.setFlags(GridFlags.REQUIRE_CHANNEL); mainNode.setIdlePowerUsage(APConfig.PERIPHERALS_CONFIG.meConsumption.get()); mainNode.setVisualRepresentation(new ItemStack(Blocks.ME_BRIDGE.get())); mainNode.setInWorldNode(true); mainNode.create(level, getBlockPos()); - - //peripheral can be null if `getCapability` was not called before + //peripheral can be null if `createPeripheralCap` was not called before if (peripheral == null) peripheral = createPeripheral(); peripheral.setNode(mainNode); @@ -105,12 +111,33 @@ public void onChunkUnloaded() { mainNode.destroy(); } + @Override + public IManagedGridNode getMainNode() { + return mainNode; + } + + @Override + public Set getGridConnectableSides(BlockOrientation orientation) { + return IGridConnectedBlockEntity.super.getGridConnectableSides(orientation); + } + + @Nullable + @Override + public IGridNode getGridNode() { + return IGridConnectedBlockEntity.super.getGridNode(); + } + @Nullable @Override public IGridNode getGridNode(@NotNull Direction dir) { return getActionableNode(); } + @Override + public void saveChanges() { + + } + @NotNull @Override public AECableType getCableConnectionType(@NotNull Direction dir) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java index e3bc4a364..c0733ce7f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java @@ -8,6 +8,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RsBridgePeripheral; import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorageNode; +import de.srendi.advancedperipherals.common.blocks.base.ICapabilityProvider; import de.srendi.advancedperipherals.common.setup.BlockEntityTypes; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; import net.minecraft.core.BlockPos; @@ -15,40 +16,31 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; 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 org.jetbrains.annotations.Nullable; -import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL; - -public class RsBridgeEntity extends NetworkNodeBlockEntity implements INetworkNodeProxy, IRedstoneConfigurable, IPeripheralTileEntity { +public class RsBridgeEntity extends NetworkNodeBlockEntity implements INetworkNodeProxy, IRedstoneConfigurable, IPeripheralTileEntity, ICapabilityProvider { private static final String PERIPHERAL_SETTINGS = "AP_SETTINGS"; //I have no clue what this does, but it works private static final BlockEntitySynchronizationSpec SPEC = BlockEntitySynchronizationSpec.builder().build(); protected CompoundTag peripheralSettings; protected RsBridgePeripheral peripheral = new RsBridgePeripheral(this); - private LazyOptional peripheralCap; public RsBridgeEntity(BlockPos pos, BlockState state) { - super(BlockEntityTypes.RS_BRIDGE.get(), pos, state, SPEC); + super(BlockEntityTypes.RS_BRIDGE.get(), pos, state, SPEC, null); peripheralSettings = new CompoundTag(); } - @NotNull - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { - if (cap == CAPABILITY_PERIPHERAL) { - if (peripheral.isEnabled()) { - if (peripheralCap == null) { - peripheralCap = LazyOptional.of(() -> peripheral); - } - return peripheralCap.cast(); - } else { - AdvancedPeripherals.debug(peripheral.getType() + " is disabled, you can enable it in the Configuration."); - } + @Nullable + @Override + public IPeripheral createPeripheralCap(@Nullable Direction side) { + if (peripheral.isEnabled()) { + return peripheral; + } else { + AdvancedPeripherals.debug(peripheral.getType() + " is disabled, you can enable it in the Configuration."); + return null; } - return super.getCapability(cap, direction); } public RefinedStorageNode createNode(Level level, BlockPos blockPos) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java index 3acb4414c..83db97245 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java +++ b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java @@ -1,7 +1,18 @@ package de.srendi.advancedperipherals.common.commands; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.tree.LiteralCommandNode; +import dan200.computercraft.core.computer.ComputerSide; +import dan200.computercraft.core.computer.Environment; +import dan200.computercraft.shared.ModRegistry; +import dan200.computercraft.shared.command.text.ChatHelpers; +import dan200.computercraft.shared.command.text.TableBuilder; +import dan200.computercraft.shared.computer.core.ServerComputer; +import dan200.computercraft.shared.computer.core.ServerContext; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.ChunkyPeripheral; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; @@ -11,16 +22,42 @@ import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.HoverEvent; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.RegisterCommandsEvent; + +import java.util.Comparator; + @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public class APCommands { + public static final String ROOT_LITERAL = "advancedperipherals"; + public static final String FORCELOAD_LITERAL = "forceload"; + static final String FORCELOAD_HELP = + "/" + ROOT_LITERAL + " " + FORCELOAD_LITERAL + " help" + " - show this help message\n" + + "/" + ROOT_LITERAL + " " + FORCELOAD_LITERAL + " dump" + " - show all chunky turtles\n"; + public static final String EXEC_LITERAL = "safe-exec"; + public static final String ROOT_SAFE_EXEC_LITERAL = "ap-safe-exec"; @SubscribeEvent public static void register(RegisterCommandsEvent event) { - event.getDispatcher().register(Commands.literal("advancedperipherals").then(Commands.literal("getHashItem").executes(context -> getHashItem(context.getSource())))); + LiteralCommandNode safeExecNode = Commands.literal(EXEC_LITERAL) + .then(Commands.argument("command", StringArgumentType.greedyString()) + .executes(APCommands::safeExecute)) + .build(); + event.getDispatcher().register(Commands.literal(ROOT_LITERAL) + .then(Commands.literal("getHashItem").executes(context -> getHashItem(context.getSource()))) + .then(Commands.literal(FORCELOAD_LITERAL) + .executes(context -> forceloadHelp(context.getSource())) + .then(Commands.literal("help") + .executes(context -> forceloadHelp(context.getSource()))) + .then(Commands.literal("dump") + .requires(ModRegistry.Permissions.PERMISSION_DUMP) + .executes(context -> forceloadDump(context.getSource()))) + ) + .then(safeExecNode) + ); + event.getDispatcher().register(Commands.literal(ROOT_SAFE_EXEC_LITERAL).redirect(safeExecNode)); } private static int getHashItem(CommandSourceStack source) throws CommandSyntaxException { @@ -42,4 +79,62 @@ private static int getHashItem(CommandSourceStack source) throws CommandSyntaxEx .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Copy"))))), true); return 1; } + + private static int forceloadHelp(CommandSourceStack source) throws CommandSyntaxException { + source.sendSuccess(() -> Component.literal(FORCELOAD_HELP), true); + return 1; + } + + private static int forceloadDump(CommandSourceStack source) throws CommandSyntaxException { + TableBuilder table = new TableBuilder("ChunkyTurtles", "Computer", "Position"); + + ServerComputer[] computers = ServerContext.get(source.getServer()).registry().getComputers().stream().filter((computer) -> { + Environment env = computer.getComputer().getEnvironment(); + for (ComputerSide side : ComputerSide.values()) { + if (env.getPeripheral(side) instanceof ChunkyPeripheral) { + return true; + } + } + return false; + }).sorted(Comparator.comparingInt(ServerComputer::getID)).toArray(ServerComputer[]::new); + + for (ServerComputer computer : computers) { + table.row( + makeComputerDumpCommand(computer), + makeComputerPosCommand(computer) + ); + } + + table.display(source); + return computers.length; + } + + private static int safeExecute(CommandContext context) throws CommandSyntaxException { + CommandSourceStack source = context.getSource().withPermission(0); + String command = StringArgumentType.getString(context, "command"); + try { + source.getServer().getCommands().performPrefixedCommand(source, command); + return 1; + } catch (RuntimeException e) { + source.sendFailure(Component.literal(e.getMessage())); + return 0; + } + } + + + private static Component makeComputerDumpCommand(ServerComputer computer) { + return ChatHelpers.link( + Component.literal("#" + computer.getID()), + "/computercraft dump " + computer.getInstanceUUID(), + Component.translatable("commands.computercraft.dump.action") + ); + } + + private static Component makeComputerPosCommand(ServerComputer computer) { + return ChatHelpers.link( + ChatHelpers.position(computer.getPosition()), + "/computercraft tp " + computer.getInstanceUUID(), + Component.translatable("commands.computercraft.tp.action") + ); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java index 8695dd01a..5dab5ee3a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java @@ -1,11 +1,11 @@ package de.srendi.advancedperipherals.common.configuration; import com.electronwill.nightconfig.core.file.CommentedFileConfig; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.config.ConfigFileTypeHandler; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.loading.FMLPaths; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.config.ConfigFileTypeHandler; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.loading.FMLPaths; import java.nio.file.Path; import java.util.function.Function; @@ -34,15 +34,16 @@ public static void register(ModLoadingContext context) { modContainer.addConfig(new APConfig(WORLD_CONFIG, modContainer)); } - @Override + /*@Override public ConfigFileTypeHandler getHandler() { return CONFIG_FILE_HANDLER; - } + }*/ public static class ConfigFileHandler extends ConfigFileTypeHandler { public static Path getPath(Path path) { - if (path.endsWith("serverconfig")) return FMLPaths.CONFIGDIR.get(); + if (path.endsWith("serverconfig")) + return FMLPaths.CONFIGDIR.get(); return path; } @@ -53,8 +54,8 @@ public Function reader(Path configBasePath) { } @Override - public void unload(Path configBasePath, ModConfig config) { - super.unload(getPath(configBasePath), config); + public void unload(ModConfig config) { + super.unload(config); } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java index 57c32e43d..eb2fe7392 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java @@ -2,17 +2,17 @@ import de.srendi.advancedperipherals.lib.LibConfig; import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.ModConfigSpec; @FieldsAreNonnullByDefault public class GeneralConfig implements IAPConfig { - public final ForgeConfigSpec.BooleanValue enableDebugMode; - private final ForgeConfigSpec configSpec; + public final ModConfigSpec.BooleanValue enableDebugMode; + private final ModConfigSpec configSpec; GeneralConfig() { - ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); builder.comment("Config to adjust general mod settings").push("General"); @@ -23,6 +23,11 @@ public class GeneralConfig implements IAPConfig { LibConfig.build(builder); + builder.pop(); + builder.push("Unsafe"); + + UnsafeConfig.build(builder); + builder.pop(); configSpec = builder.build(); @@ -30,7 +35,7 @@ public class GeneralConfig implements IAPConfig { @Override - public ForgeConfigSpec getConfigSpec() { + public ModConfigSpec getConfigSpec() { return configSpec; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/IAPConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/IAPConfig.java index 05cb51657..c4be49132 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/IAPConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/IAPConfig.java @@ -1,24 +1,24 @@ package de.srendi.advancedperipherals.common.configuration; import de.srendi.advancedperipherals.lib.misc.IConfigHandler; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.ModConfigSpec; public interface IAPConfig { - ForgeConfigSpec getConfigSpec(); + ModConfigSpec getConfigSpec(); String getFileName(); ModConfig.Type getType(); - default void register(IConfigHandler[] data, final ForgeConfigSpec.Builder builder) { + default void register(IConfigHandler[] data, final ModConfigSpec.Builder builder) { for (IConfigHandler handler : data) { handler.addToConfig(builder); } } - default void pop(String name, ForgeConfigSpec.Builder builder) { + default void pop(String name, ModConfigSpec.Builder builder) { builder.pop(); builder.push(name); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java index e45fdcbde..b1cea4467 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java @@ -2,22 +2,22 @@ import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier; import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.ModConfigSpec; @FieldsAreNonnullByDefault public class MetaphysicsConfig implements IAPConfig { - public final ForgeConfigSpec.IntValue energyToFuelRate; - public final ForgeConfigSpec.BooleanValue enableWeakAutomataCore; - public final ForgeConfigSpec.BooleanValue enableEndAutomataCore; - public final ForgeConfigSpec.BooleanValue enableHusbandryAutomataCore; - public final ForgeConfigSpec.IntValue endAutomataCoreWarpPointLimit; - public final ForgeConfigSpec.DoubleValue overpoweredAutomataBreakChance; - private final ForgeConfigSpec configSpec; + public final ModConfigSpec.IntValue energyToFuelRate; + public final ModConfigSpec.BooleanValue enableWeakAutomataCore; + public final ModConfigSpec.BooleanValue enableEndAutomataCore; + public final ModConfigSpec.BooleanValue enableHusbandryAutomataCore; + public final ModConfigSpec.IntValue endAutomataCoreWarpPointLimit; + public final ModConfigSpec.DoubleValue overpoweredAutomataBreakChance; + private final ModConfigSpec configSpec; public MetaphysicsConfig() { - ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); builder.comment("Config for metaphysics").push("Metaphysics"); @@ -36,7 +36,7 @@ public MetaphysicsConfig() { } @Override - public ForgeConfigSpec getConfigSpec() { + public ModConfigSpec getConfigSpec() { return configSpec; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java index e9c7d0d33..0e7f9797c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java @@ -4,80 +4,113 @@ import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperation; import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.ModConfigSpec; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; +import java.util.regex.Pattern; @FieldsAreNonnullByDefault public class PeripheralsConfig implements IAPConfig { - //Player Detector - public final ForgeConfigSpec.IntValue playerDetMaxRange; - public final ForgeConfigSpec.BooleanValue playerSpy; - public final ForgeConfigSpec.BooleanValue morePlayerInformation; - public final ForgeConfigSpec.BooleanValue enablePlayerDetector; - public final ForgeConfigSpec.BooleanValue playerDetMultiDimensional; - public final ForgeConfigSpec.BooleanValue playerSpyRandError; - public final ForgeConfigSpec.IntValue playerSpyRandErrorAmount; - public final ForgeConfigSpec.IntValue playerSpyPreciseMaxRange; - - //Energy Detector - public final ForgeConfigSpec.IntValue energyDetectorMaxFlow; - public final ForgeConfigSpec.BooleanValue enableEnergyDetector; - - //NBT Storage - public final ForgeConfigSpec.IntValue nbtStorageMaxSize; - public final ForgeConfigSpec.BooleanValue enableNBTStorage; - //Chunky turtle - public final ForgeConfigSpec.IntValue chunkLoadValidTime; - - public final ForgeConfigSpec.IntValue chunkyTurtleRadius; - public final ForgeConfigSpec.BooleanValue enableChunkyTurtle; - //Chat box - public final ForgeConfigSpec.BooleanValue enableChatBox; - public final ForgeConfigSpec.ConfigValue defaultChatBoxPrefix; - public final ForgeConfigSpec.IntValue chatBoxMaxRange; - public final ForgeConfigSpec.BooleanValue chatBoxMultiDimensional; - - //ME Bridge - public final ForgeConfigSpec.BooleanValue enableMEBridge; - public final ForgeConfigSpec.IntValue meConsumption; - - //Rs Bridge - public final ForgeConfigSpec.BooleanValue enableRSBridge; - public final ForgeConfigSpec.IntValue rsConsumption; - - //Environment Detector - public final ForgeConfigSpec.BooleanValue enableEnvironmentDetector; - - //AR Controller - public final ForgeConfigSpec.BooleanValue enableARGoggles; - - //Inventory Manager - public final ForgeConfigSpec.BooleanValue enableInventoryManager; - - //Redstone Integrator - public final ForgeConfigSpec.BooleanValue enableRedstoneIntegrator; - - //Block reader - public final ForgeConfigSpec.BooleanValue enableBlockReader; - - //Geo Scanner - public final ForgeConfigSpec.BooleanValue enableGeoScanner; - - //Colony integrator - public final ForgeConfigSpec.BooleanValue enableColonyIntegrator; - - //Compass turtle - public final ForgeConfigSpec.BooleanValue enableCompassTurtle; - - //Powered Peripherals - public final ForgeConfigSpec.BooleanValue enablePoweredPeripherals; - public final ForgeConfigSpec.BooleanValue disablePocketFuelConsumption; - public final ForgeConfigSpec.IntValue poweredPeripheralMaxEnergyStorage; - private final ForgeConfigSpec configSpec; + // Player Detector + public final ModConfigSpec.IntValue playerDetMaxRange; + public final ModConfigSpec.BooleanValue playerSpy; + public final ModConfigSpec.BooleanValue morePlayerInformation; + public final ModConfigSpec.BooleanValue enablePlayerDetector; + public final ModConfigSpec.BooleanValue playerDetMultiDimensional; + public final ModConfigSpec.BooleanValue playerSpyRandError; + public final ModConfigSpec.IntValue playerSpyRandErrorAmount; + public final ModConfigSpec.IntValue playerSpyPreciseMaxRange; + + // Energy Detector + public final ModConfigSpec.IntValue energyDetectorMaxFlow; + public final ModConfigSpec.BooleanValue enableEnergyDetector; + + // NBT Storage + public final ModConfigSpec.IntValue nbtStorageMaxSize; + public final ModConfigSpec.BooleanValue enableNBTStorage; + + // Chunky turtle + public final ModConfigSpec.IntValue chunkLoadValidTime; + public final ModConfigSpec.IntValue chunkyTurtleRadius; + public final ModConfigSpec.BooleanValue enableChunkyTurtle; + + // Chat box + public final ModConfigSpec.BooleanValue enableChatBox; + public final ModConfigSpec.ConfigValue defaultChatBoxPrefix; + public final ModConfigSpec.IntValue chatBoxMaxRange; + public final ModConfigSpec.BooleanValue chatBoxMultiDimensional; + public final ModConfigSpec.BooleanValue chatBoxPreventRunCommand; + public final ModConfigSpec.BooleanValue chatBoxWrapCommand; + public final ModConfigSpec.ConfigValue> chatBoxBannedCommands; + private List> chatBoxCommandFilters = null; + + // ME Bridge + public final ModConfigSpec.BooleanValue enableMEBridge; + public final ModConfigSpec.IntValue meConsumption; + + // Rs Bridge + public final ModConfigSpec.BooleanValue enableRSBridge; + public final ModConfigSpec.IntValue rsConsumption; + + // Environment Detector + public final ModConfigSpec.BooleanValue enableEnvironmentDetector; + + // AR Controller + public final ModConfigSpec.BooleanValue enableARGoggles; + + // Inventory Manager + public final ModConfigSpec.BooleanValue enableInventoryManager; + + // Redstone Integrator + public final ModConfigSpec.BooleanValue enableRedstoneIntegrator; + + // Block reader + public final ModConfigSpec.BooleanValue enableBlockReader; + + // Geo Scanner + public final ModConfigSpec.BooleanValue enableGeoScanner; + + // Colony integrator + public final ModConfigSpec.BooleanValue enableColonyIntegrator; + + // Compass turtle + public final ModConfigSpec.BooleanValue enableCompassTurtle; + public final ModConfigSpec.IntValue compassAccurePlaceRadius; + public final ModConfigSpec.IntValue compassAccurePlaceFreeRadius; + + // Powered Peripherals + public final ModConfigSpec.BooleanValue enablePoweredPeripherals; + public final ModConfigSpec.BooleanValue disablePocketFuelConsumption; + public final ModConfigSpec.IntValue poweredPeripheralMaxEnergyStorage; + private final ModConfigSpec configSpec; + + private static final List chatBoxDefaultBannedCommands = Arrays.asList( + "/execute", + "/op", + "/deop", + "/gamemode", + "/gamerule", + "/stop", + + "/give", + "/fill", + "/setblock", + "/summon", + + "/whitelist", + "^/ban-(?:ip)?\\s*", + "^/pardon-(?:ip)?\\s*", + + "^/save-(?:on|off)\\s*" + ); public PeripheralsConfig() { - ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); builder.comment("Peripherals config").push("Peripherals"); @@ -114,6 +147,9 @@ public PeripheralsConfig() { defaultChatBoxPrefix = builder.comment("Defines default chatbox prefix").define("defaultChatBoxPrefix", "AP"); chatBoxMaxRange = builder.comment("Defines the maximal range of the chat box in blocks. -1 for infinite. If the range is not -1, players in other dimensions won't able to receive messages").defineInRange("chatBoxMaxRange", -1, -1, 30000000); chatBoxMultiDimensional = builder.comment("If true, the chat box is able to send messages to other dimensions than its own").define("chatBoxMultiDimensional", true); + chatBoxPreventRunCommand = builder.comment("If true, the chat box cannot use 'run_command' action").define("chatBoxPreventRunCommand", false); + chatBoxWrapCommand = builder.comment("If true, the chat box will wrap and execute 'run_command' or 'suggest_command' action with zero permission, in order to prevent operators accidently run dangerous commands.").define("chatBoxWrapCommand", true); + chatBoxBannedCommands = builder.comment("These commands below will not be able to send by 'run_command' or 'suggest_command' action. It will match as prefix if starts with '/', other wise use regex pattern").defineList("chatBoxBannedCommands", chatBoxDefaultBannedCommands, (o) -> o instanceof String value && value.length() > 0); pop("ME_Bridge", builder); @@ -155,6 +191,8 @@ public PeripheralsConfig() { pop("Compass_Turtle", builder); enableCompassTurtle = builder.comment("Enable the compass turtle or not.").define("enableCompassTurtle", true); + compassAccurePlaceRadius = builder.comment("The maximum distance the compass can locate accurately with in each axis.").defineInRange("compassAccurePlaceRadius", 3, 0, 8); + compassAccurePlaceFreeRadius = builder.comment("The free distance the compass can locate accurately with in each axis.").defineInRange("compassAccurePlaceFreeRadius", 1, 0, 4); pop("Powered_Peripherals", builder); @@ -177,7 +215,7 @@ public PeripheralsConfig() { } @Override - public ForgeConfigSpec getConfigSpec() { + public ModConfigSpec getConfigSpec() { return configSpec; } @@ -190,4 +228,29 @@ public String getFileName() { public ModConfig.Type getType() { return ModConfig.Type.COMMON; } + + private List> parseChatBoxCommandFilters() { + List> filters = new ArrayList<>(); + for (final String s : chatBoxBannedCommands.get()) { + String p = s; + if (p.charAt(0) == '/') { + p = p.replaceAll("\\s+", "\\\\s+"); + if (p.equals(s)) { + final String prefix = s; + filters.add((v) -> v.startsWith(prefix) && (v.length() == prefix.length() || " \t".indexOf(v.charAt(prefix.length())) != -1)); + continue; + } + p = "^" + p + "\\s*"; + } + filters.add(Pattern.compile(p).asPredicate()); + } + return filters; + } + + public List> getChatBoxCommandFilters() { + if (chatBoxCommandFilters == null) { + chatBoxCommandFilters = parseChatBoxCommandFilters(); + } + return chatBoxCommandFilters; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/UnsafeConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/UnsafeConfig.java new file mode 100644 index 000000000..c4b6cfba9 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/UnsafeConfig.java @@ -0,0 +1,22 @@ +package de.srendi.advancedperipherals.common.configuration; + +import net.neoforged.neoforge.common.ModConfigSpec; + +public class UnsafeConfig { + + private static ModConfigSpec.BooleanValue enableUnsafe; + private static ModConfigSpec.BooleanValue ignoreTurtlePeripheralItemNBT; + + public static void build(final ModConfigSpec.Builder builder) { + enableUnsafe = builder.comment("By setting this value to true, I understand all operations below are danger to my adventure, and if they caused unexpected behavior in my world, I will not consider it as AP's liability").define("enableUnsafe", false); + ignoreTurtlePeripheralItemNBT = builder.comment("Ignore turtle peripheral item's NBT when equipping. **YOU WILL LOSE ALL NBT ON THE ITEM**").define("ignoreTurtlePeripheralItemNBT", false); + } + + public static boolean enabled() { + return enableUnsafe.get(); + } + + public static boolean getIgnoreTurtlePeripheralItemNBT() { + return enabled() && ignoreTurtlePeripheralItemNBT.get(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java index de050af71..a9701bdb9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java @@ -1,32 +1,34 @@ package de.srendi.advancedperipherals.common.configuration; import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.ModConfigSpec; @FieldsAreNonnullByDefault public class WorldConfig implements IAPConfig { - public final ForgeConfigSpec.BooleanValue enableVillagerStructures; - public final ForgeConfigSpec.BooleanValue givePlayerBookOnJoin; - public final ForgeConfigSpec.IntValue villagerStructureWeight; - private final ForgeConfigSpec configSpec; + public final ModConfigSpec.BooleanValue enableVillagerStructures; + public final ModConfigSpec.BooleanValue givePlayerBookOnJoin; + public final ModConfigSpec.IntValue villagerStructureWeight; + public final ModConfigSpec.BooleanValue enableWanderingTraderTrades; + private final ModConfigSpec configSpec; public WorldConfig() { - ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); builder.comment("Config to adjust world settings").push("World"); enableVillagerStructures = builder.comment("Enable the villager structures for the computer scientist.").define("enableVillagerStructures", true); givePlayerBookOnJoin = builder.comment("Gives the ap documentation to new players.").define("givePlayerBookOnJoin", true); villagerStructureWeight = builder.comment("The weight of the villager structures.").defineInRange("villagerStructureWeight", 10, 0, 16000); + enableWanderingTraderTrades = builder.comment("Enable new wandering trader trades.").define("enableWanderingTraderTrades", true); builder.pop(); configSpec = builder.build(); } @Override - public ForgeConfigSpec getConfigSpec() { + public ModConfigSpec getConfigSpec() { return configSpec; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java index 4ccc859cf..7ed3bcdb8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java @@ -11,7 +11,6 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.capabilities.ForgeCapabilities; import org.jetbrains.annotations.NotNull; public class InventoryManagerContainer extends BaseContainer { @@ -20,9 +19,7 @@ public InventoryManagerContainer(int id, Inventory inventory, BlockPos pos, Leve super(ContainerTypes.INVENTORY_MANAGER_CONTAINER.get(), id, inventory, pos, level); layoutPlayerInventorySlots(7, 84); if (tileEntity != null) { - tileEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresent(handler -> { - addSlot(new SlotInputHandler(handler, 0, 79, 29, new SlotCondition().setNeededItem(Items.MEMORY_CARD.get()))); //Input - }); + addSlot(new SlotInputHandler(tileEntity.createItemHandlerCap(null), 0, 79, 29, new SlotCondition().setNeededItem(Items.MEMORY_CARD.get()))); //Input } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java index 9d11ca901..3fac74c69 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseContainer.java @@ -10,9 +10,9 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; -import net.minecraftforge.items.wrapper.InvWrapper; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.Nullable; public abstract class BaseContainer extends AbstractContainerMenu { diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemContainer.java index dfc8ceab8..49e6cbbf3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemContainer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemContainer.java @@ -4,9 +4,9 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; -import net.minecraftforge.items.wrapper.InvWrapper; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.Nullable; public abstract class BaseItemContainer extends AbstractContainerMenu { diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemScreen.java b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemScreen.java index edd8b1043..8c461e7f7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemScreen.java @@ -18,7 +18,7 @@ public BaseItemScreen(T screenContainer, Inventory inv, Component titleIn) { @Override public void render(@NotNull GuiGraphics guiGraphics, int x, int y, float partialTicks) { - renderBackground(guiGraphics); + renderBackground(guiGraphics, x, y, partialTicks); super.render(guiGraphics, x, y, partialTicks); renderTooltip(guiGraphics, x, y); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseScreen.java b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseScreen.java index 1e12e0965..72b9bfdb9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseScreen.java @@ -17,7 +17,7 @@ public BaseScreen(T screenContainer, Inventory inv, Component titleIn) { @Override public void render(@NotNull GuiGraphics guiGraphics, int x, int y, float partialTicks) { - renderBackground(guiGraphics); + renderBackground(guiGraphics, x, y, partialTicks); super.render(guiGraphics, x, y, partialTicks); renderTooltip(guiGraphics, x, y); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotInputHandler.java b/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotInputHandler.java index ea7e7320d..bac16020a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotInputHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotInputHandler.java @@ -1,8 +1,8 @@ package de.srendi.advancedperipherals.common.container.base; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; import org.jetbrains.annotations.NotNull; public class SlotInputHandler extends SlotItemHandler { diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java index 2d825a312..73eea6265 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java @@ -4,7 +4,7 @@ import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -17,12 +17,15 @@ protected BlockLootTables() { @Override protected void generate() { - Registration.BLOCKS.getEntries().stream().map(RegistryObject::get).forEach(this::dropSelf); + Registration.BLOCKS.getEntries().stream().map(DeferredHolder::get).forEach(registeredBlock -> { + //Allow blocks to transfer their name to the dropped block when broken + this.add(registeredBlock, this::createNameableBlockEntityTable); + }); } @NotNull @Override protected Iterable getKnownBlocks() { - return Registration.BLOCKS.getEntries().stream().map(RegistryObject::get)::iterator; + return Registration.BLOCKS.getEntries().stream().map(DeferredHolder::get).map((block) -> (Block) block)::iterator; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java index 0249ff5db..465c1fb84 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java @@ -5,12 +5,16 @@ import de.srendi.advancedperipherals.common.setup.Blocks; import net.minecraft.core.Direction; import net.minecraft.core.FrontAndTop; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.model.generators.*; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.client.model.generators.BlockModelBuilder; +import net.neoforged.neoforge.client.model.generators.BlockStateProvider; +import net.neoforged.neoforge.client.model.generators.ConfiguredModel; +import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.client.model.generators.ModelProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; public class BlockStatesAndModelsProvider extends BlockStateProvider { @@ -31,10 +35,6 @@ protected void registerStatesAndModels() { peripheralBlock(Blocks.REDSTONE_INTEGRATOR.get(), "front"); peripheralBlock(Blocks.BLOCK_READER.get(), generateModel(Blocks.BLOCK_READER.get(), false, "north", "south", "east", "west", "up", "down")); peripheralBlock(Blocks.GEO_SCANNER.get(), "front"); - peripheralBlock(Blocks.COLONY_INTEGRATOR.get(), generateModel(Blocks.COLONY_INTEGRATOR.get()) - .texture("particle", blockTexture(Blocks.COLONY_INTEGRATOR.get())) - .texture("up", blockTexture(net.minecraft.world.level.block.Blocks.OAK_LOG, "top")) - .texture("down", blockTexture(net.minecraft.world.level.block.Blocks.OAK_LOG, "top"))); peripheralBlock(Blocks.NBT_STORAGE.get(), "front"); } @@ -99,7 +99,7 @@ private ResourceLocation blockTexture(Block block, String offset) { } private ResourceLocation key(Block block) { - return ForgeRegistries.BLOCKS.getKey(block); + return BuiltInRegistries.BLOCK.getKey(block); } private String name(Block block) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockTagsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockTagsProvider.java index c0f98257a..183f554a8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockTagsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockTagsProvider.java @@ -3,14 +3,15 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.blocks.base.IHarvestableBlock; import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.TagsProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,18 +29,18 @@ public class BlockTagsProvider extends TagsProvider { private final PackOutput packOutput; protected BlockTagsProvider(@NotNull PackOutput packOutput, CompletableFuture future, @Nullable ExistingFileHelper existingFileHelper, DeferredRegister registry) { - super(packOutput, ForgeRegistries.BLOCKS.getRegistryKey(), future, AdvancedPeripherals.MOD_ID, existingFileHelper); + super(packOutput, Registries.BLOCK, future, AdvancedPeripherals.MOD_ID, existingFileHelper); this.packOutput = packOutput; this.blockRegistry = registry; } @Override protected void addTags(@NotNull HolderLookup.Provider provider) { - blockRegistry.getEntries().stream().map(RegistryObject::get).forEach(block -> { + blockRegistry.getEntries().stream().map(DeferredHolder::get).forEach(block -> { if (!(block instanceof IHarvestableBlock harvesterBlock)) throw new IllegalArgumentException("For any block you should define harvester logic!"); - tag(harvesterBlock.getHarvestTag()).add(ForgeRegistries.BLOCKS.getResourceKey(block).get()); - tag(harvesterBlock.getToolTag()).add(ForgeRegistries.BLOCKS.getResourceKey(block).get()); + tag(harvesterBlock.getHarvestTag()).add(BuiltInRegistries.BLOCK.getResourceKey(block).get()); + tag(harvesterBlock.getToolTag()).add(BuiltInRegistries.BLOCK.getResourceKey(block).get()); }); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java b/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java index 36cfb5d11..6999d3c71 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java @@ -7,10 +7,10 @@ import net.minecraft.data.DataGenerator; import net.minecraft.data.PackOutput; import net.minecraft.data.registries.VanillaRegistries; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.data.event.GatherDataEvent; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 78a97d6d9..d54d04f2b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -7,13 +7,13 @@ import de.srendi.advancedperipherals.common.setup.Items; import de.srendi.advancedperipherals.common.setup.Villagers; import net.minecraft.client.KeyMapping; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.data.LanguageProvider; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.data.LanguageProvider; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; @@ -54,7 +54,6 @@ private void addItems() { private void addBlocks() { addBlock(Blocks.BLOCK_READER, "Block Reader"); addBlock(Blocks.CHAT_BOX, "Chat Box"); - addBlock(Blocks.COLONY_INTEGRATOR, "Colony Integrator"); addBlock(Blocks.ENERGY_DETECTOR, "Energy Detector"); addBlock(Blocks.ENVIRONMENT_DETECTOR, "Environment Detector"); addBlock(Blocks.GEO_SCANNER, "Geo Scanner"); @@ -119,7 +118,6 @@ private void addTooltips() { addTooltip(Blocks.REDSTONE_INTEGRATOR.get(), "&7This block is able to interact with redstone. Works exactly like the redstone api of an computer."); addTooltip(Blocks.BLOCK_READER.get(), "&7Reads nbt data of blocks to interact with blocks which do not have computer support."); addTooltip(Blocks.GEO_SCANNER.get(), "&7Scans the area around it to find some shiny ores."); - addTooltip(Blocks.COLONY_INTEGRATOR.get(), "&7Interacts with Minecolonies to read data about your colony and citizens."); addTooltip(Blocks.NBT_STORAGE.get(), "&7Acts like a storage disk. Can store nbt based data."); addTooltip(Items.WEAK_AUTOMATA_CORE.get(), "&7Upgrade for turtles, which makes turtles more useful."); addTooltip(Items.OVERPOWERED_WEAK_AUTOMATA_CORE.get(), "&7Improved version of the weak automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile."); @@ -158,11 +156,11 @@ private void addPocket(@NotNull ResourceLocation key, @NotNull String name) { } private void addTooltip(Item item, String name) { - addTooltip(ForgeRegistries.ITEMS.getKey(item).getPath(), name); + addTooltip(BuiltInRegistries.ITEM.getKey(item).getPath(), name); } private void addTooltip(Block block, String name) { - addTooltip(ForgeRegistries.BLOCKS.getKey(block).getPath(), name); + addTooltip(BuiltInRegistries.BLOCK.getKey(block).getPath(), name); } private void addTooltip(String tooltip, String name) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java index 2002b7538..8e01dd26c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java @@ -1,11 +1,11 @@ package de.srendi.advancedperipherals.common.data; +import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.pocket.PocketUpgradeDataProvider; -import dan200.computercraft.api.pocket.PocketUpgradeSerialiser; +import dan200.computercraft.api.upgrades.UpgradeSerialiser; import de.srendi.advancedperipherals.common.setup.Blocks; import de.srendi.advancedperipherals.common.setup.CCRegistration; import net.minecraft.data.PackOutput; -import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -16,11 +16,10 @@ public PocketUpgradesProvider(PackOutput output) { } @Override - protected void addUpgrades(@NotNull Consumer>> addUpgrade) { - simpleWithCustomItem(CCRegistration.ID.CHATTY_POCKET, CCRegistration.CHAT_BOX_POCKET.get(), Blocks.CHAT_BOX.get().asItem()).add(addUpgrade); - simpleWithCustomItem(CCRegistration.ID.PLAYER_POCKET, CCRegistration.PLAYER_DETECTOR_POCKET.get(), Blocks.PLAYER_DETECTOR.get().asItem()).add(addUpgrade); - simpleWithCustomItem(CCRegistration.ID.ENVIRONMENT_POCKET, CCRegistration.ENVIRONMENT_POCKET.get(), Blocks.ENVIRONMENT_DETECTOR.get().asItem()).add(addUpgrade); - simpleWithCustomItem(CCRegistration.ID.GEOSCANNER_POCKET, CCRegistration.GEO_SCANNER_POCKET.get(), Blocks.GEO_SCANNER.get().asItem()).add(addUpgrade); - simpleWithCustomItem(CCRegistration.ID.COLONY_POCKET, CCRegistration.COLONY_POCKET.get(), Blocks.COLONY_INTEGRATOR.get().asItem()).add(addUpgrade); + protected void addUpgrades(Consumer>> consumer) { + simpleWithCustomItem(CCRegistration.ID.CHATTY_POCKET, CCRegistration.CHAT_BOX_POCKET.get(), Blocks.CHAT_BOX.get().asItem()).add(consumer); + simpleWithCustomItem(CCRegistration.ID.PLAYER_POCKET, CCRegistration.PLAYER_DETECTOR_POCKET.get(), Blocks.PLAYER_DETECTOR.get().asItem()).add(consumer); + simpleWithCustomItem(CCRegistration.ID.ENVIRONMENT_POCKET, CCRegistration.ENVIRONMENT_POCKET.get(), Blocks.ENVIRONMENT_DETECTOR.get().asItem()).add(consumer); + simpleWithCustomItem(CCRegistration.ID.GEOSCANNER_POCKET, CCRegistration.GEO_SCANNER_POCKET.get(), Blocks.GEO_SCANNER.get().asItem()).add(consumer); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java index b4aec08c4..c5d7abe91 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java @@ -8,8 +8,8 @@ import net.minecraft.data.tags.TagsProvider; import net.minecraft.tags.PoiTypeTags; import net.minecraft.world.entity.ai.village.poi.PoiType; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.registries.DeferredHolder; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,7 +26,7 @@ public PoiTypeProvider(PackOutput output, CompletableFuture appender = tag(PoiTypeTags.ACQUIRABLE_JOB_SITE); - Registration.POI_TYPES.getEntries().stream().map(RegistryObject::getKey).filter(Objects::nonNull).forEach(appender::add); + Registration.POI_TYPES.getEntries().stream().map(DeferredHolder::getKey).filter(Objects::nonNull).forEach(appender::add); } @NotNull diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java index 9166436e1..8faf507c4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java @@ -4,27 +4,24 @@ import com.refinedmods.refinedstorage.RSBlocks; import com.refinedmods.refinedstorage.RSItems; import dan200.computercraft.shared.ModRegistry; -import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.setup.Blocks; -import de.srendi.advancedperipherals.common.util.RawValue; import net.minecraft.data.PackOutput; -import net.minecraft.data.recipes.*; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; -import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.crafting.ConditionalRecipe; -import net.minecraftforge.common.crafting.StrictNBTIngredient; -import net.minecraftforge.common.crafting.conditions.IConditionBuilder; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Consumer; -import java.util.stream.Stream; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.conditions.IConditionBuilder; +import net.neoforged.neoforge.common.conditions.ModLoadedCondition; +import net.neoforged.neoforge.common.crafting.NBTIngredient; public class RecipesProvider extends RecipeProvider implements IConditionBuilder { @@ -35,49 +32,48 @@ public RecipesProvider(PackOutput pGenerator) { super(pGenerator); } - @Override - protected void buildRecipes(@NotNull Consumer consumer) { + @Override + protected void buildRecipes(RecipeOutput recipeOutput) { - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.CHAT_BOX.get()).define('P', ItemTags.LOGS).define('A', CASING).define('G', Tags.Items.INGOTS_GOLD).pattern("PPP").pattern("PAP").pattern("PGP").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.CHUNK_CONTROLLER.get()).define('I', Tags.Items.INGOTS_IRON).define('R', Tags.Items.DUSTS_REDSTONE).define('A', Items.ENDER_EYE).pattern("IRI").pattern("RAR").pattern("IRI").unlockedBy(HAS_ITEM, has(Items.RESPAWN_ANCHOR)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.CHAT_BOX.get()).define('P', ItemTags.LOGS).define('A', CASING).define('G', Tags.Items.INGOTS_GOLD).pattern("PPP").pattern("PAP").pattern("PGP").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.COMPUTER_TOOL.get()).define('I', Tags.Items.INGOTS_IRON).define('B', Items.BLUE_TERRACOTTA).pattern("I I").pattern("IBI").pattern(" B ").unlockedBy(HAS_ITEM, has(Items.BLUE_TERRACOTTA)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.CHUNK_CONTROLLER.get()).define('I', Tags.Items.INGOTS_IRON).define('R', Tags.Items.DUSTS_REDSTONE).define('A', Items.ENDER_EYE).pattern("IRI").pattern("RAR").pattern("IRI").unlockedBy(HAS_ITEM, has(Items.RESPAWN_ANCHOR)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.ENERGY_DETECTOR.get()).define('B', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('R', Items.REDSTONE_TORCH).define('C', Items.COMPARATOR).define('A', CASING).define('G', Tags.Items.INGOTS_GOLD).pattern("BRB").pattern("CAC").pattern("BGB").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.COMPUTER_TOOL.get()).define('I', Tags.Items.INGOTS_IRON).define('B', Items.BLUE_TERRACOTTA).pattern("I I").pattern("IBI").pattern(" B ").unlockedBy(HAS_ITEM, has(Items.BLUE_TERRACOTTA)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.ENVIRONMENT_DETECTOR.get()).define('W', ItemTags.WOOL).define('S', ItemTags.SAPLINGS).define('C', Tags.Items.CROPS).define('A', CASING).define('L', ItemTags.LEAVES).pattern("WSW").pattern("LAL").pattern("WCW").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.ENERGY_DETECTOR.get()).define('B', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('R', Items.REDSTONE_TORCH).define('C', Items.COMPARATOR).define('A', CASING).define('G', Tags.Items.INGOTS_GOLD).pattern("BRB").pattern("CAC").pattern("BGB").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.INVENTORY_MANAGER.get()).define('I', Tags.Items.INGOTS_IRON).define('C', Tags.Items.CHESTS).define('A', CASING).pattern("ICI").pattern("CAC").pattern("ICI").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.ENVIRONMENT_DETECTOR.get()).define('W', ItemTags.WOOL).define('S', ItemTags.SAPLINGS).define('C', Tags.Items.CROPS).define('A', CASING).define('L', ItemTags.LEAVES).pattern("WSW").pattern("LAL").pattern("WCW").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.MEMORY_CARD.get()).define('I', Tags.Items.INGOTS_IRON).define('W', Tags.Items.GLASS_WHITE).define('O', Items.OBSERVER).define('G', Tags.Items.INGOTS_GOLD).pattern("IWI").pattern("IOI").pattern(" G ").unlockedBy(HAS_ITEM, has(Items.OBSERVER)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.INVENTORY_MANAGER.get()).define('I', Tags.Items.INGOTS_IRON).define('C', Tags.Items.CHESTS).define('A', CASING).pattern("ICI").pattern("CAC").pattern("ICI").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.PERIPHERAL_CASING.get()).define('I', Tags.Items.INGOTS_IRON).define('i', Items.IRON_BARS).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).pattern("IiI").pattern("iRi").pattern("IiI").unlockedBy(HAS_ITEM, has(Items.REDSTONE_BLOCK)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.MEMORY_CARD.get()).define('I', Tags.Items.INGOTS_IRON).define('W', Tags.Items.GLASS_WHITE).define('O', Items.OBSERVER).define('G', Tags.Items.INGOTS_GOLD).pattern("IWI").pattern("IOI").pattern(" G ").unlockedBy(HAS_ITEM, has(Items.OBSERVER)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.PLAYER_DETECTOR.get()).define('S', Items.SMOOTH_STONE).define('A', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).pattern("SSS").pattern("SAS").pattern("SRS").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.PERIPHERAL_CASING.get()).define('I', Tags.Items.INGOTS_IRON).define('i', Items.IRON_BARS).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).pattern("IiI").pattern("iRi").pattern("IiI").unlockedBy(HAS_ITEM, has(Items.REDSTONE_BLOCK)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.REDSTONE_INTEGRATOR.get()).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('A', CASING).define('C', Items.COMPARATOR).pattern("RCR").pattern("CAC").pattern("RCR").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.PLAYER_DETECTOR.get()).define('S', Items.SMOOTH_STONE).define('A', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).pattern("SSS").pattern("SAS").pattern("SRS").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.BLOCK_READER.get()).define('O', Items.OBSERVER).define('I', Tags.Items.INGOTS_IRON).define('M', ModRegistry.Blocks.WIRED_MODEM_FULL.get()).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('A', CASING).pattern("IRI").pattern("MAO").pattern("IRI").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.REDSTONE_INTEGRATOR.get()).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('A', CASING).define('C', Items.COMPARATOR).pattern("RCR").pattern("CAC").pattern("RCR").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.GEO_SCANNER.get()).define('O', Items.OBSERVER).define('D', Tags.Items.GEMS_DIAMOND).define('C', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('M', ModRegistry.Blocks.WIRED_MODEM_FULL.get()).pattern("DMD").pattern("DCD").pattern("ROR").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.BLOCK_READER.get()).define('O', Items.OBSERVER).define('I', Tags.Items.INGOTS_IRON).define('M', ModRegistry.Blocks.WIRED_MODEM_FULL.get()).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('A', CASING).pattern("IRI").pattern("MAO").pattern("IRI").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.NBT_STORAGE.get()).define('C', Tags.Items.CHESTS).define('A', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('I', Tags.Items.INGOTS_IRON).pattern("ICI").pattern("CAC").pattern("RCR").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.GEO_SCANNER.get()).define('O', Items.OBSERVER).define('D', Tags.Items.GEMS_DIAMOND).define('C', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('M', ModRegistry.Blocks.WIRED_MODEM_FULL.get()).pattern("DMD").pattern("DCD").pattern("ROR").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ConditionalRecipe.builder().addCondition(modLoaded("minecolonies")).addRecipe(ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.COLONY_INTEGRATOR.get()).define('O', ItemTags.LOGS).define('A', CASING).define('B', Ingredient.fromValues(Stream.of(new RawValue(new ResourceLocation("minecolonies", "build_goggles"))))).define('S', Ingredient.fromValues(Stream.of(new RawValue(new ResourceLocation("structurize", "sceptergold"))))).define('R', Ingredient.fromValues(Stream.of(new RawValue(new ResourceLocation("minecolonies", "blockminecoloniesrack"))))).pattern("ORO").pattern("BAS").pattern("ORO").unlockedBy(HAS_ITEM, has(CASING))::save).build(consumer, new ResourceLocation(AdvancedPeripherals.MOD_ID, "colony_integrator")); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.NBT_STORAGE.get()).define('C', Tags.Items.CHESTS).define('A', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('I', Tags.Items.INGOTS_IRON).pattern("ICI").pattern("CAC").pattern("RCR").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ConditionalRecipe.builder().addCondition(modLoaded("ae2")).addRecipe(ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.ME_BRIDGE.get()).define('F', AEBlocks.FLUIX_BLOCK.asItem()).define('A', CASING).define('I', AEBlocks.INTERFACE.asItem()).pattern("FIF").pattern("IAI").pattern("FIF").unlockedBy(HAS_ITEM, has(CASING))::save).build(consumer, new ResourceLocation(AdvancedPeripherals.MOD_ID, "me_bridge")); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.ME_BRIDGE.get()).define('F', AEBlocks.FLUIX_BLOCK.asItem()).define('A', CASING).define('I', AEBlocks.INTERFACE.asItem()).pattern("FIF").pattern("IAI").pattern("FIF").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput.withConditions(new ModLoadedCondition(APAddons.AE2_MODID))); - ConditionalRecipe.builder().addCondition(modLoaded("refinedstorage")).addRecipe(ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.RS_BRIDGE.get()).define('Q', RSItems.QUARTZ_ENRICHED_IRON.get()).define('A', CASING).define('I', RSBlocks.INTERFACE.get()).pattern("QIQ").pattern("IAI").pattern("QIQ").unlockedBy(HAS_ITEM, has(CASING))::save).build(consumer, new ResourceLocation(AdvancedPeripherals.MOD_ID, "rs_bridge")); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, Blocks.RS_BRIDGE.get()).define('Q', RSItems.QUARTZ_ENRICHED_IRON.get()).define('A', CASING).define('I', RSBlocks.INTERFACE.get()).pattern("QIQ").pattern("IAI").pattern("QIQ").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput.withConditions(new ModLoadedCondition(APAddons.REFINEDSTORAGE_MODID))); - ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get()).define('A', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('S', Items.SOUL_LANTERN).define('D', Tags.Items.GEMS_DIAMOND).define('L', StrictNBTIngredient.of(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.LONG_REGENERATION))).pattern("RAR").pattern("DSD").pattern("RLR").unlockedBy(HAS_ITEM, has(CASING)).save(consumer); + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get()).define('A', CASING).define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE).define('S', Items.SOUL_LANTERN).define('D', Tags.Items.GEMS_DIAMOND).define('L', NBTIngredient.of(true, PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.LONG_REGENERATION))).pattern("RAR").pattern("DSD").pattern("RLR").unlockedBy(HAS_ITEM, has(CASING)).save(recipeOutput); - ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_WEAK_AUTOMATA_CORE.get()).requires(de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get()).requires(Items.NETHER_STAR).unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get())).save(consumer); + ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_WEAK_AUTOMATA_CORE.get()).requires(de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get()).requires(Items.NETHER_STAR).unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get())).save(recipeOutput); - ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_END_AUTOMATA_CORE.get()).requires(de.srendi.advancedperipherals.common.setup.Items.END_AUTOMATA_CORE.get()).requires(Items.NETHER_STAR).unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.END_AUTOMATA_CORE.get())).save(consumer); + ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_END_AUTOMATA_CORE.get()).requires(de.srendi.advancedperipherals.common.setup.Items.END_AUTOMATA_CORE.get()).requires(Items.NETHER_STAR).unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.END_AUTOMATA_CORE.get())).save(recipeOutput); - ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get()).requires(de.srendi.advancedperipherals.common.setup.Items.HUSBANDRY_AUTOMATA_CORE.get()).requires(Items.NETHER_STAR).unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.HUSBANDRY_AUTOMATA_CORE.get())).save(consumer); + ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get()).requires(de.srendi.advancedperipherals.common.setup.Items.HUSBANDRY_AUTOMATA_CORE.get()).requires(Items.NETHER_STAR).unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.HUSBANDRY_AUTOMATA_CORE.get())).save(recipeOutput); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java index 8a034f61a..7db008935 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java @@ -1,7 +1,8 @@ package de.srendi.advancedperipherals.common.data; +import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleUpgradeDataProvider; -import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; +import dan200.computercraft.api.upgrades.UpgradeSerialiser; import de.srendi.advancedperipherals.common.setup.Blocks; import de.srendi.advancedperipherals.common.setup.CCRegistration; import de.srendi.advancedperipherals.common.setup.Items; @@ -17,7 +18,7 @@ public TurtleUpgradesProvider(PackOutput generator) { } @Override - protected void addUpgrades(@NotNull Consumer>> addUpgrade) { + protected void addUpgrades(@NotNull Consumer>> addUpgrade) { simpleWithCustomItem(CCRegistration.ID.CHATTY_TURTLE, CCRegistration.CHAT_BOX_TURTLE.get(), Blocks.CHAT_BOX.get().asItem()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.PLAYER_TURTLE, CCRegistration.PLAYER_DETECTOR_TURTLE.get(), Blocks.PLAYER_DETECTOR.get().asItem()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.ENVIRONMENT_TURTLE, CCRegistration.ENVIRONMENT_TURTLE.get(), Blocks.ENVIRONMENT_DETECTOR.get().asItem()).add(addUpgrade); @@ -32,4 +33,5 @@ protected void addUpgrades(@NotNull Consumer> simpleWithCustomItem(CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, CCRegistration.OP_HUSBANDRY_TURTLE.get(), Items.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get()).add(addUpgrade); } + } diff --git a/src/main/java/de/srendi/advancedperipherals/common/events/Events.java b/src/main/java/de/srendi/advancedperipherals/common/events/Events.java index ee9e4b3ef..68f90cd45 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/events/Events.java +++ b/src/main/java/de/srendi/advancedperipherals/common/events/Events.java @@ -4,21 +4,22 @@ import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.MessageArgument; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.event.CommandEvent; -import net.minecraftforge.event.ServerChatEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.CommandEvent; +import net.neoforged.neoforge.event.ServerChatEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; import java.util.function.Consumer; @@ -40,9 +41,9 @@ public static void onWorldJoin(PlayerEvent.PlayerLoggedInEvent event) { // We could switch to the advancement way to give new players the book. However, that would not allow us to create // a config option for that. So we will stick with the custom solution here. // See https://vazkiimods.github.io/Patchouli/docs/patchouli-basics/giving-new - if (APConfig.WORLD_CONFIG.givePlayerBookOnJoin.get()) { + if (APConfig.WORLD_CONFIG.givePlayerBookOnJoin.get() && APAddons.patchouliLoaded) { if (!hasPlayedBefore(player)) { - ItemStack book = new ItemStack(ForgeRegistries.ITEMS.getValue(new ResourceLocation("patchouli", "guide_book"))); + ItemStack book = new ItemStack(ItemUtil.getRegistryEntry("patchouli:guide_book", BuiltInRegistries.ITEM)); CompoundTag nbt = new CompoundTag(); nbt.putString("patchouli:book", "advancedperipherals:manual"); book.setTag(nbt); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java index 030862818..55ae94e96 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/MemoryCardItem.java @@ -1,8 +1,11 @@ package de.srendi.advancedperipherals.common.items; +import de.srendi.advancedperipherals.client.ClientUUIDCache; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.items.base.BaseItem; import de.srendi.advancedperipherals.common.util.EnumColor; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; @@ -16,6 +19,8 @@ public class MemoryCardItem extends BaseItem { + public static final String OWNER_NBT_KEY = "ownerId"; + public MemoryCardItem() { super(new Properties().stacksTo(1)); } @@ -28,21 +33,27 @@ public boolean isEnabled() { @Override public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, levelIn, tooltip, flagIn); - if (stack.getOrCreateTag().contains("owner")) - tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.memory_card.bound", stack.getOrCreateTag().getString("owner")))); - + CompoundTag data = stack.getOrCreateTag(); + Minecraft minecraft = Minecraft.getInstance(); + if (data.contains(OWNER_NBT_KEY)) { + String username = ClientUUIDCache.getUsername(data.getUUID(OWNER_NBT_KEY), minecraft.player.getUUID()); + if (username == null) + username = data.getUUID(OWNER_NBT_KEY).toString(); + tooltip.add(EnumColor.buildTextComponent(Component.translatable("item.advancedperipherals.tooltip.memory_card.bound", username))); + } } @Override public InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { if (!worldIn.isClientSide) { ItemStack stack = playerIn.getItemInHand(handIn); - if (stack.getOrCreateTag().contains("owner")) { + CompoundTag data = stack.getOrCreateTag(); + if (data.contains(OWNER_NBT_KEY)) { playerIn.displayClientMessage(Component.translatable("text.advancedperipherals.removed_player"), true); - stack.getOrCreateTag().remove("owner"); + data.remove(OWNER_NBT_KEY); } else { playerIn.displayClientMessage(Component.translatable("text.advancedperipherals.added_player"), true); - stack.getOrCreateTag().putString("owner", playerIn.getName().getString()); + data.putUUID(OWNER_NBT_KEY, playerIn.getUUID()); } } return super.use(worldIn, playerIn, handIn); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java b/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java index a6dd52389..15c11c67b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java @@ -4,6 +4,7 @@ import de.srendi.advancedperipherals.common.setup.Items; import de.srendi.advancedperipherals.common.util.EnumColor; import de.srendi.advancedperipherals.lib.metaphysics.IFeedableAutomataCore; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -16,8 +17,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.util.FakePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,13 +35,13 @@ public class WeakAutomataCore extends APItem implements IFeedableAutomataCore { static { Map endSouls = new HashMap<>(); - endSouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.ENDERMAN).toString(), 10); + endSouls.put(BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.ENDERMAN).toString(), 10); WeakAutomataCoreRecord endSoulRecord = new WeakAutomataCoreRecord(endSouls, Items.END_AUTOMATA_CORE.get()); Map husbandrySouls = new HashMap<>(); - husbandrySouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.COW).toString(), 3); - husbandrySouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.SHEEP).toString(), 3); - husbandrySouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.CHICKEN).toString(), 3); + husbandrySouls.put(BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.COW).toString(), 3); + husbandrySouls.put(BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.SHEEP).toString(), 3); + husbandrySouls.put(BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.CHICKEN).toString(), 3); WeakAutomataCoreRecord husbandrySoulRecord = new WeakAutomataCoreRecord(husbandrySouls, Items.HUSBANDRY_AUTOMATA_CORE.get()); endSoulRecord.ingredients.keySet().forEach(entityType -> AUTOMATA_CORE_REGISTRY.put(entityType, endSoulRecord)); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java index f0facfa03..6f5c0afd8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/base/BaseItem.java @@ -14,7 +14,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -38,7 +37,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In if (this instanceof IInventoryItem inventoryItem) { ServerPlayer serverPlayerEntity = (ServerPlayer) playerIn; ItemStack stack = playerIn.getItemInHand(handIn); - NetworkHooks.openScreen(serverPlayerEntity, inventoryItem.createContainer(playerIn, stack), buf -> buf.writeItem(stack)); + serverPlayerEntity.openMenu(inventoryItem.createContainer(playerIn, stack), buf -> buf.writeItem(stack)); } return super.use(worldIn, playerIn, handIn); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java index e9364067f..f1a5827e5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java @@ -1,26 +1,34 @@ package de.srendi.advancedperipherals.common.setup; import com.google.common.collect.Sets; -import de.srendi.advancedperipherals.common.blocks.blockentities.*; +import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.blocks.blockentities.BlockReaderEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.ChatBoxEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.EnvironmentDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.GeoScannerEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.InventoryManagerEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.MeBridgeEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.NBTStorageEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.PlayerDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.RsBridgeEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; public class BlockEntityTypes { - public static final RegistryObject> CHAT_BOX = Registration.TILE_ENTITIES.register("chat_box", () -> new BlockEntityType<>(ChatBoxEntity::new, Sets.newHashSet(Blocks.CHAT_BOX.get()), null)); - public static final RegistryObject> ENVIRONMENT_DETECTOR = Registration.TILE_ENTITIES.register("environment_detector", () -> new BlockEntityType<>(EnvironmentDetectorEntity::new, Sets.newHashSet(Blocks.ENVIRONMENT_DETECTOR.get()), null)); - public static final RegistryObject> PLAYER_DETECTOR = Registration.TILE_ENTITIES.register("player_detector", () -> new BlockEntityType<>(PlayerDetectorEntity::new, Sets.newHashSet(Blocks.PLAYER_DETECTOR.get()), null)); - public static final RegistryObject> ME_BRIDGE = ModList.get().isLoaded("ae2") ? Registration.TILE_ENTITIES.register("me_bridge", () -> new BlockEntityType<>(MeBridgeEntity::new, Sets.newHashSet(Blocks.ME_BRIDGE.get()), null)) : null; - public static final RegistryObject> RS_BRIDGE = ModList.get().isLoaded("refinedstorage") ? Registration.TILE_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RsBridgeEntity::new, Sets.newHashSet(Blocks.RS_BRIDGE.get()), null)) : null; - public static final RegistryObject> ENERGY_DETECTOR = Registration.TILE_ENTITIES.register("energy_detector", () -> new BlockEntityType<>(EnergyDetectorEntity::new, Sets.newHashSet(Blocks.ENERGY_DETECTOR.get()), null)); - public static final RegistryObject> INVENTORY_MANAGER = Registration.TILE_ENTITIES.register("inventory_manager", () -> new BlockEntityType<>(InventoryManagerEntity::new, Sets.newHashSet(Blocks.INVENTORY_MANAGER.get()), null)); - public static final RegistryObject> REDSTONE_INTEGRATOR = Registration.TILE_ENTITIES.register("redstone_integrator", () -> new BlockEntityType<>(RedstoneIntegratorEntity::new, Sets.newHashSet(Blocks.REDSTONE_INTEGRATOR.get()), null)); - public static final RegistryObject> BLOCK_READER = Registration.TILE_ENTITIES.register("block_reader", () -> new BlockEntityType<>(BlockReaderEntity::new, Sets.newHashSet(Blocks.BLOCK_READER.get()), null)); - public static final RegistryObject> GEO_SCANNER = Registration.TILE_ENTITIES.register("geo_scanner", () -> new BlockEntityType<>(GeoScannerEntity::new, Sets.newHashSet(Blocks.GEO_SCANNER.get()), null)); - public static final RegistryObject> COLONY_INTEGRATOR = Registration.TILE_ENTITIES.register("colony_integrator", () -> new BlockEntityType<>(ColonyIntegratorEntity::new, Sets.newHashSet(Blocks.COLONY_INTEGRATOR.get()), null)); - - public static final RegistryObject> NBT_STORAGE = Registration.TILE_ENTITIES.register("nbt_storage", () -> new BlockEntityType<>(NBTStorageEntity::new, Sets.newHashSet(Blocks.NBT_STORAGE.get()), null)); + public static final DeferredHolder, BlockEntityType> CHAT_BOX = Registration.BLOCK_ENTITIES.register("chat_box", () -> new BlockEntityType<>(ChatBoxEntity::new, Sets.newHashSet(Blocks.CHAT_BOX.get()), null)); + public static final DeferredHolder, BlockEntityType> ENVIRONMENT_DETECTOR = Registration.BLOCK_ENTITIES.register("environment_detector", () -> new BlockEntityType<>(EnvironmentDetectorEntity::new, Sets.newHashSet(Blocks.ENVIRONMENT_DETECTOR.get()), null)); + public static final DeferredHolder, BlockEntityType> PLAYER_DETECTOR = Registration.BLOCK_ENTITIES.register("player_detector", () -> new BlockEntityType<>(PlayerDetectorEntity::new, Sets.newHashSet(Blocks.PLAYER_DETECTOR.get()), null)); + public static final DeferredHolder, BlockEntityType> ME_BRIDGE = APAddons.ae2Loaded ? Registration.BLOCK_ENTITIES.register("me_bridge", () -> new BlockEntityType<>(MeBridgeEntity::new, Sets.newHashSet(Blocks.ME_BRIDGE.get()), null)) : null; + public static final DeferredHolder, BlockEntityType> RS_BRIDGE = APAddons.refinedStorageLoaded ? Registration.BLOCK_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RsBridgeEntity::new, Sets.newHashSet(Blocks.RS_BRIDGE.get()), null)) : null; + public static final DeferredHolder, BlockEntityType> ENERGY_DETECTOR = Registration.BLOCK_ENTITIES.register("energy_detector", () -> new BlockEntityType<>(EnergyDetectorEntity::new, Sets.newHashSet(Blocks.ENERGY_DETECTOR.get()), null)); + public static final DeferredHolder, BlockEntityType> INVENTORY_MANAGER = Registration.BLOCK_ENTITIES.register("inventory_manager", () -> new BlockEntityType<>(InventoryManagerEntity::new, Sets.newHashSet(Blocks.INVENTORY_MANAGER.get()), null)); + public static final DeferredHolder, BlockEntityType> REDSTONE_INTEGRATOR = Registration.BLOCK_ENTITIES.register("redstone_integrator", () -> new BlockEntityType<>(RedstoneIntegratorEntity::new, Sets.newHashSet(Blocks.REDSTONE_INTEGRATOR.get()), null)); + public static final DeferredHolder, BlockEntityType> BLOCK_READER = Registration.BLOCK_ENTITIES.register("block_reader", () -> new BlockEntityType<>(BlockReaderEntity::new, Sets.newHashSet(Blocks.BLOCK_READER.get()), null)); + public static final DeferredHolder, BlockEntityType> GEO_SCANNER = Registration.BLOCK_ENTITIES.register("geo_scanner", () -> new BlockEntityType<>(GeoScannerEntity::new, Sets.newHashSet(Blocks.GEO_SCANNER.get()), null)); + public static final DeferredHolder, BlockEntityType> NBT_STORAGE = Registration.BLOCK_ENTITIES.register("nbt_storage", () -> new BlockEntityType<>(NBTStorageEntity::new, Sets.newHashSet(Blocks.NBT_STORAGE.get()), null)); public static void register() { } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java b/src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java index eb6cf8681..c00fb2a3d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.setup; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.blocks.PlayerDetectorBlock; import de.srendi.advancedperipherals.common.blocks.RedstoneIntegratorBlock; import de.srendi.advancedperipherals.common.blocks.base.APBlockEntityBlock; @@ -12,36 +13,34 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; import java.util.function.Supplier; public class Blocks { - public static final RegistryObject ENVIRONMENT_DETECTOR = register("environment_detector", () -> new APBlockEntityBlock<>(BlockEntityTypes.ENVIRONMENT_DETECTOR, false), () -> new APBlockItem(Blocks.ENVIRONMENT_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnvironmentDetector::get)); - public static final RegistryObject CHAT_BOX = register("chat_box", () -> new APBlockEntityBlock<>(BlockEntityTypes.CHAT_BOX, true), () -> new APBlockItem(Blocks.CHAT_BOX.get(), APConfig.PERIPHERALS_CONFIG.enableChatBox::get)); - public static final RegistryObject PLAYER_DETECTOR = register("player_detector", PlayerDetectorBlock::new, () -> new APBlockItem(Blocks.PLAYER_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enablePlayerDetector::get)); - public static final RegistryObject ME_BRIDGE = register("me_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("ae2") ? BlockEntityTypes.ME_BRIDGE : null, ModList.get().isLoaded("ae2")), () -> new APBlockItem(Blocks.ME_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableMEBridge::get)); - public static final RegistryObject RS_BRIDGE = register("rs_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("refinedstorage") ? BlockEntityTypes.RS_BRIDGE : null, false), () -> new APBlockItem(Blocks.RS_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableRSBridge::get)); - public static final RegistryObject ENERGY_DETECTOR = register("energy_detector", () -> new APBlockEntityBlock<>(BlockEntityTypes.ENERGY_DETECTOR, true), () -> new APBlockItem(Blocks.ENERGY_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnergyDetector::get)); - public static final RegistryObject PERIPHERAL_CASING = register("peripheral_casing", BaseBlock::new, () -> new APBlockItem(Blocks.PERIPHERAL_CASING.get(), new Item.Properties().stacksTo(16), () -> true)); - public static final RegistryObject INVENTORY_MANAGER = register("inventory_manager", () -> new APBlockEntityBlock<>(BlockEntityTypes.INVENTORY_MANAGER, false), () -> new APBlockItem(Blocks.INVENTORY_MANAGER.get(), APConfig.PERIPHERALS_CONFIG.enableInventoryManager::get)); - public static final RegistryObject REDSTONE_INTEGRATOR = register("redstone_integrator", RedstoneIntegratorBlock::new, () -> new APBlockItem(Blocks.REDSTONE_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableRedstoneIntegrator::get)); - public static final RegistryObject BLOCK_READER = register("block_reader", () -> new APBlockEntityBlock<>(BlockEntityTypes.BLOCK_READER, true), () -> new APBlockItem(Blocks.BLOCK_READER.get(), APConfig.PERIPHERALS_CONFIG.enableBlockReader::get)); - public static final RegistryObject GEO_SCANNER = register("geo_scanner", () -> new APBlockEntityBlock<>(BlockEntityTypes.GEO_SCANNER, false), () -> new APBlockItem(Blocks.GEO_SCANNER.get(), APConfig.PERIPHERALS_CONFIG.enableGeoScanner::get)); - public static final RegistryObject COLONY_INTEGRATOR = register("colony_integrator", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("minecolonies") ? BlockEntityTypes.COLONY_INTEGRATOR : null, false), () -> new APBlockItem(Blocks.COLONY_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableColonyIntegrator::get)); - public static final RegistryObject NBT_STORAGE = register("nbt_storage", () -> new APBlockEntityBlock<>(BlockEntityTypes.NBT_STORAGE, false), () -> new APBlockItem(Blocks.NBT_STORAGE.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage::get)); + public static final DeferredHolder> ENVIRONMENT_DETECTOR = register("environment_detector", () -> new APBlockEntityBlock<>(BlockEntityTypes.ENVIRONMENT_DETECTOR, false), () -> new APBlockItem(Blocks.ENVIRONMENT_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnvironmentDetector::get)); + public static final DeferredHolder> CHAT_BOX = register("chat_box", () -> new APBlockEntityBlock<>(BlockEntityTypes.CHAT_BOX, true), () -> new APBlockItem(Blocks.CHAT_BOX.get(), APConfig.PERIPHERALS_CONFIG.enableChatBox::get)); + public static final DeferredHolder> PLAYER_DETECTOR = register("player_detector", PlayerDetectorBlock::new, () -> new APBlockItem(Blocks.PLAYER_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enablePlayerDetector::get)); + public static final DeferredHolder> ME_BRIDGE = register("me_bridge", () -> new APBlockEntityBlock<>(APAddons.ae2Loaded ? BlockEntityTypes.ME_BRIDGE : null, APAddons.ae2Loaded), () -> new APBlockItem(Blocks.ME_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableMEBridge::get)); + public static final DeferredHolder> RS_BRIDGE = register("rs_bridge", () -> new APBlockEntityBlock<>(APAddons.refinedStorageLoaded ? BlockEntityTypes.RS_BRIDGE : null, false), () -> new APBlockItem(Blocks.RS_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableRSBridge::get)); + public static final DeferredHolder> ENERGY_DETECTOR = register("energy_detector", () -> new APBlockEntityBlock<>(BlockEntityTypes.ENERGY_DETECTOR, true), () -> new APBlockItem(Blocks.ENERGY_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnergyDetector::get)); + public static final DeferredHolder PERIPHERAL_CASING = register("peripheral_casing", BaseBlock::new, () -> new APBlockItem(Blocks.PERIPHERAL_CASING.get(), new Item.Properties().stacksTo(16), () -> true)); + public static final DeferredHolder> INVENTORY_MANAGER = register("inventory_manager", () -> new APBlockEntityBlock<>(BlockEntityTypes.INVENTORY_MANAGER, false), () -> new APBlockItem(Blocks.INVENTORY_MANAGER.get(), APConfig.PERIPHERALS_CONFIG.enableInventoryManager::get)); + public static final DeferredHolder REDSTONE_INTEGRATOR = register("redstone_integrator", RedstoneIntegratorBlock::new, () -> new APBlockItem(Blocks.REDSTONE_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableRedstoneIntegrator::get)); + public static final DeferredHolder> BLOCK_READER = register("block_reader", () -> new APBlockEntityBlock<>(BlockEntityTypes.BLOCK_READER, true), () -> new APBlockItem(Blocks.BLOCK_READER.get(), APConfig.PERIPHERALS_CONFIG.enableBlockReader::get)); + public static final DeferredHolder> GEO_SCANNER = register("geo_scanner", () -> new APBlockEntityBlock<>(BlockEntityTypes.GEO_SCANNER, false), () -> new APBlockItem(Blocks.GEO_SCANNER.get(), APConfig.PERIPHERALS_CONFIG.enableGeoScanner::get)); + public static final DeferredHolder> NBT_STORAGE = register("nbt_storage", () -> new APBlockEntityBlock<>(BlockEntityTypes.NBT_STORAGE, false), () -> new APBlockItem(Blocks.NBT_STORAGE.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage::get)); public static void register() { } - private static RegistryObject registerNoItem(String name, Supplier block) { + private static DeferredHolder registerNoItem(String name, Supplier block) { return Registration.BLOCKS.register(name, block); } - private static RegistryObject register(String name, Supplier block, Supplier blockItem) { - RegistryObject registryObject = registerNoItem(name, block); + private static DeferredHolder register(String name, Supplier block, Supplier blockItem) { + DeferredHolder registryObject = registerNoItem(name, block); Registration.ITEMS.register(name, blockItem); return registryObject; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java index fa774ba6f..0b5a89c89 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java @@ -1,45 +1,55 @@ package de.srendi.advancedperipherals.common.setup; -import dan200.computercraft.api.ForgeComputerCraftAPI; -import dan200.computercraft.api.pocket.PocketUpgradeSerialiser; -import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; +import dan200.computercraft.api.pocket.IPocketUpgrade; +import dan200.computercraft.api.turtle.ITurtleUpgrade; +import dan200.computercraft.api.upgrades.UpgradeSerialiser; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.integrations.IntegrationPeripheralProvider; -import de.srendi.advancedperipherals.common.addons.computercraft.pocket.*; -import de.srendi.advancedperipherals.common.addons.computercraft.turtles.*; -import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.*; +import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketChatBoxUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketEnvironmentUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketGeoScannerUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketPlayerDetectorUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleChatBoxUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleChunkyUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleCompassUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleEnvironmentDetectorUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleGeoScannerUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtlePlayerDetectorUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.EndAutomata; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.HusbandryAutomata; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.OverpoweredEndAutomata; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.OverpoweredHusbandryAutomata; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.OverpoweredWeakAutomata; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.WeakAutomata; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; -@Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class CCRegistration { - public static final RegistryObject> CHAT_BOX_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.CHATTY_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleChatBoxUpgrade::new)); - public static final RegistryObject> PLAYER_DETECTOR_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.PLAYER_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtlePlayerDetectorUpgrade::new)); - public static final RegistryObject> ENVIRONMENT_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.ENVIRONMENT_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleEnvironmentDetectorUpgrade::new)); - public static final RegistryObject> CHUNKY_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.CHUNKY_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleChunkyUpgrade::new)); - public static final RegistryObject> GEO_SCANNER_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.GEOSCANNER_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleGeoScannerUpgrade::new)); - public static final RegistryObject> COMPASS_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.COMPASS_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleCompassUpgrade::new)); - public static final RegistryObject> WEAK_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.WEAK_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(WeakAutomata::new)); - public static final RegistryObject> END_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.END_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(EndAutomata::new)); - public static final RegistryObject> HUSBANDRY_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.HUSBANDRY_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(HusbandryAutomata::new)); - public static final RegistryObject> OP_WEAK_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.OP_WEAK_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(OverpoweredWeakAutomata::new)); - public static final RegistryObject> OP_END_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.OP_END_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(OverpoweredEndAutomata::new)); - public static final RegistryObject> OP_HUSBANDRY_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.OP_HUSBANDRY_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(OverpoweredHusbandryAutomata::new)); + public static final DeferredHolder, UpgradeSerialiser> CHAT_BOX_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.CHATTY_TURTLE.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(TurtleChatBoxUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> PLAYER_DETECTOR_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.PLAYER_TURTLE.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(TurtlePlayerDetectorUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> ENVIRONMENT_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.ENVIRONMENT_TURTLE.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(TurtleEnvironmentDetectorUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> CHUNKY_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.CHUNKY_TURTLE.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(TurtleChunkyUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> GEO_SCANNER_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.GEOSCANNER_TURTLE.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(TurtleGeoScannerUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> COMPASS_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.COMPASS_TURTLE.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(TurtleCompassUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> WEAK_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.WEAK_AUTOMATA.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(WeakAutomata::new)); + public static final DeferredHolder, UpgradeSerialiser> END_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.END_AUTOMATA.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(EndAutomata::new)); + public static final DeferredHolder, UpgradeSerialiser> HUSBANDRY_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.HUSBANDRY_AUTOMATA.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(HusbandryAutomata::new)); + public static final DeferredHolder, UpgradeSerialiser> OP_WEAK_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.OP_WEAK_AUTOMATA.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(OverpoweredWeakAutomata::new)); + public static final DeferredHolder, UpgradeSerialiser> OP_END_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.OP_END_AUTOMATA.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(OverpoweredEndAutomata::new)); + public static final DeferredHolder, UpgradeSerialiser> OP_HUSBANDRY_TURTLE = Registration.TURTLE_SERIALIZER.register(ID.OP_HUSBANDRY_AUTOMATA.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(OverpoweredHusbandryAutomata::new)); - public static final RegistryObject> CHAT_BOX_POCKET = Registration.POCKET_SERIALIZER.register(ID.CHATTY_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketChatBoxUpgrade::new)); - public static final RegistryObject> PLAYER_DETECTOR_POCKET = Registration.POCKET_SERIALIZER.register(ID.PLAYER_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketPlayerDetectorUpgrade::new)); - public static final RegistryObject> ENVIRONMENT_POCKET = Registration.POCKET_SERIALIZER.register(ID.ENVIRONMENT_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketEnvironmentUpgrade::new)); - public static final RegistryObject> GEO_SCANNER_POCKET = Registration.POCKET_SERIALIZER.register(ID.GEOSCANNER_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketGeoScannerUpgrade::new)); - public static final RegistryObject> COLONY_POCKET = Registration.POCKET_SERIALIZER.register(ID.COLONY_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketColonyIntegratorUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> CHAT_BOX_POCKET = Registration.POCKET_SERIALIZER.register(ID.CHATTY_POCKET.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(PocketChatBoxUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> PLAYER_DETECTOR_POCKET = Registration.POCKET_SERIALIZER.register(ID.PLAYER_POCKET.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(PocketPlayerDetectorUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> ENVIRONMENT_POCKET = Registration.POCKET_SERIALIZER.register(ID.ENVIRONMENT_POCKET.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(PocketEnvironmentUpgrade::new)); + public static final DeferredHolder, UpgradeSerialiser> GEO_SCANNER_POCKET = Registration.POCKET_SERIALIZER.register(ID.GEOSCANNER_POCKET.getPath(), () -> UpgradeSerialiser.simpleWithCustomItem(PocketGeoScannerUpgrade::new)); public static IntegrationPeripheralProvider integrationPeripheralProvider; public static void register() { IntegrationPeripheralProvider.load(); integrationPeripheralProvider = new IntegrationPeripheralProvider(); - ForgeComputerCraftAPI.registerPeripheralProvider(integrationPeripheralProvider); + //ForgeComputerCraftAPI.registerPeripheralProvider(integrationPeripheralProvider); } public static class ID { diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java index 68ed5dc8c..10fea72b7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java @@ -4,12 +4,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.level.Level; -import net.minecraftforge.common.extensions.IForgeMenuType; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; +import net.neoforged.neoforge.registries.DeferredHolder; public class ContainerTypes { - public static final RegistryObject> INVENTORY_MANAGER_CONTAINER = Registration.CONTAINER_TYPES.register("memory_card_container", () -> IForgeMenuType.create((windowId, inv, data) -> { + public static final DeferredHolder, MenuType> INVENTORY_MANAGER_CONTAINER = Registration.CONTAINER_TYPES.register("memory_card_container", () -> IMenuTypeExtension.create((windowId, inv, data) -> { BlockPos pos = data.readBlockPos(); Level level = inv.player.getCommandSenderWorld(); return new InventoryManagerContainer(windowId, inv, pos, level); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/CreativeTabs.java b/src/main/java/de/srendi/advancedperipherals/common/setup/CreativeTabs.java index f7cb8f1a4..78b7e74e3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/CreativeTabs.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/CreativeTabs.java @@ -3,11 +3,11 @@ import de.srendi.advancedperipherals.APCreativeTab; import de.srendi.advancedperipherals.AdvancedPeripherals; import net.minecraft.world.item.CreativeModeTab; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; public class CreativeTabs { - public static final RegistryObject AP_CREATIVE_MODE_TAB = Registration.CREATIVE_MODE_TABS.register(AdvancedPeripherals.MOD_ID, CreativeTabs::createCreativeTab); + public static final DeferredHolder AP_CREATIVE_MODE_TAB = Registration.CREATIVE_MODE_TABS.register(AdvancedPeripherals.MOD_ID, CreativeTabs::createCreativeTab); private static CreativeModeTab createCreativeTab() { CreativeModeTab.Builder builder = new CreativeModeTab.Builder(CreativeModeTab.Row.BOTTOM, -1); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Items.java b/src/main/java/de/srendi/advancedperipherals/common/setup/Items.java index 89a165ca9..ac18fd75b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/Items.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/Items.java @@ -5,19 +5,19 @@ import de.srendi.advancedperipherals.common.items.MemoryCardItem; import de.srendi.advancedperipherals.common.items.WeakAutomataCore; import net.minecraft.world.item.Item; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; public class Items { - public static final RegistryObject CHUNK_CONTROLLER = Registration.ITEMS.register("chunk_controller", () -> new APItem(new Item.Properties().stacksTo(16), APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle::get)); - public static final RegistryObject COMPUTER_TOOL = Registration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), () -> true)); - public static final RegistryObject MEMORY_CARD = Registration.ITEMS.register("memory_card", MemoryCardItem::new); - public static final RegistryObject END_AUTOMATA_CORE = Registration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); - public static final RegistryObject HUSBANDRY_AUTOMATA_CORE = Registration.ITEMS.register("husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore)); - public static final RegistryObject WEAK_AUTOMATA_CORE = Registration.ITEMS.register("weak_automata_core", () -> new WeakAutomataCore(new Item.Properties().stacksTo(1))); - public static final RegistryObject OVERPOWERED_WEAK_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_weak_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore)); - public static final RegistryObject OVERPOWERED_END_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); - public static final RegistryObject OVERPOWERED_HUSBANDRY_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore)); + public static final DeferredHolder CHUNK_CONTROLLER = Registration.ITEMS.register("chunk_controller", () -> new APItem(new Item.Properties().stacksTo(16), APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle::get)); + public static final DeferredHolder COMPUTER_TOOL = Registration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), () -> true)); + public static final DeferredHolder MEMORY_CARD = Registration.ITEMS.register("memory_card", MemoryCardItem::new); + public static final DeferredHolder END_AUTOMATA_CORE = Registration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); + public static final DeferredHolder HUSBANDRY_AUTOMATA_CORE = Registration.ITEMS.register("husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore)); + public static final DeferredHolder WEAK_AUTOMATA_CORE = Registration.ITEMS.register("weak_automata_core", () -> new WeakAutomataCore(new Item.Properties().stacksTo(1))); + public static final DeferredHolder OVERPOWERED_WEAK_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_weak_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore)); + public static final DeferredHolder OVERPOWERED_END_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); + public static final DeferredHolder OVERPOWERED_HUSBANDRY_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore)); public static void register() { } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Registration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/Registration.java index 7199921ea..80c8e0a63 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/Registration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/Registration.java @@ -1,38 +1,34 @@ package de.srendi.advancedperipherals.common.setup; -import dan200.computercraft.api.pocket.PocketUpgradeSerialiser; -import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; +import dan200.computercraft.api.pocket.IPocketUpgrade; +import dan200.computercraft.api.turtle.ITurtleUpgrade; +import dan200.computercraft.api.upgrades.UpgradeSerialiser; import de.srendi.advancedperipherals.AdvancedPeripherals; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -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.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; public class Registration { - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, AdvancedPeripherals.MOD_ID); - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, AdvancedPeripherals.MOD_ID); - public static final DeferredRegister> TILE_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, AdvancedPeripherals.MOD_ID); - public static final DeferredRegister> CONTAINER_TYPES = DeferredRegister.create(ForgeRegistries.MENU_TYPES, AdvancedPeripherals.MOD_ID); - public static final DeferredRegister POI_TYPES = DeferredRegister.create(ForgeRegistries.POI_TYPES, AdvancedPeripherals.MOD_ID); - public static final DeferredRegister VILLAGER_PROFESSIONS = DeferredRegister.create(ForgeRegistries.VILLAGER_PROFESSIONS, AdvancedPeripherals.MOD_ID); - public static final DeferredRegister> TURTLE_SERIALIZER = DeferredRegister.create(TurtleUpgradeSerialiser.registryId(), AdvancedPeripherals.MOD_ID); - public static final DeferredRegister> POCKET_SERIALIZER = DeferredRegister.create(PocketUpgradeSerialiser.registryId(), AdvancedPeripherals.MOD_ID); + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(AdvancedPeripherals.MOD_ID); + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(AdvancedPeripherals.MOD_ID); + public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, AdvancedPeripherals.MOD_ID); + public static final DeferredRegister> CONTAINER_TYPES = DeferredRegister.create(Registries.MENU, AdvancedPeripherals.MOD_ID); + public static final DeferredRegister POI_TYPES = DeferredRegister.create(Registries.POINT_OF_INTEREST_TYPE, AdvancedPeripherals.MOD_ID); + public static final DeferredRegister VILLAGER_PROFESSIONS = DeferredRegister.create(Registries.VILLAGER_PROFESSION, AdvancedPeripherals.MOD_ID); + public static final DeferredRegister> TURTLE_SERIALIZER = DeferredRegister.create(ITurtleUpgrade.serialiserRegistryKey(), AdvancedPeripherals.MOD_ID); + public static final DeferredRegister> POCKET_SERIALIZER = DeferredRegister.create(IPocketUpgrade.serialiserRegistryKey(), AdvancedPeripherals.MOD_ID); public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, AdvancedPeripherals.MOD_ID); - public static void register() { - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + public static void register(IEventBus modEventBus) { BLOCKS.register(modEventBus); ITEMS.register(modEventBus); - TILE_ENTITIES.register(modEventBus); + BLOCK_ENTITIES.register(modEventBus); CONTAINER_TYPES.register(modEventBus); POI_TYPES.register(modEventBus); VILLAGER_PROFESSIONS.register(modEventBus); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java b/src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java index a57ec197b..6cd5da95d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java @@ -6,12 +6,13 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.npc.VillagerProfession; -import net.minecraftforge.registries.RegistryObject; + +import java.util.function.Supplier; public class Villagers { - public static final RegistryObject COMPUTER_SCIENTIST_POI = Registration.POI_TYPES.register("computer_scientist", () -> new PoiType(ImmutableSet.copyOf(ModRegistry.Blocks.COMPUTER_ADVANCED.get().getStateDefinition().getPossibleStates()), 1, 1)); - public static final RegistryObject COMPUTER_SCIENTIST = Registration.VILLAGER_PROFESSIONS.register("computer_scientist", () -> new VillagerProfession(AdvancedPeripherals.MOD_ID + ":computer_scientist", holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), ImmutableSet.of(), ImmutableSet.of(ModRegistry.Blocks.COMPUTER_ADVANCED.get()), SoundEvents.VILLAGER_WORK_TOOLSMITH)); + public static final Supplier COMPUTER_SCIENTIST_POI = Registration.POI_TYPES.register("computer_scientist", () -> new PoiType(ImmutableSet.copyOf(ModRegistry.Blocks.COMPUTER_ADVANCED.get().getStateDefinition().getPossibleStates()), 1, 1)); + public static final Supplier COMPUTER_SCIENTIST = Registration.VILLAGER_PROFESSIONS.register("computer_scientist", () -> new VillagerProfession(AdvancedPeripherals.MOD_ID + ":computer_scientist", holder -> holder.is(AdvancedPeripherals.getRL("computer_scientist")), holder -> holder.is(AdvancedPeripherals.getRL("computer_scientist")), ImmutableSet.of(), ImmutableSet.of(ModRegistry.Blocks.COMPUTER_ADVANCED.get()), SoundEvents.VILLAGER_WORK_TOOLSMITH)); public static void register() { } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java b/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java index dbd324dc8..c199ae736 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java @@ -2,53 +2,61 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.configuration.APConfig; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.saveddata.SavedData; -import net.minecraftforge.common.world.ForgeChunkManager; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.server.ServerLifecycleHooks; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.world.chunk.RegisterTicketControllersEvent; +import net.neoforged.neoforge.common.world.chunk.TicketController; +import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.apache.logging.log4j.Level; import org.jetbrains.annotations.NotNull; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.UUID; @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public class ChunkManager extends SavedData { private static final String DATA_NAME = AdvancedPeripherals.MOD_ID + "_ForcedChunks"; private static final String FORCED_CHUNKS_TAG = "forcedChunks"; - private static int tickCounter = 0; + private static long tickCounter = 0; private final Map forcedChunks = new HashMap<>(); private boolean initialized = false; + private static final TicketController controller = new TicketController(AdvancedPeripherals.getRL("chunkcontroller"), null); + public ChunkManager() { super(); } public static @NotNull ChunkManager get(@NotNull ServerLevel level) { - return level.getDataStorage().computeIfAbsent(ChunkManager::load, ChunkManager::new, DATA_NAME); + return level.getDataStorage().computeIfAbsent(new SavedData.Factory<>(ChunkManager::new, ChunkManager::load, null), DATA_NAME); } public static ChunkManager load(@NotNull CompoundTag data) { ChunkManager manager = new ChunkManager(); CompoundTag forcedData = data.getCompound(FORCED_CHUNKS_TAG); + AdvancedPeripherals.debug("Loading chunk manager from NBT " + data, Level.WARN); for (String key : forcedData.getAllKeys()) { manager.forcedChunks.put(UUID.fromString(key), LoadChunkRecord.deserialize(forcedData.getCompound(key))); } return manager; } - @SubscribeEvent - public static void beforeServerStopped(ServerStoppingEvent event) { - ChunkManager.get(event.getServer().overworld()).stop(); + // Registered using the mod bus in the main class + public static void registerTicketController(RegisterTicketControllersEvent event) { + event.register(controller); } @SubscribeEvent @@ -60,54 +68,62 @@ public static void afterServerStarted(ServerStartedEvent event) { public static void serverTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.END) { tickCounter++; - if (tickCounter % (APConfig.PERIPHERALS_CONFIG.chunkLoadValidTime.get() / 2) == 0) { + // run cleanup per chunkLoadValidTime / 10 + final int checkIntervalInTick = APConfig.PERIPHERALS_CONFIG.chunkLoadValidTime.get() * 20 / 10; + if (tickCounter % checkIntervalInTick == 0) { ChunkManager.get(ServerLifecycleHooks.getCurrentServer().overworld()).cleanup(); } } } + private static boolean forceChunk(UUID owner, ServerLevel level, ChunkPos pos) { + AdvancedPeripherals.debug("Forcing chunk " + pos, Level.WARN); + return controller.forceChunk(level, owner, pos.x, pos.z, true, true); + } + + private static boolean unforceChunk(UUID owner, ServerLevel level, ChunkPos pos) { + AdvancedPeripherals.debug("Unforcing chunk " + pos, Level.WARN); + return controller.forceChunk(level, owner, pos.x, pos.z, false, true); + } + public synchronized boolean addForceChunk(ServerLevel level, UUID owner, ChunkPos pos) { - AdvancedPeripherals.debug("Trying to load forced chunk cluster" + pos, Level.WARN); - if (forcedChunks.containsKey(owner)) return true; - forcedChunks.put(owner, new LoadChunkRecord(level.dimension().location().toString(), pos)); - setDirty(); - int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); - if (chunkRadius == 0) { - return ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, owner, pos.x, pos.z, true, true); + AdvancedPeripherals.debug("Trying to load forced chunk cluster " + pos, Level.WARN); + LoadChunkRecord oldRecord = forcedChunks.get(owner); + if (oldRecord != null) { + ServerLevel oldLevel = getServerLevel(oldRecord.getDimensionName()); + if (oldLevel == level && pos.equals(oldRecord.getPos())) { + return true; + } + unforceChunkRecord(owner, oldRecord, oldLevel); } + final int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); + forcedChunks.put(owner, new LoadChunkRecord(level.dimension().location().toString(), pos, chunkRadius)); + setDirty(); boolean result = true; - for (int x = chunkRadius * -1; x < chunkRadius; x++) { - for (int z = chunkRadius * -1; z < chunkRadius; z++) { - result &= ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, owner, pos.x + x, pos.z + z, true, true); + for (int x = -chunkRadius; x <= chunkRadius; x++) { + for (int z = -chunkRadius; z <= chunkRadius; z++) { + result &= forceChunk(owner, level, new ChunkPos(pos.x + x, pos.z + z)); } } return result; } public synchronized void touch(UUID owner) { - if (forcedChunks.containsKey(owner)) - forcedChunks.get(owner).touch(); + LoadChunkRecord forcedChunk = forcedChunks.get(owner); + if (forcedChunk != null) { + forcedChunk.touch(); + } } - public synchronized boolean removeForceChunk(ServerLevel level, UUID owner, ChunkPos pos) { - AdvancedPeripherals.debug("Trying to unload forced chunk cluster" + pos, Level.WARN); - if (!forcedChunks.containsKey(owner)) - return true; + public synchronized boolean removeForceChunk(ServerLevel level, UUID owner) { + AdvancedPeripherals.debug("Attempting to unload forced chunk cluster " + owner, Level.WARN); LoadChunkRecord chunkRecord = forcedChunks.get(owner); + if (chunkRecord == null) + return true; String dimensionName = level.dimension().location().toString(); if (!chunkRecord.getDimensionName().equals(dimensionName)) throw new IllegalArgumentException(String.format("Incorrect dimension! Should be %s instead of %s", chunkRecord.getDimensionName(), dimensionName)); - boolean result = true; - int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); - if (chunkRadius == 0) { - result = ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, owner, pos.x, pos.z, false, true); - } else { - for (int x = chunkRadius * -1; x < chunkRadius; x++) { - for (int z = chunkRadius * -1; z < chunkRadius; z++) { - result &= ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, owner, pos.x + x, pos.z + z, true, true); - } - } - } + boolean result = unforceChunkRecord(owner, chunkRecord, level); if (result) { forcedChunks.remove(owner); setDirty(); @@ -115,85 +131,142 @@ public synchronized boolean removeForceChunk(ServerLevel level, UUID owner, Chun return result; } - public synchronized void init() { - if (!initialized) { - AdvancedPeripherals.debug("Schedule chunk manager init", Level.WARN); - int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); - ServerLifecycleHooks.getCurrentServer().getAllLevels().forEach(level -> { - String dimensionName = level.dimension().location().toString(); - forcedChunks.entrySet().stream().filter(entry -> entry.getValue().getDimensionName().equals(dimensionName)).forEach(entry -> { - if (chunkRadius == 0) { - ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, entry.getKey(), entry.getValue().getPos().x, entry.getValue().getPos().z, true, true); - } - for (int x = chunkRadius * -1; x < chunkRadius; x++) { - for (int z = chunkRadius * -1; z < chunkRadius; z++) { - ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, entry.getKey(), entry.getValue().getPos().x + x, entry.getValue().getPos().z + z, true, true); - } - } - }); - }); - initialized = true; + private synchronized boolean unforceChunkRecord(UUID owner, LoadChunkRecord chunkRecord, ServerLevel level) { + boolean result = true; + final ChunkPos pos = chunkRecord.getPos(); + final int chunkRadius = chunkRecord.getRadius(); + AdvancedPeripherals.debug(String.format("Trying to unload forced chunk cluster %s at %s with radius %d", owner, pos, chunkRadius), Level.WARN); + for (int x = -chunkRadius; x <= chunkRadius; x++) { + for (int z = -chunkRadius; z <= chunkRadius; z++) { + result &= unforceChunk(owner, level, new ChunkPos(pos.x + x, pos.z + z)); + } } + return result; } - public synchronized void stop() { + public synchronized void init() { if (initialized) { - AdvancedPeripherals.debug("Schedule chunk manager stop", Level.WARN); - int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); - ServerLifecycleHooks.getCurrentServer().getAllLevels().forEach(level -> { - String dimensionName = level.dimension().location().toString(); - forcedChunks.entrySet().stream().filter(entry -> entry.getValue().getDimensionName().equals(dimensionName)).forEach(entry -> { - if (chunkRadius == 0) { - ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, entry.getKey(), entry.getValue().getPos().x, entry.getValue().getPos().z, false, true); + return; + } + initialized = true; + + AdvancedPeripherals.debug(String.format("Schedule chunk manager init, forcedChunks = %d", forcedChunks.size()), Level.WARN); + final int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); + final Map levels = getServerLevels(); + forcedChunks.forEach((uuid, value) -> { + String dimensionName = value.getDimensionName(); + ServerLevel level = levels.get(dimensionName); + if (level == null) { + AdvancedPeripherals.debug("Skipped not exists dimension " + dimensionName, Level.ERROR); + return; + } + final ChunkPos pos = value.getPos(); + final int loadedRadius = value.getRadius(); + AdvancedPeripherals.debug(String.format("Recorded chunk in %s at %s with radius %d", dimensionName, pos, loadedRadius), Level.INFO); + if (loadedRadius == chunkRadius) { + return; + } + if (loadedRadius == -1) { + // if it's coming from old version, just force all + for (int x = -chunkRadius; x <= chunkRadius; x++) { + for (int z = -chunkRadius; z <= chunkRadius; z++) { + forceChunk(uuid, level, new ChunkPos(pos.x + x, pos.z + z)); } - for (int x = chunkRadius * -1; x < chunkRadius; x++) { - for (int z = chunkRadius * -1; z < chunkRadius; z++) { - ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, entry.getKey(), entry.getValue().getPos().x + x, entry.getValue().getPos().z + z, false, true); + } + } else if (loadedRadius > chunkRadius) { + // clean overflowed load radius + for (int x = -loadedRadius; x <= loadedRadius; x++) { + for (int z = -loadedRadius; z <= loadedRadius; z++) { + if (Math.abs(x) > chunkRadius || Math.abs(z) > chunkRadius) { + unforceChunk(uuid, level, new ChunkPos(pos.x + x, pos.z + z)); } } - }); - }); - initialized = false; - } + } + } else if (loadedRadius < chunkRadius) { + // otherwise, only do the changed part to reduce startup time (in case we have a lot chunky turtle) + for (int x = -chunkRadius; x <= chunkRadius; x++) { + for (int z = -chunkRadius; z <= chunkRadius; z++) { + if (Math.abs(x) > loadedRadius || Math.abs(z) > loadedRadius) { + forceChunk(uuid, level, new ChunkPos(pos.x + x, pos.z + z)); + } + } + } + } + value.setRadius(chunkRadius); + setDirty(); + }); } public synchronized void cleanup() { AdvancedPeripherals.debug("Schedule chunk manager cleanup", Level.WARN); - ServerLifecycleHooks.getCurrentServer().getAllLevels().forEach(level -> { - String dimensionName = level.dimension().location().toString(); - List purgeList = new ArrayList<>(); - forcedChunks.entrySet().stream().filter(entry -> entry.getValue().getDimensionName().equals(dimensionName) && !entry.getValue().isValid()).forEach(entry -> purgeList.add(entry.getKey())); - purgeList.forEach(uuid -> { - AdvancedPeripherals.debug(String.format("Purge forced chunk for %s", uuid), Level.WARN); - removeForceChunk(level, uuid, forcedChunks.get(uuid).getPos()); - }); - }); + final Map levels = getServerLevels(); + final Iterator> iterator = forcedChunks.entrySet().iterator(); + while (iterator.hasNext()) { + final Map.Entry entry = iterator.next(); + UUID uuid = entry.getKey(); + LoadChunkRecord chunkRecord = entry.getValue(); + String dimensionName = chunkRecord.getDimensionName(); + ServerLevel level = levels.get(dimensionName); + if (level == null) { + continue; + } + if (chunkRecord.isValid()) { + continue; + } + AdvancedPeripherals.debug(String.format("Purge forced chunk for %s", uuid), Level.WARN); + unforceChunkRecord(uuid, chunkRecord, level); + iterator.remove(); + setDirty(); + } } @Override - public @NotNull CompoundTag save(@NotNull CompoundTag data) { + public synchronized @NotNull CompoundTag save(@NotNull CompoundTag data) { + AdvancedPeripherals.debug("Schedule chunk manager save, forcedChunks = " + forcedChunks.size(), Level.WARN); CompoundTag forcedChunksTag = new CompoundTag(); forcedChunks.forEach((key, value) -> forcedChunksTag.put(key.toString(), value.serialize())); + // !!! DO NOT forget to put forcedChunksTag into data !!! + // It will not magically be saved 😅 + data.put(FORCED_CHUNKS_TAG, forcedChunksTag); return data; } + private static Map getServerLevels() { + Map levels = new HashMap<>(); + ServerLifecycleHooks.getCurrentServer().getAllLevels().forEach(level -> { + String dimensionName = level.dimension().location().toString(); + levels.put(dimensionName, level); + }); + return levels; + } + + private static ServerLevel getServerLevel(String name) { + ResourceKey key = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(name)); + return ServerLifecycleHooks.getCurrentServer().getLevel(key); + } + private static class LoadChunkRecord { private static final String POS_TAG = "pos"; private static final String DIMENSION_NAME_TAG = "dimensionName"; + private static final String RADIUS_TAG = "radius"; private final @NotNull String dimensionName; private final @NotNull ChunkPos pos; + private int radius; private long lastTouch; - LoadChunkRecord(@NotNull String dimensionName, @NotNull ChunkPos pos) { + LoadChunkRecord(@NotNull String dimensionName, @NotNull ChunkPos pos, int radius) { this.dimensionName = dimensionName; this.pos = pos; - this.lastTouch = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); + this.radius = radius; + this.lastTouch = tickCounter; } public static LoadChunkRecord deserialize(@NotNull CompoundTag tag) { - return new LoadChunkRecord(tag.getString(DIMENSION_NAME_TAG), NBTUtil.chunkPosFromNBT(tag.getCompound(POS_TAG))); + Set keys = tag.getAllKeys(); + int radius = keys.contains(RADIUS_TAG) ? tag.getInt(RADIUS_TAG) : -1; + return new LoadChunkRecord(tag.getString(DIMENSION_NAME_TAG), NBTUtil.chunkPosFromNBT(tag.getCompound(POS_TAG)), radius); } public @NotNull ChunkPos getPos() { @@ -204,19 +277,27 @@ public static LoadChunkRecord deserialize(@NotNull CompoundTag tag) { return dimensionName; } + public int getRadius() { + return radius; + } + + public void setRadius(int radius) { + this.radius = radius; + } + public void touch() { - lastTouch = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); + lastTouch = tickCounter; } public boolean isValid() { - long currentEpoch = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); - return lastTouch + APConfig.PERIPHERALS_CONFIG.chunkLoadValidTime.get() >= currentEpoch; + return lastTouch + APConfig.PERIPHERALS_CONFIG.chunkLoadValidTime.get() * 20 >= tickCounter; } public @NotNull CompoundTag serialize() { CompoundTag tag = new CompoundTag(); tag.putString(DIMENSION_NAME_TAG, dimensionName); tag.put(POS_TAG, NBTUtil.toNBT(pos)); + tag.putInt(RADIUS_TAG, radius); return tag; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java index 1f579693c..d953cbbfd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java @@ -16,13 +16,35 @@ public class CoordUtil { + /** + * isInRange checks if the player is in the range + * + * @param pos the position to start check + * @param world the world to start check + * @param player the player going to be check + * @param range the range that user want to reach, must be -1, 0, or a positive number + * @param maxRange the maximum range the user can reach, must be -1, 0, or a positive number + * + * @return If the player is in the {@code range} as well as in the {@code maxRange}, or {@code range} and {@code maxRange} are -1 + */ public static boolean isInRange(@Nullable BlockPos pos, @Nullable Level world, @Nullable Player player, int range, int maxRange) { // There are rare cases where these are null. For example if a player detector pocket computer runs while not in a player inventory // Fixes https://github.com/SirEndii/AdvancedPeripherals/issues/356 - if (pos == null || world == null || player == null) + if (pos == null || world == null || player == null) { return false; + } - range = maxRange == -1 ? range : Math.min(Math.abs(range), maxRange); + if (range == 0 || maxRange == 0) { + return false; + } + if (range < 0) { + if (maxRange < 0) { + return true; + } + range = maxRange; + } else if (maxRange > 0 && range > maxRange) { + range = maxRange; + } return isPlayerInBlockRange(pos, world, player, (double) range); } @@ -79,7 +101,7 @@ public static boolean isInRange(@Nullable BlockPos blockPos, @Nullable Player pl // Use manhattan distance, not euclidean distance to keep same behavior than other `isInRange` functions if (i + j > (maxRange != -1 ? maxRange : Integer.MAX_VALUE)) return false; - return world.getNearbyPlayers(TargetingConditions.forNonCombat(), null, new AABB(firstPos, secondPos)).contains(player); + return world.getNearbyPlayers(TargetingConditions.forNonCombat(), null, new AABB(firstPos.getX(), firstPos.getY(), firstPos.getZ(), secondPos.getX(), secondPos.getY(), secondPos.getZ())).contains(player); } public static Direction getDirection(FrontAndTop orientation, String computerSide) throws LuaException { @@ -100,26 +122,24 @@ public static Direction getDirection(FrontAndTop orientation, String computerSid } if (front.getAxis() == Direction.Axis.Y) { - switch (side) { - case FRONT: return front; - case BACK: return front.getOpposite(); - case TOP: return top; - case BOTTOM: return top.getOpposite(); - case RIGHT: return top.getClockWise(); - case LEFT: return top.getCounterClockWise(); - } + return switch (side) { + case FRONT -> front; + case BACK -> front.getOpposite(); + case TOP -> top; + case BOTTOM -> top.getOpposite(); + case RIGHT -> top.getClockWise(); + case LEFT -> top.getCounterClockWise(); + }; } else { - switch (side) { - case FRONT: return front; - case BACK: return front.getOpposite(); - case TOP: return Direction.UP; - case BOTTOM: return Direction.DOWN; - case RIGHT: return front.getCounterClockWise(); - case LEFT: return front.getClockWise(); - } + return switch (side) { + case FRONT -> front; + case BACK -> front.getOpposite(); + case TOP -> Direction.UP; + case BOTTOM -> Direction.DOWN; + case RIGHT -> front.getCounterClockWise(); + case LEFT -> front.getClockWise(); + }; } - - throw new LuaException(computerSide + " is not a expected side"); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java index 81d7f4a00..9b8995d12 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java @@ -1,15 +1,13 @@ package de.srendi.advancedperipherals.common.util; import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; -import net.minecraftforge.energy.IEnergyStorage; - -import java.util.Optional; +import net.neoforged.neoforge.energy.IEnergyStorage; public class EnergyStorageProxy implements IEnergyStorage { private final EnergyDetectorEntity energyDetectorTE; private int maxTransferRate; - private int transferedInThisTick = 0; + private int transferredInThisTick = 0; public EnergyStorageProxy(EnergyDetectorEntity energyDetectorTE, int maxTransferRate) { this.energyDetectorTE = energyDetectorTE; @@ -23,26 +21,30 @@ public boolean canReceive() { @Override public int receiveEnergy(int maxReceive, boolean simulate) { - Optional out = energyDetectorTE.getOutputStorage(); - return out.map(outStorage -> { - int transferred = outStorage.receiveEnergy(Math.min(maxReceive, maxTransferRate), simulate); - if (!simulate) { - transferedInThisTick += transferred; - } - return transferred; - }).orElse(0); + IEnergyStorage out = energyDetectorTE.getOutputStorage(); + if (out == null) + return 0; + int transferred = out.receiveEnergy(Math.min(maxReceive, maxTransferRate), simulate); + if (!simulate) { + transferredInThisTick += transferred; + } + return transferred; } @Override public int getEnergyStored() { - Optional out = energyDetectorTE.getOutputStorage(); - return out.map(IEnergyStorage::getEnergyStored).orElse(0); + IEnergyStorage out = energyDetectorTE.getOutputStorage(); + if (out == null) + return 0; + return out.getEnergyStored(); } @Override public int getMaxEnergyStored() { - Optional out = energyDetectorTE.getOutputStorage(); - return out.map(IEnergyStorage::getMaxEnergyStored).orElse(0); + IEnergyStorage out = energyDetectorTE.getOutputStorage(); + if (out == null) + return 0; + return out.getMaxEnergyStored(); } @Override @@ -67,10 +69,10 @@ public void setMaxTransferRate(int rate) { * should be called on every tick */ public void resetTransferedInThisTick() { - transferedInThisTick = 0; + transferredInThisTick = 0; } - public int getTransferedInThisTick() { - return transferedInThisTick; + public int getTransferredInThisTick() { + return transferredInThisTick; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/KeybindUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/KeybindUtil.java index c0c9f68cd..aa84e87b5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/KeybindUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/KeybindUtil.java @@ -3,7 +3,7 @@ import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; -import net.minecraftforge.client.settings.KeyModifier; +import net.neoforged.neoforge.client.settings.KeyModifier; import org.lwjgl.glfw.GLFW; public class KeybindUtil { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index ba2c2c85c..4bad04579 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.properties.Property; -import net.minecraftforge.common.IForgeShearable; +import net.neoforged.neoforge.common.IShearable; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -47,11 +47,11 @@ public static Map livingEntityToLua(LivingEntity entity) { } public static Map animalToLua(Animal animal, ItemStack itemInHand) { - Map data = entityToLua(animal); + Map data = livingEntityToLua(animal); data.put("baby", animal.isBaby()); data.put("inLove", animal.isInLove()); data.put("aggressive", animal.isAggressive()); - if (animal instanceof IForgeShearable shareable && !itemInHand.isEmpty()) { + if (animal instanceof IShearable shareable && !itemInHand.isEmpty()) { data.put("shareable", shareable.isShearable(itemInHand, animal.level(), animal.blockPosition())); } return data; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java index b8bef9e45..f64085e7c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java @@ -4,7 +4,13 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.configuration.APConfig; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.*; +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.nbt.TagParser; import net.minecraft.world.level.ChunkPos; import org.apache.logging.log4j.Level; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/Platform.java b/src/main/java/de/srendi/advancedperipherals/common/util/Platform.java index 9acab5e70..b564f15fa 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/Platform.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/Platform.java @@ -2,7 +2,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.configuration.APConfig; -import net.minecraftforge.fml.ModList; +import net.neoforged.fml.ModList; import java.util.Optional; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/RawValue.java b/src/main/java/de/srendi/advancedperipherals/common/util/RawValue.java index 6195df726..647e2ef51 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/RawValue.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/RawValue.java @@ -1,10 +1,11 @@ package de.srendi.advancedperipherals.common.util; import com.google.gson.JsonObject; +import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -25,7 +26,7 @@ public RawValue(ResourceLocation pItem) { @NotNull public Collection getItems() { - return Collections.singleton(new ItemStack(ForgeRegistries.ITEMS.getValue(this.item))); + return Collections.singleton(new ItemStack(ItemUtil.getRegistryEntry(this.item.toString(), BuiltInRegistries.ITEM))); } @NotNull diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java b/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java index 558fee12c..a39487b29 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java @@ -1,27 +1,32 @@ package de.srendi.advancedperipherals.common.util; import de.srendi.advancedperipherals.AdvancedPeripherals; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.TickEvent; -import java.util.ArrayDeque; import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public class ServerWorker { - private static final Queue callQueue = new ArrayDeque<>(); + private static final Queue callQueue = new ConcurrentLinkedQueue<>(); public static void add(final Runnable call) { - callQueue.add(call); + if (call != null) { + callQueue.add(call); + } } @SubscribeEvent public static void serverTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.END) { - while (!callQueue.isEmpty()) { + while (true) { final Runnable runnable = callQueue.poll(); + if (runnable == null) { + return; + } AdvancedPeripherals.debug("Running queued server worker call: " + runnable); runnable.run(); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java index bc586425d..f166eda25 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java @@ -12,4 +12,23 @@ public static String toHexString(byte[] bytes) { } return new String(hexChars); } + + /** + * This method will convert "&[0-9a-z]" to "§[0-9a-z]", then we can make colored message in CC easier + * If a '&' is behind reverse slash '\', it will be ignored. + * Note: In CC, you need to use "\\&" to get an unescaped '&' character + * If the character after '&' is not a digital number or lowercase letter, the & operator will not be escaped as well. + * + * Some convert example: + * "&a" -> "§a" + * "&" -> "&" + * "\\&" -> "&" + * "\\&a" -> "&a" + * "&A" -> "&A" + * "& a" -> "& a" + * "&&a" -> "&§a" + */ + public static String convertAndToSectionMark(String str) { + return str == null ? null : str.replaceAll("(?(owner); @@ -93,6 +97,11 @@ public boolean isSilent() { return true; } + @Override + public void setLevel(@NotNull Level level) { + super.setLevel(level); + } + @Override public void playSound(@NotNull SoundEvent soundIn, float volume, float pitch) { } @@ -113,58 +122,88 @@ public float getEyeHeight(@NotNull Pose pose) { return 0; } - public Pair digBlock(Direction direction) { + public static Function wrapActionWithRot(float yaw, float pitch, Function action) { + return player -> player.doActionWithRot(yaw, pitch, action); + } + + public T doActionWithRot(float yaw, float pitch, Function action) { + final float oldRot = this.getYRot(); + this.setRot(oldRot + yaw, pitch); + try { + return action.apply(this); + } finally { + this.setRot(oldRot, 0); + } + } + + public static Function wrapActionWithShiftKey(boolean shift, Function action) { + return player -> player.doActionWithShiftKey(shift, action); + } + + public T doActionWithShiftKey(boolean shift, Function action) { + boolean old = this.isShiftKeyDown(); + this.setShiftKeyDown(shift); + try { + return action.apply(this); + } finally { + this.setShiftKeyDown(old); + } + } + + + public Pair digBlock() { Level world = level(); HitResult hit = findHit(true, false); - if (hit.getType() == HitResult.Type.MISS) + if (hit.getType() == HitResult.Type.MISS) { return Pair.of(false, "Nothing to break"); - BlockPos pos = new BlockPos((int) hit.getLocation().x, (int) hit.getLocation().y, (int) hit.getLocation().z); + } + BlockPos pos = ((BlockHitResult) hit).getBlockPos(); BlockState state = world.getBlockState(pos); Block block = state.getBlock(); ItemStack tool = getInventory().getSelected(); - - if (tool.isEmpty()) + if (tool.isEmpty()) { return Pair.of(false, "Cannot dig without tool"); + } - - if (block != digBlock || !pos.equals(digPosition)) + if (block != digBlock || !pos.equals(digPosition)) { setState(block, pos); + } - if (!world.isEmptyBlock(pos)) { - if (block == Blocks.BEDROCK || state.getDestroySpeed(world, pos) <= -1) - return Pair.of(false, "Unbreakable block detected"); + Vec3 look = getLookAngle(); + Direction direction = Direction.getNearest(look.x, look.y, look.z).getOpposite(); - if (!(tool.getItem() instanceof DiggerItem) && !(tool.getItem() instanceof ShearsItem)) - return Pair.of(false, "Item should be digger tool"); + if (world.isEmptyBlock(pos) || state.getBlock() instanceof LiquidBlock) { + return Pair.of(false, "Nothing to dig here"); + } - if (tool.getItem() instanceof DiggerItem toolItem && !toolItem.isCorrectToolForDrops(tool, state)) - return Pair.of(false, "Tool cannot mine this block"); + if (block == Blocks.BEDROCK || state.getDestroySpeed(world, pos) <= -1) { + return Pair.of(false, "Unbreakable block detected"); + } - if (tool.getItem() instanceof ShearsItem shearsItem && shearsItem.isCorrectToolForDrops(state)) - return Pair.of(false, "Shear cannot mine this block"); + if (!tool.isCorrectToolForDrops(state)) { + return Pair.of(false, "Tool cannot mine this block"); + } - ServerPlayerGameMode manager = gameMode; - float breakSpeed = 0.5f * tool.getDestroySpeed(state) / state.getDestroySpeed(level(), pos) - 0.1f; - for (int i = 0; i < 10; i++) { - currentDamage += breakSpeed; + ServerPlayerGameMode manager = gameMode; + float breakSpeed = 0.5f * tool.getDestroySpeed(state) / state.getDestroySpeed(world, pos) - 0.1f; + for (int i = 0; i < 10; i++) { + currentDamage += breakSpeed; - world.destroyBlockProgress(getId(), pos, i); + world.destroyBlockProgress(getId(), pos, i); - if (currentDamage > 9) { - world.playSound(null, pos, state.getSoundType().getHitSound(), SoundSource.NEUTRAL, .25f, 1); - manager.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, direction.getOpposite(), 320, 1); - manager.destroyBlock(pos); - world.destroyBlockProgress(getId(), pos, -1); - setState(null, null); - break; - } + if (currentDamage > 9) { + world.playSound(null, pos, state.getSoundType().getHitSound(), SoundSource.NEUTRAL, .25f, 1); + manager.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, direction, 320, 1); + manager.destroyBlock(pos); + world.destroyBlockProgress(getId(), pos, -1); + setState(null, null); + break; } - - return Pair.of(true, "block"); } - return Pair.of(false, "Nothing to dig here"); + return Pair.of(true, "block"); + } public InteractionResult useOnBlock() { @@ -182,8 +221,9 @@ public InteractionResult useOnFilteredEntity(Predicate filter) { public InteractionResult useOnSpecificEntity(@NotNull Entity entity, HitResult result) { InteractionResult simpleInteraction = interactOn(entity, InteractionHand.MAIN_HAND); if (simpleInteraction == InteractionResult.SUCCESS) return simpleInteraction; - if (ForgeHooks.onInteractEntityAt(this, entity, result.getLocation(), InteractionHand.MAIN_HAND) != null) + if (CommonHooks.onInteractEntityAt(this, entity, result.getLocation(), InteractionHand.MAIN_HAND) == InteractionResult.FAIL) { return InteractionResult.FAIL; + } return entity.interactAt(this, result.getLocation(), InteractionHand.MAIN_HAND); } @@ -196,44 +236,49 @@ public InteractionResult use(boolean skipEntity, boolean skipBlock, @Nullable Pr HitResult hit = findHit(skipEntity, skipBlock, entityFilter); if (hit instanceof BlockHitResult blockHit) { - ItemStack stack = getMainHandItem(); BlockPos pos = blockHit.getBlockPos(); - PlayerInteractEvent.RightClickBlock event = ForgeHooks.onRightClickBlock(this, InteractionHand.MAIN_HAND, pos, blockHit); - if (event.isCanceled()) + PlayerInteractEvent.RightClickBlock event = CommonHooks.onRightClickBlock(this, InteractionHand.MAIN_HAND, pos, blockHit); + if (event.isCanceled()) { return event.getCancellationResult(); - - if (event.getUseItem() != Event.Result.DENY) { + } + boolean usedItem = event.getUseItem() != Event.Result.DENY; + boolean usedOnBlock = event.getUseBlock() != Event.Result.DENY; + if (usedItem) { InteractionResult result = stack.onItemUseFirst(new UseOnContext(level(), this, InteractionHand.MAIN_HAND, stack, blockHit)); - if (result != InteractionResult.PASS) + if (result != InteractionResult.PASS) { return result; - } - - boolean bypass = getMainHandItem().doesSneakBypassUse(level(), pos, this); - if (getPose() != Pose.CROUCHING || bypass || event.getUseBlock() == Event.Result.ALLOW) { - InteractionResult useType = gameMode.useItemOn(this, level(), stack, InteractionHand.MAIN_HAND, blockHit); - if (event.getUseBlock() != Event.Result.DENY && useType == InteractionResult.SUCCESS) - return InteractionResult.SUCCESS; + } + boolean bypass = getMainHandItem().doesSneakBypassUse(level(), pos, this); + if (isShiftKeyDown() || bypass || usedOnBlock) { + InteractionResult useType = gameMode.useItemOn(this, level(), stack, InteractionHand.MAIN_HAND, blockHit); + if (useType.consumesAction()) { + return useType; + } + } } - if (stack.isEmpty() || getCooldowns().isOnCooldown(stack.getItem())) + if (!stack.isEmpty() && getCooldowns().isOnCooldown(stack.getItem())) { return InteractionResult.PASS; - + } if (stack.getItem() instanceof BlockItem blockItem) { Block block = blockItem.getBlock(); - if (block instanceof CommandBlock || block instanceof StructureBlock) + if (block instanceof CommandBlock || block instanceof StructureBlock) { return InteractionResult.FAIL; + } } - if (event.getUseItem() == Event.Result.DENY) + if (!usedItem && !usedOnBlock) { return InteractionResult.PASS; + } ItemStack copyBeforeUse = stack.copy(); - InteractionResult result = stack.useOn(new UseOnContext(level(), this, InteractionHand.MAIN_HAND, copyBeforeUse, blockHit)); - if (stack.isEmpty()) - ForgeEventFactory.onPlayerDestroyItem(this, copyBeforeUse, InteractionHand.MAIN_HAND); + InteractionResult result = stack.useOn(new UseOnContext(level(), this, InteractionHand.MAIN_HAND, stack, blockHit)); + if (stack.isEmpty()) { + EventHooks.onPlayerDestroyItem(this, copyBeforeUse, InteractionHand.MAIN_HAND); + } return result; } else if (hit instanceof EntityHitResult entityHit) { return useOnSpecificEntity(entityHit.getEntity(), entityHit); @@ -247,7 +292,7 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock) { @NotNull public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predicate entityFilter) { - AttributeInstance reachAttribute = getAttribute(ForgeMod.BLOCK_REACH.get()); + AttributeInstance reachAttribute = getAttribute(NeoForgeMod.BLOCK_REACH.value()); if (reachAttribute == null) throw new IllegalArgumentException("How did this happened?"); @@ -263,9 +308,9 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predic blockHit = BlockHitResult.miss(traceContext.getTo(), traceDirection, new BlockPos((int) traceContext.getTo().x, (int) traceContext.getTo().y, (int) traceContext.getTo().z)); } else { blockHit = BlockGetter.traverseBlocks(traceContext.getFrom(), traceContext.getTo(), traceContext, (rayTraceContext, blockPos) -> { - if (level().isEmptyBlock(blockPos)) + if (level().isEmptyBlock(blockPos) || blockPos.equals(blockPosition())) { return null; - + } return new BlockHitResult(new Vec3(blockPos.getX(), blockPos.getY(), blockPos.getZ()), traceDirection, blockPos, false); }, rayTraceContext -> BlockHitResult.miss(rayTraceContext.getTo(), traceDirection, new BlockPos((int) rayTraceContext.getTo().x, (int) rayTraceContext.getTo().y, (int) rayTraceContext.getTo().z))); } @@ -273,46 +318,59 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predic if (skipEntity) return blockHit; - List entities = level().getEntities(this, getBoundingBox().expandTowards(look.x * range, look.y * range, look.z * range).inflate(1, 1, 1), collidablePredicate); + List entities = level().getEntities(this, getBoundingBox().expandTowards(look.x * range, look.y * range, look.z * range).inflate(1), collidablePredicate); LivingEntity closestEntity = null; Vec3 closestVec = null; - double closestDistance = range; + double closestDistance = blockHit.getType() == HitResult.Type.MISS ? range * range : distanceToSqr(blockHit.getLocation()); for (Entity entityHit : entities) { - if (!(entityHit instanceof LivingEntity) || entityFilter != null && !entityFilter.test(entityHit)) + if (!(entityHit instanceof LivingEntity entity)) { continue; - // Add litter bigger that just pick radius - AABB box = entityHit.getBoundingBox().inflate(entityHit.getPickRadius() + 0.5); - Optional clipResult = box.clip(origin, target); + } + // TODO: maybe let entityFilter returns the priority of the entity, instead of only returns the closest one. + if (entityFilter != null && !entityFilter.test(entity)) { + continue; + } + + // Removed a lot logic here to make Automata cores interact like a player. + // However, the results for some edge cases may change. Need more review and tests. + + // Hit vehicle before passenger + if (entity.isPassenger()) { + continue; + } + AABB box = entity.getBoundingBox(); + Vec3 clipVec; if (box.contains(origin)) { - if (closestDistance >= 0.0D) { - closestEntity = (LivingEntity) entityHit; - closestVec = clipResult.orElse(origin); - closestDistance = 0.0D; + clipVec = origin; + } else { + clipVec = box.clip(origin, target).orElse(null); + if (clipVec == null) { + continue; } - } else if (clipResult.isPresent()) { - Vec3 clipVec = clipResult.get(); - double distance = origin.distanceTo(clipVec); - - if (distance < closestDistance || closestDistance == 0.0D) { - if (entityHit == entityHit.getRootVehicle() && !entityHit.canRiderInteract()) { - if (closestDistance == 0.0D) { - closestEntity = (LivingEntity) entityHit; - closestVec = clipVec; - } - } else { - closestEntity = (LivingEntity) entityHit; - closestVec = clipVec; - closestDistance = distance; - } + } + double distance = origin.distanceToSqr(clipVec); + // Ignore small enough distance + if (distance <= 1e-6) { + distance = 0; + } + if (distance > closestDistance) { + continue; + } + if (distance == closestDistance && closestEntity != null) { + // Hit larger entity before smaller + if (closestEntity.getBoundingBox().getSize() >= box.getSize()) { + continue; } } + closestEntity = entity; + closestVec = clipVec; + closestDistance = distance; } - if (closestEntity != null && closestDistance <= range && (blockHit.getType() == HitResult.Type.MISS || distanceToSqr(blockHit.getLocation()) > closestDistance * closestDistance)) { + if (closestEntity != null) { return new EntityHitResult(closestEntity, closestVec); - } else { - return blockHit; } + return blockHit; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 4cab4747f..f174a62e5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -6,7 +6,6 @@ import dan200.computercraft.shared.util.WorldUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.InteractionHand; @@ -33,18 +32,10 @@ public static APFakePlayer getPlayer(ITurtleAccess turtle, GameProfile profile) public static void load(APFakePlayer player, ITurtleAccess turtle) { Direction direction = turtle.getDirection(); - player.setServerLevel((ServerLevel) turtle.getLevel()); - BlockPos position = turtle.getPosition(); + player.setLevel((ServerLevel) turtle.getLevel()); // Player position - float pitch = direction == Direction.UP ? -90 : direction == Direction.DOWN ? 90 : 0; - float yaw = direction == Direction.SOUTH ? 0 : direction == Direction.WEST ? 90 : direction == Direction.NORTH ? 180 : -90; - Vec3i sideVec = direction.getNormal(); - Direction.Axis a = direction.getAxis(); - Direction.AxisDirection ad = direction.getAxisDirection(); - double x = a == Direction.Axis.X && ad == Direction.AxisDirection.NEGATIVE ? -.5 : .5 + sideVec.getX() / 1.9D; - double y = 0.5 + sideVec.getY() / 1.9D; - double z = a == Direction.Axis.Z && ad == Direction.AxisDirection.NEGATIVE ? -.5 : .5 + sideVec.getZ() / 1.9D; - player.moveTo(position.getX() + x, position.getY() + y, position.getZ() + z, yaw, pitch); + BlockPos position = turtle.getPosition(); + player.moveTo(position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5, direction.toYRot(), 0); // Player inventory Inventory playerInventory = player.getInventory(); playerInventory.selected = 0; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java index ceaa4a5b2..6b38034d6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java @@ -5,6 +5,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.Pair; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -12,8 +13,7 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.fluids.FluidStack; import java.util.Map; @@ -38,7 +38,7 @@ public static Pair parse(Map item) { String name = TableHelper.getStringField(item, "name"); if (name.startsWith("#")) { fluidFilter.tag = TagKey.create(Registries.FLUID, new ResourceLocation(name.substring(1))); - } else if ((fluidFilter.fluid = ItemUtil.getRegistryEntry(name, ForgeRegistries.FLUIDS)) == null) { + } else if ((fluidFilter.fluid = ItemUtil.getRegistryEntry(name, BuiltInRegistries.FLUID)) == null) { return Pair.of(null, "FLUID_NOT_FOUND"); } } catch (LuaException luaException) { @@ -103,16 +103,15 @@ public boolean test(FluidStack stack) { return fingerprint.equals(testFingerprint); } - // If the filter does not have nbt values, a tag or a fingerprint, just test if the items are the same - if (fluid != Fluids.EMPTY) { - if (tag == null && nbt == null && fingerprint.isEmpty()) - return stack.getFluid().isSame(fluid); + if (fluid != Fluids.EMPTY && !stack.getFluid().isSame(fluid)) { + return false; } - if (tag != null && !stack.getFluid().is(tag)) + if (tag != null && !stack.getFluid().is(tag)) { return false; - if (nbt != null && !stack.getOrCreateTag().equals(nbt) && (fluid == Fluids.EMPTY || stack.getFluid().isSame(fluid))) + } + if (nbt != null && !stack.getOrCreateTag().equals(nbt)) { return false; - + } return true; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java index a3d8cdec6..e7476d15f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java @@ -8,16 +8,13 @@ import de.srendi.advancedperipherals.common.util.CoordUtil; import de.srendi.advancedperipherals.common.util.StringUtil; import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,11 +33,11 @@ public static IFluidHandler extractHandler(@Nullable Object object) { if (object instanceof IFluidHandler fluidHandler) return fluidHandler; - if (object instanceof ICapabilityProvider capabilityProvider) { + /*if (object instanceof ICapabilityProvider capabilityProvider) { LazyOptional cap = capabilityProvider.getCapability(ForgeCapabilities.FLUID_HANDLER); if (cap.isPresent()) return cap.orElseThrow(NullPointerException::new); - } + }*/ return null; } @@ -89,10 +86,10 @@ public static String getFingerprint(@NotNull FluidStack stack) { } public static ResourceLocation getRegistryKey(Fluid fluid) { - return ForgeRegistries.FLUIDS.getKey(fluid); + return BuiltInRegistries.FLUID.getKey(fluid); } public static ResourceLocation getRegistryKey(FluidStack fluid) { - return ForgeRegistries.FLUIDS.getKey(fluid.copy().getFluid()); + return BuiltInRegistries.FLUID.getKey(fluid.copy().getFluid()); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java index f86f1e487..183f3e9fd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java @@ -1,7 +1,8 @@ package de.srendi.advancedperipherals.common.util.inventory; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; + +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; import org.jetbrains.annotations.NotNull; public interface IStorageSystemFluidHandler extends IFluidHandler { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java index f5b161f6a..896e0c4ee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.common.util.inventory; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; public interface IStorageSystemItemHandler extends IItemHandler { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/InventoryUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/InventoryUtil.java index 599872d24..5c2776d60 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/InventoryUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/InventoryUtil.java @@ -10,14 +10,11 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.items.wrapper.InvWrapper; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,11 +26,6 @@ private InventoryUtil() { } public static IItemHandler extractHandler(@Nullable Object object) { - if (object instanceof ICapabilityProvider capabilityProvider) { - LazyOptional cap = capabilityProvider.getCapability(ForgeCapabilities.ITEM_HANDLER); - if (cap.isPresent()) - return cap.orElseThrow(NullPointerException::new); - } if (object instanceof IItemHandler itemHandler) return itemHandler; if (object instanceof Container container) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java index 580ab9764..6f44b63c1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java @@ -5,6 +5,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.Pair; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -13,7 +14,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraftforge.registries.ForgeRegistries; import java.util.Map; @@ -40,7 +40,7 @@ public static Pair parse(Map item) { String name = TableHelper.getStringField(item, "name"); if (name.startsWith("#")) { itemFilter.tag = TagKey.create(Registries.ITEM, new ResourceLocation(name.substring(1))); - } else if ((itemFilter.item = ItemUtil.getRegistryEntry(name, ForgeRegistries.ITEMS)) == null) { + } else if ((itemFilter.item = ItemUtil.getRegistryEntry(name, BuiltInRegistries.ITEM)) == null) { return Pair.of(null, "ITEM_NOT_FOUND"); } } catch (LuaException luaException) { @@ -118,16 +118,15 @@ public boolean test(ItemStack stack) { return fingerprint.equals(testFingerprint); } - // If the filter does not have nbt values, a tag or a fingerprint, just test if the items are the same - if (item != Items.AIR) { - if (tag == null && nbt == null && fingerprint.isEmpty()) - return stack.is(item); + if (item != Items.AIR && !stack.is(item)) { + return false; } - if (tag != null && !stack.is(tag)) + if (tag != null && !stack.is(tag)) { return false; - if (nbt != null && !stack.getOrCreateTag().equals(nbt) && (item == Items.AIR || stack.is(item))) + } + if (nbt != null && !stack.getOrCreateTag().equals(nbt)) { return false; - + } return true; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java index d9d39f9e1..06805ce18 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java @@ -5,12 +5,12 @@ import de.srendi.advancedperipherals.common.util.StringUtil; import net.minecraft.ResourceLocationException; import net.minecraft.core.NonNullList; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.IForgeRegistry; +import net.neoforged.neoforge.items.IItemHandler; import org.apache.logging.log4j.Level; import java.nio.charset.StandardCharsets; @@ -30,7 +30,7 @@ public class ItemUtil { private ItemUtil() { } - public static T getRegistryEntry(String name, IForgeRegistry forgeRegistry) { + public static T getRegistryEntry(String name, Registry forgeRegistry) { ResourceLocation location; try { location = new ResourceLocation(name); @@ -39,7 +39,7 @@ public static T getRegistryEntry(String name, IForgeRegistry forgeRegistr } T value; - if (location != null && forgeRegistry.containsKey(location) && (value = forgeRegistry.getValue(location)) != null) { + if (location != null && forgeRegistry.containsKey(location) && (value = forgeRegistry.get(location)) != null) { return value; } else { return null; @@ -99,10 +99,10 @@ public static void addComputerItemToTab(ResourceLocation turtleID, ResourceLocat } public static ResourceLocation getRegistryKey(Item item) { - return ForgeRegistries.ITEMS.getKey(item); + return BuiltInRegistries.ITEM.getKey(item); } public static ResourceLocation getRegistryKey(ItemStack item) { - return ForgeRegistries.ITEMS.getKey(item.copy().getItem()); + return BuiltInRegistries.ITEM.getKey(item.copy().getItem()); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java b/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java index a5f279496..33d7135d2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java +++ b/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java @@ -12,9 +12,9 @@ import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement; import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList; -import net.minecraftforge.event.server.ServerAboutToStartEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.server.ServerAboutToStartEvent; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java index 37509a075..527931701 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.trading.MerchantOffer; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.event.village.VillagerTradesEvent; -import net.minecraftforge.event.village.WandererTradesEvent; +import net.neoforged.neoforge.event.village.VillagerTradesEvent; +import net.neoforged.neoforge.event.village.WandererTradesEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java index c0d32fd76..7fff06d20 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java +++ b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java @@ -2,15 +2,16 @@ import dan200.computercraft.shared.ModRegistry; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.setup.Blocks; import de.srendi.advancedperipherals.common.setup.CCRegistration; import de.srendi.advancedperipherals.common.setup.Items; import de.srendi.advancedperipherals.common.setup.Villagers; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; -import net.minecraftforge.event.village.VillagerTradesEvent; -import net.minecraftforge.event.village.WandererTradesEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.village.VillagerTradesEvent; +import net.neoforged.neoforge.event.village.WandererTradesEvent; import static de.srendi.advancedperipherals.common.village.VillagerTrade.TradeBuilder; @@ -19,12 +20,14 @@ public class VillagerTrades { @SubscribeEvent public static void registerWanderingTrade(WandererTradesEvent event) { - TradeBuilder.createTrade(event, Blocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 1) - .setMaxUses(8) - .build(); - TradeBuilder.createTrade(event, ModRegistry.Blocks.TURTLE_ADVANCED.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 1) - .setMaxUses(8) - .build(); + if (APConfig.WORLD_CONFIG.enableWanderingTraderTrades.get()) { + TradeBuilder.createTrade(event, Blocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 1) + .setMaxUses(8) + .build(); + TradeBuilder.createTrade(event, ModRegistry.Blocks.TURTLE_ADVANCED.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 1) + .setMaxUses(8) + .build(); + } } @SubscribeEvent diff --git a/src/main/java/de/srendi/advancedperipherals/lib/LibConfig.java b/src/main/java/de/srendi/advancedperipherals/lib/LibConfig.java index 0ca3c3a25..3f4826436 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/LibConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/LibConfig.java @@ -1,6 +1,6 @@ package de.srendi.advancedperipherals.lib; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; /** * Configuration class for tweaks of library @@ -10,8 +10,8 @@ public class LibConfig { public static boolean initialCooldownEnabled = true; public static int initialCooldownSensitivity = 6_000; private static boolean testMode = false; - private static ForgeConfigSpec.BooleanValue isInitialCooldownEnabled; - private static ForgeConfigSpec.IntValue initialCooldownSensitiveLevel; + private static ModConfigSpec.BooleanValue isInitialCooldownEnabled; + private static ModConfigSpec.IntValue initialCooldownSensitiveLevel; public static void setTestMode(boolean mode) { testMode = mode; @@ -26,7 +26,7 @@ public static void setTestMode(boolean mode) { } } - public static void build(final ForgeConfigSpec.Builder builder) { + public static void build(final ModConfigSpec.Builder builder) { isInitialCooldownEnabled = builder.comment("Enables initial cooldown on peripheral initialization").define("isInitialCooldownEnabled", true); initialCooldownSensitiveLevel = builder.comment("Determinates initial cooldown sensitive level, values lower then this value will not trigger initial cooldown").defineInRange("initialCooldownSensitiveLevel", 6_000, 0, Integer.MAX_VALUE); } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/misc/IConfigHandler.java b/src/main/java/de/srendi/advancedperipherals/lib/misc/IConfigHandler.java index a7f86422e..095c25bc9 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/misc/IConfigHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/misc/IConfigHandler.java @@ -1,12 +1,12 @@ package de.srendi.advancedperipherals.lib.misc; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.Arrays; import java.util.stream.Collectors; public interface IConfigHandler { - void addToConfig(ForgeConfigSpec.Builder builder); + void addToConfig(ModConfigSpec.Builder builder); String name(); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java index 00618d94b..9f827a232 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java @@ -10,6 +10,7 @@ import de.srendi.advancedperipherals.common.util.DataStorageUtil; import de.srendi.advancedperipherals.lib.metaphysics.IAutomataCoreTier; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import java.util.ArrayList; import java.util.HashMap; @@ -80,4 +81,8 @@ public boolean hasAttribute(String attribute) { public void setAttribute(String attribute) { attributes.put(attribute, true); } + + public Direction validateSide(String direction) throws LuaException { + return super.validateSide(direction); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 09694d948..958202cc5 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -1,6 +1,10 @@ package de.srendi.advancedperipherals.lib.peripherals; -import dan200.computercraft.api.lua.*; +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IDynamicPeripheral; import dan200.computercraft.api.peripheral.IPeripheral; @@ -14,7 +18,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.Consumer; diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralPlugin.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralPlugin.java index 07b784e9c..ece9a3d77 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralPlugin.java @@ -2,7 +2,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.computer.core.ServerContext; -import net.minecraftforge.server.ServerLifecycleHooks; +import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.Nullable; import java.util.List; diff --git a/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java b/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java index 2c1488eb0..cfc08b134 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java @@ -5,6 +5,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleUpgradeType; +import de.srendi.advancedperipherals.common.configuration.UnsafeConfig; import de.srendi.advancedperipherals.common.util.TranslationUtil; import de.srendi.advancedperipherals.lib.peripherals.DisabledPeripheral; import de.srendi.advancedperipherals.lib.peripherals.IBasePeripheral; @@ -21,7 +22,6 @@ protected PeripheralTurtleUpgrade(ResourceLocation id, ItemStack item) { super(id, TurtleUpgradeType.PERIPHERAL, TranslationUtil.turtle(id.getPath()), item); } - //TODO: Do we still need this with the new modeller system? public abstract ModelResourceLocation getLeftModel(); public abstract ModelResourceLocation getRightModel(); @@ -37,4 +37,13 @@ public IPeripheral createPeripheral(@NotNull ITurtleAccess turtle, @NotNull Turt } return peripheral; } + + @Override + public boolean isItemSuitable(@NotNull ItemStack stack) { + if (UnsafeConfig.getIgnoreTurtlePeripheralItemNBT()) { + // always accept NBTed items + return true; + } + return super.isItemSuitable(stack); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/network/APNetworking.java b/src/main/java/de/srendi/advancedperipherals/network/APNetworking.java index f1064f26e..f9479d38c 100644 --- a/src/main/java/de/srendi/advancedperipherals/network/APNetworking.java +++ b/src/main/java/de/srendi/advancedperipherals/network/APNetworking.java @@ -1,75 +1,44 @@ package de.srendi.advancedperipherals.network; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.network.base.IPacket; import de.srendi.advancedperipherals.network.toclient.ToastToClientPacket; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; +import de.srendi.advancedperipherals.network.toclient.UsernameToCachePacket; +import de.srendi.advancedperipherals.network.toserver.RetrieveUsernamePacket; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.network.simple.SimpleChannel; - -import java.util.Optional; -import java.util.function.Function; - +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; +import net.neoforged.neoforge.network.registration.IPayloadRegistrar; + +@Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class APNetworking { private static final String PROTOCOL_VERSION = ModLoadingContext.get().getActiveContainer().getModInfo().getVersion().toString(); - private static final SimpleChannel NETWORK_CHANNEL = NetworkRegistry.newSimpleChannel(new ResourceLocation(AdvancedPeripherals.MOD_ID, "main_channel"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); - private static int id = 0; - - public static void init() { - registerServerToClient(ToastToClientPacket.class, ToastToClientPacket::decode); - } - public static void registerServerToClient(Class packet, Function decode) { - NETWORK_CHANNEL.registerMessage(id++, packet, IPacket::encode, decode, IPacket::handle, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); - } + public static void init(IPayloadRegistrar registrar) { + registrar.common(ToastToClientPacket.ID, ToastToClientPacket::decode, handler -> handler.client(IAPPacket::handlePacket)); + registrar.common(UsernameToCachePacket.ID, UsernameToCachePacket::decode, handler -> handler.client(IAPPacket::handlePacket)); - public static void registerClientToServer(Class packet, Function decode) { - NETWORK_CHANNEL.registerMessage(id++, packet, IPacket::encode, decode, IPacket::handle, Optional.of(NetworkDirection.PLAY_TO_SERVER)); + registrar.common(RetrieveUsernamePacket.ID, RetrieveUsernamePacket::decode, handler -> handler.server(IAPPacket::handlePacket)); } - /** - * Sends a packet to the server.

- * Must be called Client side. - */ - public static void sendToServer(Object msg) { - NETWORK_CHANNEL.sendToServer(msg); + @SubscribeEvent + public static void register(final RegisterPayloadHandlerEvent event) { + final IPayloadRegistrar registrar = event.registrar(AdvancedPeripherals.MOD_ID) + .versioned(PROTOCOL_VERSION); + init(registrar); } - /** - * Send a packet to a specific player.

- * Must be called Server side. - */ - public static void sendTo(Object msg, ServerPlayer player) { + public static void sendTo(ServerPlayer player, CustomPacketPayload message) { if (!(player instanceof FakePlayer)) { - NETWORK_CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), msg); + PacketDistributor.PLAYER.with(player).send(message); } } - public static void sendPacketToAll(Object packet) { - NETWORK_CHANNEL.send(PacketDistributor.ALL.noArg(), packet); - } - - public static ClientboundBlockEntityDataPacket createTEUpdatePacket(BlockEntity tile) { - return ClientboundBlockEntityDataPacket.create(tile); - } - - public static void sendToAllAround(Object mes, ResourceKey dim, BlockPos pos, int radius) { - NETWORK_CHANNEL.send(PacketDistributor.NEAR.with(() -> new PacketDistributor.TargetPoint(pos.getX(), pos.getY(), pos.getZ(), radius, dim)), mes); - } - - public static void sendToAllInWorld(Object mes, ServerLevel world) { - NETWORK_CHANNEL.send(PacketDistributor.DIMENSION.with(world::dimension), mes); + public static void sendToServer(CustomPacketPayload message) { + PacketDistributor.SERVER.noArg().send(message); } } diff --git a/src/main/java/de/srendi/advancedperipherals/network/IAPPacket.java b/src/main/java/de/srendi/advancedperipherals/network/IAPPacket.java new file mode 100644 index 000000000..6fc2a66be --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/network/IAPPacket.java @@ -0,0 +1,14 @@ +package de.srendi.advancedperipherals.network; + +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.jetbrains.annotations.NotNull; + +public interface IAPPacket extends CustomPacketPayload { + + static void handlePacket(@NotNull MSG payload, @NotNull IPayloadContext context) { + payload.handle(context); + } + + void handle(IPayloadContext context); +} diff --git a/src/main/java/de/srendi/advancedperipherals/network/base/IPacket.java b/src/main/java/de/srendi/advancedperipherals/network/base/IPacket.java deleted file mode 100644 index 9a52059bb..000000000 --- a/src/main/java/de/srendi/advancedperipherals/network/base/IPacket.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.srendi.advancedperipherals.network.base; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - -import java.util.function.Supplier; - -public interface IPacket { - - static void handle(MSG message, Supplier context) { - NetworkEvent.Context ctx = context.get(); - ctx.enqueueWork(() -> message.handle(ctx)); - ctx.setPacketHandled(true); - } - - void handle(NetworkEvent.Context context); - - void encode(FriendlyByteBuf buffer); - -} diff --git a/src/main/java/de/srendi/advancedperipherals/network/toclient/ToastToClientPacket.java b/src/main/java/de/srendi/advancedperipherals/network/toclient/ToastToClientPacket.java index e2a804eff..2fd684528 100644 --- a/src/main/java/de/srendi/advancedperipherals/network/toclient/ToastToClientPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/network/toclient/ToastToClientPacket.java @@ -2,13 +2,17 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.ToastUtil; -import de.srendi.advancedperipherals.network.base.IPacket; +import de.srendi.advancedperipherals.network.IAPPacket; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraftforge.fml.loading.FMLEnvironment; -import net.minecraftforge.network.NetworkEvent; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.jetbrains.annotations.NotNull; -public class ToastToClientPacket implements IPacket { +public class ToastToClientPacket implements IAPPacket { + + public static final ResourceLocation ID = AdvancedPeripherals.getRL("toasttoclient"); private final Component title; private final Component component; @@ -18,8 +22,12 @@ public ToastToClientPacket(Component title, Component component) { this.component = component; } + public static ToastToClientPacket decode(FriendlyByteBuf buffer) { + return new ToastToClientPacket(buffer.readComponent(), buffer.readComponent()); + } + @Override - public void handle(NetworkEvent.Context context) { + public void handle(@NotNull IPayloadContext context) { // Should in the theory not happen, but safe is safe. if (!FMLEnvironment.dist.isClient()) { AdvancedPeripherals.debug("Tried to display toasts on the server, aborting."); @@ -29,12 +37,15 @@ public void handle(NetworkEvent.Context context) { } @Override - public void encode(FriendlyByteBuf buffer) { + public void write(@NotNull FriendlyByteBuf buffer) { buffer.writeComponent(this.title); buffer.writeComponent(this.component); } - public static ToastToClientPacket decode(FriendlyByteBuf buffer) { - return new ToastToClientPacket(buffer.readComponent(), buffer.readComponent()); + @NotNull + @Override + public ResourceLocation id() { + return ID; } + } diff --git a/src/main/java/de/srendi/advancedperipherals/network/toclient/UsernameToCachePacket.java b/src/main/java/de/srendi/advancedperipherals/network/toclient/UsernameToCachePacket.java new file mode 100644 index 000000000..81aa27e23 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/network/toclient/UsernameToCachePacket.java @@ -0,0 +1,45 @@ +package de.srendi.advancedperipherals.network.toclient; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.ClientUUIDCache; +import de.srendi.advancedperipherals.network.IAPPacket; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class UsernameToCachePacket implements IAPPacket { + + public static final ResourceLocation ID = AdvancedPeripherals.getRL("usernametocache"); + + public UUID uuid; + public String username; + + public UsernameToCachePacket(UUID uuid, String username) { + this.uuid = uuid; + this.username = username; + } + + public static UsernameToCachePacket decode(FriendlyByteBuf buffer) { + return new UsernameToCachePacket(buffer.readUUID(), buffer.readUtf()); + } + + @Override + public void handle(IPayloadContext context) { + ClientUUIDCache.putUsername(uuid, username); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeUUID(uuid); + buffer.writeUtf(username); + } + + @NotNull + @Override + public ResourceLocation id() { + return ID; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/network/toserver/RetrieveUsernamePacket.java b/src/main/java/de/srendi/advancedperipherals/network/toserver/RetrieveUsernamePacket.java new file mode 100644 index 000000000..63200bc1e --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/network/toserver/RetrieveUsernamePacket.java @@ -0,0 +1,60 @@ +package de.srendi.advancedperipherals.network.toserver; + +import com.mojang.authlib.GameProfile; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.network.APNetworking; +import de.srendi.advancedperipherals.network.IAPPacket; +import de.srendi.advancedperipherals.network.toclient.UsernameToCachePacket; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import net.neoforged.neoforge.server.ServerLifecycleHooks; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; +import java.util.UUID; + +public class RetrieveUsernamePacket implements IAPPacket { + + public static final ResourceLocation ID = AdvancedPeripherals.getRL("retrieveusername"); + + public UUID uuid; + public UUID requester; + + public RetrieveUsernamePacket(UUID uuid, UUID requester) { + this.uuid = uuid; + this.requester = requester; + } + + public static RetrieveUsernamePacket decode(FriendlyByteBuf buffer) { + return new RetrieveUsernamePacket(buffer.readUUID(), buffer.readUUID()); + } + + @Override + public void handle(IPayloadContext context) { + Optional gameProfile = ServerLifecycleHooks.getCurrentServer().getProfileCache().get(uuid); + ServerPlayer player = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(requester); + + // The player left the server before the packet could be handled + if (player == null) + return; + + if (gameProfile.isEmpty()) + return; + + APNetworking.sendTo(player, new UsernameToCachePacket(gameProfile.get().getId(), gameProfile.get().getName())); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeUUID(uuid); + buffer.writeUUID(requester); + } + + @NotNull + @Override + public ResourceLocation id() { + return ID; + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index d493eb526..f1fbe1461 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,5 +1,5 @@ -public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58652_ -public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58653_ -public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210559_ # rawTemplates -public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210560_ # templates +public net.minecraft.world.level.block.entity.BeaconBlockEntity primaryPower # primaryPower +public net.minecraft.world.level.block.entity.BeaconBlockEntity secondaryPower # secondaryPower +public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool rawTemplates # rawTemplates +public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool templates # templates public net.minecraft.world.level.block.Blocks m_50805_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # never \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 98031b2ec..4221c8416 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[${loader_version},)" +loaderVersion = "[2,)" license = "All rights reserved" issueTrackerURL = "https://github.com/Seniorendi/AdvancedPeripherals/issues" logoFile = "pack.png" @@ -13,69 +13,73 @@ description = ''' Advanced Peripherals provides multiple extensions for ComputerCraft in form of Peripherals, Pocket Upgrades, Turtles or new gear. It also integrates with multiple third party mods. ''' + +[[accessTransformers]] +file="META-INF/accesstransformer.cfg" + [[dependencies.${mod_id}]] -modId = "forge" -mandatory = true +modId = "neoforge" +type = "required" versionRange = "[${neo_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "minecraft" -mandatory = true +type = "required" versionRange = "[${minecraft_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "computercraft" -mandatory = true +type = "required" versionRange = "[${cc_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "curios" -mandatory = false +type = "optional" versionRange = "[${curios_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "ae2" -mandatory = false +type = "optional" versionRange = "[${appliedenergistics_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "refinedstorage" -mandatory = false -versionRange = "[${refinedstorage_version},)" +type = "optional" +versionRange = "[1.13.0-beta4,)" ordnering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "minecolonies" -mandatory = false +type = "optional" versionRange = "[${minecolonies_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "patchouli" -mandatory = false +type = "optional" versionRange = "[${patchouli_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "create" -mandatory = false +type = "optional" versionRange = "[0.5.1,)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "botania" -mandatory = false +type = "optional" versionRange = "[${botania_version},)" ordering = "NONE" side = "BOTH" [[dependencies.${mod_id}]] modId = "mekanism" -mandatory = false +type = "optional" versionRange = "[${mekanism_version},)" ordering = "NONE" side = "BOTH" \ No newline at end of file