diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 001b5294058..7dd0837d9b0 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -9,7 +9,7 @@ jobs: crowdin-pull: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: crowdin/github-action@cb33a030bb1675169b76617d5805242aeea6eaec name: Pull Crowdin translations env: diff --git a/.github/workflows/crowdin-push.yml b/.github/workflows/crowdin-push.yml index 734c9f9094e..88b775627f8 100644 --- a/.github/workflows/crowdin-push.yml +++ b/.github/workflows/crowdin-push.yml @@ -10,7 +10,7 @@ jobs: crowdin-push: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: crowdin/github-action@cb33a030bb1675169b76617d5805242aeea6eaec name: Push sources to Crowdin env: diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 90e65251fa3..5cf3ad5ac71 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -18,7 +18,7 @@ jobs: mc_version: ${{ steps.determineExportVersion.outputs.mc_version }} build_date: ${{ steps.determineExportVersion.outputs.build_date }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Verify Repository if: github.repository != 'MCreator/MCreator' && github.repository != 'KlemenDEV/MCreator' run: | @@ -29,9 +29,9 @@ jobs: EOF exit 1 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - java-version: '17.0.9+9' + java-version: '17.0.10+7' distribution: 'temurin' - name: Install Dependencies run: | @@ -82,11 +82,11 @@ jobs: runs-on: macos-latest environment: production steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - java-version: '17.0.9+9' + java-version: '17.0.10+7' distribution: 'temurin' - name: Install Dependencies run: | diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index f879e297f63..3cc52c35c82 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -9,17 +9,17 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout Repository - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - java-version: '17.0.9+9' + java-version: '17.0.10+7' distribution: 'temurin' - name: Generate Javadoc run: ./gradlew javadoc - name: Deploy Javadoc - uses: Pylo/github-pages-deploy-action@v4.4.1 + uses: JamesIves/github-pages-deploy-action@65b5dfd4f5bcd3a7403bbc2959c144256167464e with: branch: javadoc clean: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 322b7e100a8..92f8f3ce9ed 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -11,7 +11,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: stale-issue-message: > This issue has been automatically marked as stale because it has not had diff --git a/.github/workflows/support.yml b/.github/workflows/support.yml index 8326f373b17..d9b66338a0d 100644 --- a/.github/workflows/support.yml +++ b/.github/workflows/support.yml @@ -11,7 +11,7 @@ jobs: action: runs-on: ubuntu-latest steps: - - uses: Pylo/support-requests@v3.0.0 + - uses: dessant/support-requests@47d5ea12f6c9e4a081637de9626b7319b415a3bf with: github-token: ${{ github.token }} support-label: 'invalid: support request' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f9b2bd3d9f..a2acdc30ab0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,14 +18,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - java-version: '17.0.9+9' + java-version: '17.0.10+7' distribution: 'temurin' - name: Cache Gradle Packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -40,7 +40,7 @@ jobs: - name: Test Javadoc Generation run: ./gradlew javadoc - name: Publish Test Report - uses: Pylo/action-junit-report@v3 + uses: mikepenz/action-junit-report@b1b7f659602565970688b2e2588738b9398e895d if: always() # always run even if the previous step fails with: include_passed: true diff --git a/platform/setup.gradle b/platform/setup.gradle index 720bbcbc6e8..322b6b4af03 100644 --- a/platform/setup.gradle +++ b/platform/setup.gradle @@ -1,9 +1,9 @@ import org.apache.tools.ant.taskdefs.condition.Os -def jdk17_win_64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.9+9.1/windows/x64/jdk/hotspot/normal/eclipse?project=jdk' -def jdk17_linux_64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.9+9/linux/x64/jdk/hotspot/normal/eclipse?project=jdk' -def jdk17_mac_x64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.9+9/mac/x64/jdk/hotspot/normal/eclipse?project=jdk' -def jdk17_mac_aarch64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.9+9/mac/aarch64/jdk/hotspot/normal/eclipse?project=jdk' +def jdk17_win_64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.10+7/windows/x64/jdk/hotspot/normal/eclipse?project=jdk' +def jdk17_linux_64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.10+7/linux/x64/jdk/hotspot/normal/eclipse?project=jdk' +def jdk17_mac_x64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.10+7/mac/x64/jdk/hotspot/normal/eclipse?project=jdk' +def jdk17_mac_aarch64 = 'https://api.adoptium.net/v3/binary/version/jdk-17.0.10+7/mac/aarch64/jdk/hotspot/normal/eclipse?project=jdk' // Binaries needed on Windows for export (install them using Gradle since Windows does not have a package manager) def nsis_url = 'https://netcologne.dl.sourceforge.net/project/nsis/NSIS%203/3.09/nsis-3.09.zip' @@ -24,8 +24,8 @@ tasks.register('downloadJDKWin64') { copy { from zipTree('build/tmp/jdk17_win_64') into file('jdk/jdk17_win_64/') } delete 'build/tmp/jdk17_win_64' - copy { from file('jdk/jdk17_win_64/jdk-17.0.9+9') into file('jdk/jdk17_win_64/') } - delete 'jdk/jdk17_win_64/jdk-17.0.9+9' + copy { from file('jdk/jdk17_win_64/jdk-17.0.10+7') into file('jdk/jdk17_win_64/') } + delete 'jdk/jdk17_win_64/jdk-17.0.10+7' } } } @@ -44,8 +44,8 @@ tasks.register('downloadJDKLinux64') { copy { from tarTree(resources.gzip('build/tmp/jdk17_linux_64')) into file('jdk/jdk17_linux_64/') } delete 'build/tmp/jdk17_linux_64' - copy { from file('jdk/jdk17_linux_64/jdk-17.0.9+9') into file('jdk/jdk17_linux_64/') } - delete 'jdk/jdk17_linux_64/jdk-17.0.9+9' + copy { from file('jdk/jdk17_linux_64/jdk-17.0.10+7') into file('jdk/jdk17_linux_64/') } + delete 'jdk/jdk17_linux_64/jdk-17.0.10+7' } } } @@ -64,8 +64,8 @@ tasks.register('downloadJDKMacX64') { copy { from tarTree(resources.gzip('build/tmp/jdk17_mac_x64')) into file('jdk/jdk17_mac_x64/') } delete 'build/tmp/jdk17_mac_x64' - copy { from file('jdk/jdk17_mac_x64/jdk-17.0.9+9') into file('jdk/jdk17_mac_x64/') } - delete 'jdk/jdk17_mac_x64/jdk-17.0.9+9/' + copy { from file('jdk/jdk17_mac_x64/jdk-17.0.10+7') into file('jdk/jdk17_mac_x64/') } + delete 'jdk/jdk17_mac_x64/jdk-17.0.10+7/' } } } @@ -84,8 +84,8 @@ tasks.register('downloadJDKMacAarch64') { copy { from tarTree(resources.gzip('build/tmp/jdk17_mac_aarch64/')) into file('jdk/jdk17_mac_aarch64/') } delete 'build/tmp/jdk17_mac_aarch64' - copy { from file('jdk/jdk17_mac_aarch64/jdk-17.0.9+9') into file('jdk/jdk17_mac_aarch64/') } - delete 'jdk/jdk17_mac_aarch64/jdk-17.0.9+9/' + copy { from file('jdk/jdk17_mac_aarch64/jdk-17.0.10+7') into file('jdk/jdk17_mac_aarch64/') } + delete 'jdk/jdk17_mac_aarch64/jdk-17.0.10+7/' } } } diff --git a/plugins/generator-1.19.4/datapack-1.19.4/biome.definition.yaml b/plugins/generator-1.19.4/datapack-1.19.4/biome.definition.yaml index c536cdd9e7c..85899704411 100644 --- a/plugins/generator-1.19.4/datapack-1.19.4/biome.definition.yaml +++ b/plugins/generator-1.19.4/datapack-1.19.4/biome.definition.yaml @@ -11,192 +11,69 @@ templates: condition: hasTrees() name: "@MODDATAROOT/worldgen/placed_feature/@registryname_tree.json" -global_templates: - - template: biome/biometag.json.ftl - writer: json - variables: "type=mineshaft" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=igloo" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('igloo'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/igloo.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=stronghold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('stronghold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/stronghold.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=mineshaft_mesa" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft_mesa'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft_mesa.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=pillager_outpost" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('pillager_outpost'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/pillager_outpost.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=woodland_mansion" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('woodland_mansion'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/woodland_mansion.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=jungle_temple" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('jungle_temple'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/jungle_temple.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=desert_pyramid" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('desert_pyramid'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/desert_pyramid.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=swamp_hut" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('swamp_hut'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/swamp_hut.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ocean_monument" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_monument'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_monument.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=shipwreck" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=shipwreck_beached" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck_beached'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck_beached.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=buried_treasure" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('buried_treasure'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/buried_treasure.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=nether_fortress" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fortress'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fortress.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=nether_fossil" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fossil'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fossil.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=bastion_remnant" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('bastion_remnant'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/bastion_remnant.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=end_city" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('end_city'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/end_city.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_desert.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_plains" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_plains'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_plains.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_savanna" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_savanna'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_savanna.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_snowy" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_snowy'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_snowy.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_taiga" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_taiga'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_taiga.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ocean_ruin_cold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_cold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_cold.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ocean_ruin_warm" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_warm'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_warm.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_standard" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_standard'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_standard.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_desert.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_jungle" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_jungle'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_jungle.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_swamp" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_swamp'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_swamp.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_mountain" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_mountain'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_mountain.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_ocean" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_ocean'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_ocean.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_nether" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_nether'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_nether.json" +tags: + - tag: BIOMES:minecraft:has_structure/mineshaft + condition: spawnMineshaft + - tag: BIOMES:minecraft:has_structure/igloo + condition: spawnIgloo + - tag: BIOMES:minecraft:has_structure/stronghold + condition: spawnStronghold + - tag: BIOMES:minecraft:has_structure/mineshaft_mesa + condition: spawnMineshaftMesa + - tag: BIOMES:minecraft:has_structure/pillager_outpost + condition: spawnPillagerOutpost + - tag: BIOMES:minecraft:has_structure/woodland_mansion + condition: spawnWoodlandMansion + - tag: BIOMES:minecraft:has_structure/jungle_temple + condition: spawnJungleTemple + - tag: BIOMES:minecraft:has_structure/desert_pyramid + condition: spawnDesertPyramid + - tag: BIOMES:minecraft:has_structure/swamp_hut + condition: spawnSwampHut + - tag: BIOMES:minecraft:has_structure/ocean_monument + condition: spawnOceanMonument + - tag: BIOMES:minecraft:has_structure/shipwreck + condition: spawnShipwreck + - tag: BIOMES:minecraft:has_structure/shipwreck_beached + condition: spawnShipwreckBeached + - tag: BIOMES:minecraft:has_structure/buried_treasure + condition: spawnBuriedTreasure + - tag: BIOMES:minecraft:has_structure/nether_fortress + condition: spawnNetherBridge + - tag: BIOMES:minecraft:has_structure/nether_fossil + condition: spawnNetherFossil + - tag: BIOMES:minecraft:has_structure/bastion_remnant + condition: spawnBastionRemnant + - tag: BIOMES:minecraft:has_structure/end_city + condition: spawnEndCity + - tag: BIOMES:minecraft:has_structure/village_desert + condition: "${data.villageType == 'desert'}" + - tag: BIOMES:minecraft:has_structure/village_plains + condition: "${data.villageType == 'plains'}" + - tag: BIOMES:minecraft:has_structure/village_savanna + condition: "${data.villageType == 'savanna'}" + - tag: BIOMES:minecraft:has_structure/village_snowy + condition: "${data.villageType == 'snowy'}" + - tag: BIOMES:minecraft:has_structure/village_taiga + condition: "${data.villageType == 'taiga'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_cold + condition: "${data.oceanRuinType == 'COLD'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_warm + condition: "${data.oceanRuinType == 'WARM'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_standard + condition: "${data.spawnRuinedPortal == 'STANDARD'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_desert + condition: "${data.spawnRuinedPortal == 'DESERT'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_jungle + condition: "${data.spawnRuinedPortal == 'JUNGLE'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_swamp + condition: "${data.spawnRuinedPortal == 'SWAMP'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_mountain + condition: "${data.spawnRuinedPortal == 'MOUNTAIN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_ocean + condition: "${data.spawnRuinedPortal == 'OCEAN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_nether + condition: "${data.spawnRuinedPortal == 'NETHER'}" field_exclusions: [name, coverageEstimate, treeVines, treeFruits, spawnBiome, spawnInCaves, spawnBiomeNether] diff --git a/plugins/generator-1.19.4/datapack-1.19.4/generator.yaml b/plugins/generator-1.19.4/datapack-1.19.4/generator.yaml index ec6fbc774d2..c1d8abb0a2d 100644 --- a/plugins/generator-1.19.4/datapack-1.19.4/generator.yaml +++ b/plugins/generator-1.19.4/datapack-1.19.4/generator.yaml @@ -19,4 +19,8 @@ structures_dir: "@MODDATAROOT/structures" base_templates: - template: pack.mcmeta.ftl writer: json - name: "@SRCROOT/pack.mcmeta" \ No newline at end of file + name: "@SRCROOT/pack.mcmeta" + +tags: + template: tags.json.ftl # loaded from datapack generator + name: "@RESROOT/data/@namespace/tags/@folder/@name.json" diff --git a/plugins/generator-1.19.4/forge-1.19.4/mappings/directions.yaml b/plugins/generator-1.19.4/datapack-1.19.4/mappings/directions.yaml similarity index 100% rename from plugins/generator-1.19.4/forge-1.19.4/mappings/directions.yaml rename to plugins/generator-1.19.4/datapack-1.19.4/mappings/directions.yaml diff --git a/plugins/generator-1.19.4/datapack-1.19.4/tag.definition.yaml b/plugins/generator-1.19.4/datapack-1.19.4/tag.definition.yaml deleted file mode 100644 index 3764d86432f..00000000000 --- a/plugins/generator-1.19.4/datapack-1.19.4/tag.definition.yaml +++ /dev/null @@ -1,4 +0,0 @@ -templates: - - template: tag.json.ftl - writer: json - name: "@RESROOT/data/@[getNamespace()]/tags/@[tagType()]/@[getName()].json" \ No newline at end of file diff --git a/plugins/generator-1.19.4/datapack-1.19.4/templates/biome/biometag.json.ftl b/plugins/generator-1.19.4/datapack-1.19.4/templates/biome/biometag.json.ftl deleted file mode 100644 index 1237028cdcf..00000000000 --- a/plugins/generator-1.19.4/datapack-1.19.4/templates/biome/biometag.json.ftl +++ /dev/null @@ -1,14 +0,0 @@ -<#assign entries=[]/> -<#list w.getElementsOfType("biome") as mod> - <#if mod.getGeneratableElement().hasStructure(var_type)> - <#assign entries+=[mod.getRegistryName()?lower_case]/> - - -{ - "replace": false, - "values": [ - <#list entries as entry> - "${modid}:${entry}"<#sep>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.19.4/datapack-1.19.4/templates/tag.json.ftl b/plugins/generator-1.19.4/datapack-1.19.4/templates/tag.json.ftl deleted file mode 100644 index 39888a4d2da..00000000000 --- a/plugins/generator-1.19.4/datapack-1.19.4/templates/tag.json.ftl +++ /dev/null @@ -1,32 +0,0 @@ -<#include "mcitems.ftl"> -<#assign tag = data.getNamespace() + ":" + data.getName()> -{ - "replace": false, - "values": [ - <#if data.type == "Items"> - <#list w.normalizeTagElements(tag, 1, data.items) as value> - "${mappedMCItemToRegistryName(value, true)}"<#sep>, - - <#elseif data.type == "Blocks"> - <#list w.normalizeTagElements(tag, 1, data.blocks) as value> - "${mappedMCItemToRegistryName(value, true)}"<#sep>, - - <#elseif data.type == "Functions"> - <#list data.functions as value> - "${generator.getResourceLocationForModElement(value)}"<#sep>, - - <#elseif data.type == "Entities"> - <#list w.normalizeTagElements(tag, 2, data.entities) as value> - "${value.getMappedValue(2)}"<#sep>, - - <#elseif data.type == "Biomes"> - <#list w.normalizeTagElements(tag, 0, data.biomes) as value> - "${value}"<#sep>, - - <#elseif data.type == "Damage types"> - <#list w.normalizeTagElements(tag, 1, data.damageTypes) as value> - "${value.getMappedValue(1)}"<#sep>, - - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.19.4/datapack-1.19.4/templates/tags.json.ftl b/plugins/generator-1.19.4/datapack-1.19.4/templates/tags.json.ftl new file mode 100644 index 00000000000..4403638bf15 --- /dev/null +++ b/plugins/generator-1.19.4/datapack-1.19.4/templates/tags.json.ftl @@ -0,0 +1,27 @@ +<#include "mcitems.ftl"> +{ + "replace": false, + "values": [ + <#if type == "items" || type == "blocks"> + <#list w.normalizeTagElements(tag.resourcePath(), 1, elements) as value> + "${mappedMCItemToRegistryName(value, true)}"<#sep>, + + <#elseif type == "entities"> + <#list w.normalizeTagElements(tag.resourcePath(), 2, elements) as value> + "${value.getMappedValue(2)}"<#sep>, + + <#elseif type == "biomes"> + <#list w.normalizeTagElements(tag.resourcePath(), 0, elements) as value> + "${value}"<#sep>, + + <#elseif type == "damage_types"> + <#list w.normalizeTagElements(tag.resourcePath(), 1, elements) as value> + "${value.getMappedValue(1)}"<#sep>, + + <#elseif type == "functions"> + <#list w.filterBrokenReferences(elements) as value> + "${generator.getResourceLocationForModElement(value)}"<#sep>, + + + ] +} \ No newline at end of file diff --git a/plugins/generator-1.19.4/forge-1.19.4/biome.definition.yaml b/plugins/generator-1.19.4/forge-1.19.4/biome.definition.yaml index 09cd27842f1..dc77e505c33 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/biome.definition.yaml +++ b/plugins/generator-1.19.4/forge-1.19.4/biome.definition.yaml @@ -26,191 +26,69 @@ global_templates: condition: "${w.getGElementsOfType('biome')?filter(e -> e.spawnBiome || e.spawnInCaves || e.spawnBiomeNether)?size != 0}" name: "@SRCROOT/@BASEPACKAGEPATH/init/@JavaModNameBiomes.java" - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=mineshaft" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=igloo" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('igloo'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/igloo.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=stronghold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('stronghold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/stronghold.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=mineshaft_mesa" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft_mesa'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft_mesa.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=pillager_outpost" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('pillager_outpost'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/pillager_outpost.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=woodland_mansion" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('woodland_mansion'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/woodland_mansion.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=jungle_temple" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('jungle_temple'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/jungle_temple.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=desert_pyramid" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('desert_pyramid'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/desert_pyramid.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=swamp_hut" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('swamp_hut'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/swamp_hut.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ocean_monument" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_monument'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_monument.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=shipwreck" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=shipwreck_beached" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck_beached'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck_beached.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=buried_treasure" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('buried_treasure'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/buried_treasure.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=nether_fortress" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fortress'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fortress.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=nether_fossil" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fossil'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fossil.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=bastion_remnant" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('bastion_remnant'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/bastion_remnant.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=end_city" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('end_city'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/end_city.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_desert.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_plains" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_plains'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_plains.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_savanna" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_savanna'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_savanna.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_snowy" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_snowy'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_snowy.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_taiga" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_taiga'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_taiga.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ocean_ruin_cold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_cold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_cold.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ocean_ruin_warm" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_warm'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_warm.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_standard" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_standard'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_standard.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_desert.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_jungle" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_jungle'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_jungle.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_swamp" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_swamp'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_swamp.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_mountain" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_mountain'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_mountain.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_ocean" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_ocean'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_ocean.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_nether" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_nether'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_nether.json" +tags: + - tag: BIOMES:minecraft:has_structure/mineshaft + condition: spawnMineshaft + - tag: BIOMES:minecraft:has_structure/igloo + condition: spawnIgloo + - tag: BIOMES:minecraft:has_structure/stronghold + condition: spawnStronghold + - tag: BIOMES:minecraft:has_structure/mineshaft_mesa + condition: spawnMineshaftMesa + - tag: BIOMES:minecraft:has_structure/pillager_outpost + condition: spawnPillagerOutpost + - tag: BIOMES:minecraft:has_structure/woodland_mansion + condition: spawnWoodlandMansion + - tag: BIOMES:minecraft:has_structure/jungle_temple + condition: spawnJungleTemple + - tag: BIOMES:minecraft:has_structure/desert_pyramid + condition: spawnDesertPyramid + - tag: BIOMES:minecraft:has_structure/swamp_hut + condition: spawnSwampHut + - tag: BIOMES:minecraft:has_structure/ocean_monument + condition: spawnOceanMonument + - tag: BIOMES:minecraft:has_structure/shipwreck + condition: spawnShipwreck + - tag: BIOMES:minecraft:has_structure/shipwreck_beached + condition: spawnShipwreckBeached + - tag: BIOMES:minecraft:has_structure/buried_treasure + condition: spawnBuriedTreasure + - tag: BIOMES:minecraft:has_structure/nether_fortress + condition: spawnNetherBridge + - tag: BIOMES:minecraft:has_structure/nether_fossil + condition: spawnNetherFossil + - tag: BIOMES:minecraft:has_structure/bastion_remnant + condition: spawnBastionRemnant + - tag: BIOMES:minecraft:has_structure/end_city + condition: spawnEndCity + - tag: BIOMES:minecraft:has_structure/village_desert + condition: "${data.villageType == 'desert'}" + - tag: BIOMES:minecraft:has_structure/village_plains + condition: "${data.villageType == 'plains'}" + - tag: BIOMES:minecraft:has_structure/village_savanna + condition: "${data.villageType == 'savanna'}" + - tag: BIOMES:minecraft:has_structure/village_snowy + condition: "${data.villageType == 'snowy'}" + - tag: BIOMES:minecraft:has_structure/village_taiga + condition: "${data.villageType == 'taiga'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_cold + condition: "${data.oceanRuinType == 'COLD'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_warm + condition: "${data.oceanRuinType == 'WARM'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_standard + condition: "${data.spawnRuinedPortal == 'STANDARD'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_desert + condition: "${data.spawnRuinedPortal == 'DESERT'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_jungle + condition: "${data.spawnRuinedPortal == 'JUNGLE'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_swamp + condition: "${data.spawnRuinedPortal == 'SWAMP'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_mountain + condition: "${data.spawnRuinedPortal == 'MOUNTAIN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_ocean + condition: "${data.spawnRuinedPortal == 'OCEAN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_nether + condition: "${data.spawnRuinedPortal == 'NETHER'}" localizationkeys: - key: biome.@modid.@registryname diff --git a/plugins/generator-1.19.4/forge-1.19.4/block.definition.yaml b/plugins/generator-1.19.4/forge-1.19.4/block.definition.yaml index cab7ad521bb..366ec114c61 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/block.definition.yaml +++ b/plugins/generator-1.19.4/forge-1.19.4/block.definition.yaml @@ -386,28 +386,22 @@ localizationkeys: - key: block.@modid.@registryname mapto: name -global_templates: - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=pickaxe" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/pickaxe.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('pickaxe'))?size != 0}" - hidden: true - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=axe" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/axe.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('axe'))?size != 0}" - hidden: true - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=shovel" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/shovel.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('shovel'))?size != 0}" - hidden: true - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=hoe" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/hoe.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('hoe'))?size != 0}" - hidden: true +tags: + - tag: BLOCKS:minecraft:mineable/pickaxe + condition: "${data.destroyTool == 'pickaxe'}" + - tag: BLOCKS:minecraft:mineable/axe + condition: "${data.destroyTool == 'axe'}" + - tag: BLOCKS:minecraft:mineable/shovel + condition: "${data.destroyTool == 'shovel'}" + - tag: BLOCKS:minecraft:mineable/hoe + condition: "${data.destroyTool == 'hoe'}" + - tag: BLOCKS:minecraft:stairs + condition: "${data.blockBase! == 'Stairs'}" + - tag: BLOCKS:minecraft:slabs + condition: "${data.blockBase! == 'Slab'}" + - tag: BLOCKS:minecraft:fences + condition: "${data.blockBase! == 'Fence'}" + - tag: BLOCKS:minecraft:walls + condition: "${data.blockBase! == 'Wall'}" + - tag: BLOCKS:minecraft:leaves + condition: "${data.blockBase! == 'Leaves'}" diff --git a/plugins/generator-1.19.4/forge-1.19.4/dimension.definition.yaml b/plugins/generator-1.19.4/forge-1.19.4/dimension.definition.yaml index 8407869dd91..6269cc2a9eb 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/dimension.definition.yaml +++ b/plugins/generator-1.19.4/forge-1.19.4/dimension.definition.yaml @@ -48,10 +48,9 @@ templates: name: "@MODASSETSROOT/models/item/@registryname.json" condition: hasIgniter() -global_templates: - - template: json/carvertag.json.ftl - writer: json - name: "@RESROOT/data/minecraft/tags/blocks/overworld_carver_replaceables.json" +tags: + - tag: BLOCKS:minecraft:overworld_carver_replaceables + entryprovider: data.getWorldgenBlocks() localizationkeys: - key: item.@modid.@registryname diff --git a/plugins/generator-1.19.4/forge-1.19.4/generator.yaml b/plugins/generator-1.19.4/forge-1.19.4/generator.yaml index 0faec02ce64..21ccc87cd32 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/generator.yaml +++ b/plugins/generator-1.19.4/forge-1.19.4/generator.yaml @@ -84,6 +84,10 @@ sources_setup_tasks: template: javamodel.java.ftl to: "@SRCROOT/@BASEPACKAGEPATH/client/model" +tags: + template: tags.json.ftl # loaded from datapack generator + name: "@RESROOT/data/@namespace/tags/@folder/@name.json" + language_file: format: json root_folder: "@MODASSETSROOT/lang/" diff --git a/plugins/generator-1.19.4/forge-1.19.4/musicdisc.definition.yaml b/plugins/generator-1.19.4/forge-1.19.4/musicdisc.definition.yaml index 7942b70b86f..1bbba39aa12 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/musicdisc.definition.yaml +++ b/plugins/generator-1.19.4/forge-1.19.4/musicdisc.definition.yaml @@ -5,10 +5,8 @@ templates: writer: json name: "@MODASSETSROOT/models/item/@registryname.json" -global_templates: - - template: json/musicdisctag.json.ftl - writer: json - name: "@RESROOT/data/minecraft/tags/items/music_discs.json" +tags: + - tag: ITEMS:minecraft:music_discs localizationkeys: - key: item.@modid.@registryname diff --git a/plugins/generator-1.19.4/forge-1.19.4/tag.definition.yaml b/plugins/generator-1.19.4/forge-1.19.4/tag.definition.yaml deleted file mode 100644 index 7e03769eed6..00000000000 --- a/plugins/generator-1.19.4/forge-1.19.4/tag.definition.yaml +++ /dev/null @@ -1,4 +0,0 @@ -templates: - - template: tag.json.ftl # loaded from datapack generator - writer: json - name: "@RESROOT/data/@[getNamespace()]/tags/@[tagType()]/@[getName()].json" \ No newline at end of file diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/block/mineable_tag.json.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/block/mineable_tag.json.ftl deleted file mode 100644 index 17a286ae43d..00000000000 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/block/mineable_tag.json.ftl +++ /dev/null @@ -1,8 +0,0 @@ -{ - "replace": false, - "values": [ - <#list blocks?filter(block -> block.destroyTool == var_type) as block> - "${generator.getResourceLocationForModElement(block.getModElement())}"<#sep>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/elementinits/entities.java.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/elementinits/entities.java.ftl index fa9e2146cf7..998f2bc06c4 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/elementinits/entities.java.ftl +++ b/plugins/generator-1.19.4/forge-1.19.4/templates/elementinits/entities.java.ftl @@ -43,7 +43,7 @@ package ${package}.init; <#list entities as entity> <#if entity.getModElement().getTypeString() == "projectile"> public static final RegistryObject> ${entity.getModElement().getRegistryNameUpper()} = - register("projectile_${entity.getModElement().getRegistryName()}", EntityType.Builder.<${entity.getModElement().getName()}Entity> + register("${entity.getModElement().getRegistryName()}", EntityType.Builder.<${entity.getModElement().getName()}Entity> of(${entity.getModElement().getName()}Entity::new, MobCategory.MISC).setCustomClientFactory(${entity.getModElement().getName()}Entity::new) .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); <#else> diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/item/item.java.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/item/item.java.ftl index 24ab9ef0a17..50d0443d58f 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/item/item.java.ftl +++ b/plugins/generator-1.19.4/forge-1.19.4/templates/item/item.java.ftl @@ -128,7 +128,7 @@ public class ${name}Item extends Item { if (equipmentSlot == EquipmentSlot.MAINHAND) { ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(super.getDefaultAttributeModifiers(equipmentSlot)); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Item modifier", ${data.damageVsEntity - 2}d, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Item modifier", ${data.damageVsEntity - 1}d, AttributeModifier.Operation.ADDITION)); builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Item modifier", -2.4, AttributeModifier.Operation.ADDITION)); return builder.build(); } diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/json/carvertag.json.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/json/carvertag.json.ftl deleted file mode 100644 index ffb81d30462..00000000000 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/json/carvertag.json.ftl +++ /dev/null @@ -1,30 +0,0 @@ -<#include "../mcitems.ftl"> -{ - "replace": false, - "values": [ - <#assign elements = []> - <#list w.getElementsOfType("dimension") as me> - <#assign ge = me.getGeneratableElement() /> - - <#assign elements += ["${mappedMCItemToRegistryName(ge.mainFillerBlock)}"]> - <#list w.filterBrokenReferences(ge.biomesInDimension) as biome> - <#if biome.getUnmappedValue().startsWith("CUSTOM:")> - <#assign gebiome = w.getWorkspace().getModElementByName(biome.getUnmappedValue().replace("CUSTOM:", "")).getGeneratableElement()/> - <#assign elements += ["${mappedMCItemToRegistryName(gebiome.groundBlock)}"]> - <#assign elements += ["${mappedMCItemToRegistryName(gebiome.undergroundBlock)}"]> - - - - - <#assign elementsUnique = [] /> - <#list elements as element> - <#if ! elementsUnique?seq_contains(element)> - <#assign elementsUnique = elementsUnique + [element] /> - - - - <#list elementsUnique as e> - "${e}"<#if e?has_next>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/json/musicdisctag.json.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/json/musicdisctag.json.ftl deleted file mode 100644 index 7f8f16c7a30..00000000000 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/json/musicdisctag.json.ftl +++ /dev/null @@ -1,8 +0,0 @@ -{ - "replace": false, - "values": [ - <#list musicdiscs as musicdisc> - "${modid}:${musicdisc.getModElement().getRegistryName()}"<#sep>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/mod.java.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/mod.java.ftl index da8db58592e..6a0222e2818 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/mod.java.ftl +++ b/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/mod.java.ftl @@ -67,7 +67,7 @@ import org.apache.logging.log4j.Logger; private static final Collection> workQueue = new ConcurrentLinkedQueue<>(); public static void queueServerWork(int tick, Runnable action) { - workQueue.add(new AbstractMap.SimpleEntry(action, tick)); + workQueue.add(new AbstractMap.SimpleEntry<>(action, tick)); } @SubscribeEvent public void tick(TickEvent.ServerTickEvent event) { diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/variableslist.java.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/variableslist.java.ftl index 2e7ab4e3ee6..c1662d26553 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/variableslist.java.ftl +++ b/plugins/generator-1.19.4/forge-1.19.4/templates/modbase/variableslist.java.ftl @@ -183,7 +183,7 @@ import net.minecraft.nbt.Tag; this.setDirty(); if (world instanceof Level && !world.isClientSide()) - ${JavaModName}.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new SavedDataSyncMessage(0, this)); + ${JavaModName}.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new SavedDataSyncMessage(0, this)); } static MapVariables clientSide = new MapVariables(); @@ -299,8 +299,8 @@ import net.minecraft.nbt.Tag; return nbt; } - public void readNBT(Tag Tag) { - CompoundTag nbt = (CompoundTag) Tag; + public void readNBT(Tag tag) { + CompoundTag nbt = (CompoundTag) tag; <#list variables as var> <#if var.getScope().name() == "PLAYER_LIFETIME"> <@var.getType().getScopeDefinition(generator.getWorkspace(), "PLAYER_LIFETIME")['read']?interpret/> diff --git a/plugins/generator-1.19.4/forge-1.19.4/templates/tool.java.ftl b/plugins/generator-1.19.4/forge-1.19.4/templates/tool.java.ftl index cc3108fc686..8bd194b72e5 100644 --- a/plugins/generator-1.19.4/forge-1.19.4/templates/tool.java.ftl +++ b/plugins/generator-1.19.4/forge-1.19.4/templates/tool.java.ftl @@ -54,7 +54,13 @@ public class ${name}Item extends ${data.toolType?replace("Spade", "Shovel")?repl } public float getAttackDamageBonus() { + <#if data.toolType == "Sword"> + return ${data.damageVsEntity - 4}f; + <#elseif data.toolType == "Hoe"> + return ${data.damageVsEntity - 1}f; + <#else> return ${data.damageVsEntity - 2}f; + } public int getLevel() { @@ -134,7 +140,7 @@ public class ${name}Item extends ${data.toolType?replace("Spade", "Shovel")?repl if (equipmentSlot == EquipmentSlot.MAINHAND) { ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(super.getDefaultAttributeModifiers(equipmentSlot)); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 2}f, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 1}f, AttributeModifier.Operation.ADDITION)); builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Tool modifier", ${data.attackSpeed - 4}, AttributeModifier.Operation.ADDITION)); return builder.build(); } @@ -188,7 +194,7 @@ public class ${name}Item extends Item { if (equipmentSlot == EquipmentSlot.MAINHAND) { ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(super.getDefaultAttributeModifiers(equipmentSlot)); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 2}f, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 1}f, AttributeModifier.Operation.ADDITION)); builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Tool modifier", ${data.attackSpeed - 4}, AttributeModifier.Operation.ADDITION)); return builder.build(); } diff --git a/plugins/generator-1.20.1/datapack-1.20.1/biome.definition.yaml b/plugins/generator-1.20.1/datapack-1.20.1/biome.definition.yaml index c536cdd9e7c..85899704411 100644 --- a/plugins/generator-1.20.1/datapack-1.20.1/biome.definition.yaml +++ b/plugins/generator-1.20.1/datapack-1.20.1/biome.definition.yaml @@ -11,192 +11,69 @@ templates: condition: hasTrees() name: "@MODDATAROOT/worldgen/placed_feature/@registryname_tree.json" -global_templates: - - template: biome/biometag.json.ftl - writer: json - variables: "type=mineshaft" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=igloo" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('igloo'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/igloo.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=stronghold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('stronghold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/stronghold.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=mineshaft_mesa" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft_mesa'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft_mesa.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=pillager_outpost" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('pillager_outpost'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/pillager_outpost.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=woodland_mansion" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('woodland_mansion'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/woodland_mansion.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=jungle_temple" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('jungle_temple'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/jungle_temple.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=desert_pyramid" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('desert_pyramid'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/desert_pyramid.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=swamp_hut" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('swamp_hut'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/swamp_hut.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ocean_monument" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_monument'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_monument.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=shipwreck" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=shipwreck_beached" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck_beached'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck_beached.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=buried_treasure" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('buried_treasure'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/buried_treasure.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=nether_fortress" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fortress'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fortress.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=nether_fossil" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fossil'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fossil.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=bastion_remnant" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('bastion_remnant'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/bastion_remnant.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=end_city" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('end_city'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/end_city.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_desert.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_plains" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_plains'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_plains.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_savanna" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_savanna'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_savanna.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_snowy" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_snowy'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_snowy.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=village_taiga" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_taiga'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_taiga.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ocean_ruin_cold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_cold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_cold.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ocean_ruin_warm" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_warm'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_warm.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_standard" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_standard'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_standard.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_desert.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_jungle" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_jungle'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_jungle.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_swamp" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_swamp'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_swamp.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_mountain" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_mountain'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_mountain.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_ocean" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_ocean'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_ocean.json" - hidden: true - - template: biome/biometag.json.ftl - writer: json - variables: "type=ruined_portal_nether" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_nether'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_nether.json" +tags: + - tag: BIOMES:minecraft:has_structure/mineshaft + condition: spawnMineshaft + - tag: BIOMES:minecraft:has_structure/igloo + condition: spawnIgloo + - tag: BIOMES:minecraft:has_structure/stronghold + condition: spawnStronghold + - tag: BIOMES:minecraft:has_structure/mineshaft_mesa + condition: spawnMineshaftMesa + - tag: BIOMES:minecraft:has_structure/pillager_outpost + condition: spawnPillagerOutpost + - tag: BIOMES:minecraft:has_structure/woodland_mansion + condition: spawnWoodlandMansion + - tag: BIOMES:minecraft:has_structure/jungle_temple + condition: spawnJungleTemple + - tag: BIOMES:minecraft:has_structure/desert_pyramid + condition: spawnDesertPyramid + - tag: BIOMES:minecraft:has_structure/swamp_hut + condition: spawnSwampHut + - tag: BIOMES:minecraft:has_structure/ocean_monument + condition: spawnOceanMonument + - tag: BIOMES:minecraft:has_structure/shipwreck + condition: spawnShipwreck + - tag: BIOMES:minecraft:has_structure/shipwreck_beached + condition: spawnShipwreckBeached + - tag: BIOMES:minecraft:has_structure/buried_treasure + condition: spawnBuriedTreasure + - tag: BIOMES:minecraft:has_structure/nether_fortress + condition: spawnNetherBridge + - tag: BIOMES:minecraft:has_structure/nether_fossil + condition: spawnNetherFossil + - tag: BIOMES:minecraft:has_structure/bastion_remnant + condition: spawnBastionRemnant + - tag: BIOMES:minecraft:has_structure/end_city + condition: spawnEndCity + - tag: BIOMES:minecraft:has_structure/village_desert + condition: "${data.villageType == 'desert'}" + - tag: BIOMES:minecraft:has_structure/village_plains + condition: "${data.villageType == 'plains'}" + - tag: BIOMES:minecraft:has_structure/village_savanna + condition: "${data.villageType == 'savanna'}" + - tag: BIOMES:minecraft:has_structure/village_snowy + condition: "${data.villageType == 'snowy'}" + - tag: BIOMES:minecraft:has_structure/village_taiga + condition: "${data.villageType == 'taiga'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_cold + condition: "${data.oceanRuinType == 'COLD'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_warm + condition: "${data.oceanRuinType == 'WARM'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_standard + condition: "${data.spawnRuinedPortal == 'STANDARD'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_desert + condition: "${data.spawnRuinedPortal == 'DESERT'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_jungle + condition: "${data.spawnRuinedPortal == 'JUNGLE'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_swamp + condition: "${data.spawnRuinedPortal == 'SWAMP'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_mountain + condition: "${data.spawnRuinedPortal == 'MOUNTAIN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_ocean + condition: "${data.spawnRuinedPortal == 'OCEAN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_nether + condition: "${data.spawnRuinedPortal == 'NETHER'}" field_exclusions: [name, coverageEstimate, treeVines, treeFruits, spawnBiome, spawnInCaves, spawnBiomeNether] diff --git a/plugins/generator-1.20.1/datapack-1.20.1/generator.yaml b/plugins/generator-1.20.1/datapack-1.20.1/generator.yaml index ec6fbc774d2..92d6191d978 100644 --- a/plugins/generator-1.20.1/datapack-1.20.1/generator.yaml +++ b/plugins/generator-1.20.1/datapack-1.20.1/generator.yaml @@ -19,4 +19,8 @@ structures_dir: "@MODDATAROOT/structures" base_templates: - template: pack.mcmeta.ftl writer: json - name: "@SRCROOT/pack.mcmeta" \ No newline at end of file + name: "@SRCROOT/pack.mcmeta" + +tags: + template: tags.json.ftl + name: "@RESROOT/data/@namespace/tags/@folder/@name.json" diff --git a/plugins/generator-1.20.1/forge-1.20.1/mappings/directions.yaml b/plugins/generator-1.20.1/datapack-1.20.1/mappings/directions.yaml similarity index 100% rename from plugins/generator-1.20.1/forge-1.20.1/mappings/directions.yaml rename to plugins/generator-1.20.1/datapack-1.20.1/mappings/directions.yaml diff --git a/plugins/generator-1.20.1/datapack-1.20.1/tag.definition.yaml b/plugins/generator-1.20.1/datapack-1.20.1/tag.definition.yaml deleted file mode 100644 index 3764d86432f..00000000000 --- a/plugins/generator-1.20.1/datapack-1.20.1/tag.definition.yaml +++ /dev/null @@ -1,4 +0,0 @@ -templates: - - template: tag.json.ftl - writer: json - name: "@RESROOT/data/@[getNamespace()]/tags/@[tagType()]/@[getName()].json" \ No newline at end of file diff --git a/plugins/generator-1.20.1/datapack-1.20.1/templates/biome/biometag.json.ftl b/plugins/generator-1.20.1/datapack-1.20.1/templates/biome/biometag.json.ftl deleted file mode 100644 index 1237028cdcf..00000000000 --- a/plugins/generator-1.20.1/datapack-1.20.1/templates/biome/biometag.json.ftl +++ /dev/null @@ -1,14 +0,0 @@ -<#assign entries=[]/> -<#list w.getElementsOfType("biome") as mod> - <#if mod.getGeneratableElement().hasStructure(var_type)> - <#assign entries+=[mod.getRegistryName()?lower_case]/> - - -{ - "replace": false, - "values": [ - <#list entries as entry> - "${modid}:${entry}"<#sep>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.20.1/datapack-1.20.1/templates/tag.json.ftl b/plugins/generator-1.20.1/datapack-1.20.1/templates/tag.json.ftl deleted file mode 100644 index 221e3779338..00000000000 --- a/plugins/generator-1.20.1/datapack-1.20.1/templates/tag.json.ftl +++ /dev/null @@ -1,34 +0,0 @@ -<#include "mcitems.ftl"> -<#assign tag = data.getNamespace() + ":" + data.getName()> -{ - "replace": false, - "values": [ - <#if data.type == "Items"> - <#list w.normalizeTagElements(tag, 1, data.items) as value> - "${mappedMCItemToRegistryName(value, true)}"<#if value?has_next>, - - <#elseif data.type == "Blocks"> - <#list w.normalizeTagElements(tag, 1, data.blocks) as value> - "${mappedMCItemToRegistryName(value, true)}"<#if value?has_next>, - - <#elseif data.type == "Functions"> - <#list data.functions as value> - "${generator.getResourceLocationForModElement(value)}" - <#if value?has_next>, - - <#elseif data.type == "Entities"> - <#list w.normalizeTagElements(tag, 2, data.entities) as value> - "${value.getMappedValue(2)}" - <#if value?has_next>, - - <#elseif data.type == "Biomes"> - <#list w.normalizeTagElements(tag, 0, data.biomes) as value> - "${value}"<#if value?has_next>, - - <#elseif data.type == "Damage types"> - <#list w.normalizeTagElements(tag, 1, data.damageTypes) as value> - "${value.getMappedValue(1)}"<#sep>, - - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.20.1/datapack-1.20.1/templates/tags.json.ftl b/plugins/generator-1.20.1/datapack-1.20.1/templates/tags.json.ftl new file mode 100644 index 00000000000..4403638bf15 --- /dev/null +++ b/plugins/generator-1.20.1/datapack-1.20.1/templates/tags.json.ftl @@ -0,0 +1,27 @@ +<#include "mcitems.ftl"> +{ + "replace": false, + "values": [ + <#if type == "items" || type == "blocks"> + <#list w.normalizeTagElements(tag.resourcePath(), 1, elements) as value> + "${mappedMCItemToRegistryName(value, true)}"<#sep>, + + <#elseif type == "entities"> + <#list w.normalizeTagElements(tag.resourcePath(), 2, elements) as value> + "${value.getMappedValue(2)}"<#sep>, + + <#elseif type == "biomes"> + <#list w.normalizeTagElements(tag.resourcePath(), 0, elements) as value> + "${value}"<#sep>, + + <#elseif type == "damage_types"> + <#list w.normalizeTagElements(tag.resourcePath(), 1, elements) as value> + "${value.getMappedValue(1)}"<#sep>, + + <#elseif type == "functions"> + <#list w.filterBrokenReferences(elements) as value> + "${generator.getResourceLocationForModElement(value)}"<#sep>, + + + ] +} \ No newline at end of file diff --git a/plugins/generator-1.20.1/forge-1.20.1/biome.definition.yaml b/plugins/generator-1.20.1/forge-1.20.1/biome.definition.yaml index 09cd27842f1..dc77e505c33 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/biome.definition.yaml +++ b/plugins/generator-1.20.1/forge-1.20.1/biome.definition.yaml @@ -26,191 +26,69 @@ global_templates: condition: "${w.getGElementsOfType('biome')?filter(e -> e.spawnBiome || e.spawnInCaves || e.spawnBiomeNether)?size != 0}" name: "@SRCROOT/@BASEPACKAGEPATH/init/@JavaModNameBiomes.java" - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=mineshaft" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=igloo" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('igloo'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/igloo.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=stronghold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('stronghold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/stronghold.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=mineshaft_mesa" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('mineshaft_mesa'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/mineshaft_mesa.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=pillager_outpost" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('pillager_outpost'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/pillager_outpost.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=woodland_mansion" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('woodland_mansion'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/woodland_mansion.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=jungle_temple" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('jungle_temple'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/jungle_temple.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=desert_pyramid" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('desert_pyramid'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/desert_pyramid.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=swamp_hut" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('swamp_hut'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/swamp_hut.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ocean_monument" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_monument'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_monument.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=shipwreck" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=shipwreck_beached" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('shipwreck_beached'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/shipwreck_beached.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=buried_treasure" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('buried_treasure'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/buried_treasure.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=nether_fortress" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fortress'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fortress.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=nether_fossil" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('nether_fossil'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/nether_fossil.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=bastion_remnant" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('bastion_remnant'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/bastion_remnant.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=end_city" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('end_city'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/end_city.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_desert.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_plains" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_plains'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_plains.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_savanna" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_savanna'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_savanna.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_snowy" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_snowy'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_snowy.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=village_taiga" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('village_taiga'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/village_taiga.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ocean_ruin_cold" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_cold'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_cold.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ocean_ruin_warm" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ocean_ruin_warm'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ocean_ruin_warm.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_standard" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_standard'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_standard.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_desert" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_desert'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_desert.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_jungle" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_jungle'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_jungle.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_swamp" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_swamp'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_swamp.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_mountain" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_mountain'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_mountain.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_ocean" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_ocean'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_ocean.json" - hidden: true - - template: biome/biometag.json.ftl # loaded from datapack generator - writer: json - variables: "type=ruined_portal_nether" - condition: "${w.getGElementsOfType('biome')?filter(e -> e.hasStructure('ruined_portal_nether'))?size != 0}" - name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_nether.json" +tags: + - tag: BIOMES:minecraft:has_structure/mineshaft + condition: spawnMineshaft + - tag: BIOMES:minecraft:has_structure/igloo + condition: spawnIgloo + - tag: BIOMES:minecraft:has_structure/stronghold + condition: spawnStronghold + - tag: BIOMES:minecraft:has_structure/mineshaft_mesa + condition: spawnMineshaftMesa + - tag: BIOMES:minecraft:has_structure/pillager_outpost + condition: spawnPillagerOutpost + - tag: BIOMES:minecraft:has_structure/woodland_mansion + condition: spawnWoodlandMansion + - tag: BIOMES:minecraft:has_structure/jungle_temple + condition: spawnJungleTemple + - tag: BIOMES:minecraft:has_structure/desert_pyramid + condition: spawnDesertPyramid + - tag: BIOMES:minecraft:has_structure/swamp_hut + condition: spawnSwampHut + - tag: BIOMES:minecraft:has_structure/ocean_monument + condition: spawnOceanMonument + - tag: BIOMES:minecraft:has_structure/shipwreck + condition: spawnShipwreck + - tag: BIOMES:minecraft:has_structure/shipwreck_beached + condition: spawnShipwreckBeached + - tag: BIOMES:minecraft:has_structure/buried_treasure + condition: spawnBuriedTreasure + - tag: BIOMES:minecraft:has_structure/nether_fortress + condition: spawnNetherBridge + - tag: BIOMES:minecraft:has_structure/nether_fossil + condition: spawnNetherFossil + - tag: BIOMES:minecraft:has_structure/bastion_remnant + condition: spawnBastionRemnant + - tag: BIOMES:minecraft:has_structure/end_city + condition: spawnEndCity + - tag: BIOMES:minecraft:has_structure/village_desert + condition: "${data.villageType == 'desert'}" + - tag: BIOMES:minecraft:has_structure/village_plains + condition: "${data.villageType == 'plains'}" + - tag: BIOMES:minecraft:has_structure/village_savanna + condition: "${data.villageType == 'savanna'}" + - tag: BIOMES:minecraft:has_structure/village_snowy + condition: "${data.villageType == 'snowy'}" + - tag: BIOMES:minecraft:has_structure/village_taiga + condition: "${data.villageType == 'taiga'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_cold + condition: "${data.oceanRuinType == 'COLD'}" + - tag: BIOMES:minecraft:has_structure/ocean_ruin_warm + condition: "${data.oceanRuinType == 'WARM'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_standard + condition: "${data.spawnRuinedPortal == 'STANDARD'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_desert + condition: "${data.spawnRuinedPortal == 'DESERT'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_jungle + condition: "${data.spawnRuinedPortal == 'JUNGLE'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_swamp + condition: "${data.spawnRuinedPortal == 'SWAMP'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_mountain + condition: "${data.spawnRuinedPortal == 'MOUNTAIN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_ocean + condition: "${data.spawnRuinedPortal == 'OCEAN'}" + - tag: BIOMES:minecraft:has_structure/ruined_portal_nether + condition: "${data.spawnRuinedPortal == 'NETHER'}" localizationkeys: - key: biome.@modid.@registryname diff --git a/plugins/generator-1.20.1/forge-1.20.1/block.definition.yaml b/plugins/generator-1.20.1/forge-1.20.1/block.definition.yaml index cab7ad521bb..366ec114c61 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/block.definition.yaml +++ b/plugins/generator-1.20.1/forge-1.20.1/block.definition.yaml @@ -386,28 +386,22 @@ localizationkeys: - key: block.@modid.@registryname mapto: name -global_templates: - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=pickaxe" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/pickaxe.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('pickaxe'))?size != 0}" - hidden: true - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=axe" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/axe.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('axe'))?size != 0}" - hidden: true - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=shovel" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/shovel.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('shovel'))?size != 0}" - hidden: true - - template: block/mineable_tag.json.ftl - writer: json - variables: "type=hoe" - name: "@RESROOT/data/minecraft/tags/blocks/mineable/hoe.json" - condition: "${w.getGElementsOfType('block')?filter(e -> e.destroyTool.equals('hoe'))?size != 0}" - hidden: true +tags: + - tag: BLOCKS:minecraft:mineable/pickaxe + condition: "${data.destroyTool == 'pickaxe'}" + - tag: BLOCKS:minecraft:mineable/axe + condition: "${data.destroyTool == 'axe'}" + - tag: BLOCKS:minecraft:mineable/shovel + condition: "${data.destroyTool == 'shovel'}" + - tag: BLOCKS:minecraft:mineable/hoe + condition: "${data.destroyTool == 'hoe'}" + - tag: BLOCKS:minecraft:stairs + condition: "${data.blockBase! == 'Stairs'}" + - tag: BLOCKS:minecraft:slabs + condition: "${data.blockBase! == 'Slab'}" + - tag: BLOCKS:minecraft:fences + condition: "${data.blockBase! == 'Fence'}" + - tag: BLOCKS:minecraft:walls + condition: "${data.blockBase! == 'Wall'}" + - tag: BLOCKS:minecraft:leaves + condition: "${data.blockBase! == 'Leaves'}" diff --git a/plugins/generator-1.20.1/forge-1.20.1/dimension.definition.yaml b/plugins/generator-1.20.1/forge-1.20.1/dimension.definition.yaml index 8407869dd91..6269cc2a9eb 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/dimension.definition.yaml +++ b/plugins/generator-1.20.1/forge-1.20.1/dimension.definition.yaml @@ -48,10 +48,9 @@ templates: name: "@MODASSETSROOT/models/item/@registryname.json" condition: hasIgniter() -global_templates: - - template: json/carvertag.json.ftl - writer: json - name: "@RESROOT/data/minecraft/tags/blocks/overworld_carver_replaceables.json" +tags: + - tag: BLOCKS:minecraft:overworld_carver_replaceables + entryprovider: data.getWorldgenBlocks() localizationkeys: - key: item.@modid.@registryname diff --git a/plugins/generator-1.20.1/forge-1.20.1/generator.yaml b/plugins/generator-1.20.1/forge-1.20.1/generator.yaml index f1d1aab1caf..85105c1d649 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/generator.yaml +++ b/plugins/generator-1.20.1/forge-1.20.1/generator.yaml @@ -83,6 +83,10 @@ sources_setup_tasks: template: javamodel.java.ftl to: "@SRCROOT/@BASEPACKAGEPATH/client/model" +tags: + template: tags.json.ftl + name: "@RESROOT/data/@namespace/tags/@folder/@name.json" + language_file: format: json root_folder: "@MODASSETSROOT/lang/" diff --git a/plugins/generator-1.20.1/forge-1.20.1/musicdisc.definition.yaml b/plugins/generator-1.20.1/forge-1.20.1/musicdisc.definition.yaml index 7942b70b86f..1bbba39aa12 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/musicdisc.definition.yaml +++ b/plugins/generator-1.20.1/forge-1.20.1/musicdisc.definition.yaml @@ -5,10 +5,8 @@ templates: writer: json name: "@MODASSETSROOT/models/item/@registryname.json" -global_templates: - - template: json/musicdisctag.json.ftl - writer: json - name: "@RESROOT/data/minecraft/tags/items/music_discs.json" +tags: + - tag: ITEMS:minecraft:music_discs localizationkeys: - key: item.@modid.@registryname diff --git a/plugins/generator-1.20.1/forge-1.20.1/tag.definition.yaml b/plugins/generator-1.20.1/forge-1.20.1/tag.definition.yaml deleted file mode 100644 index 7e03769eed6..00000000000 --- a/plugins/generator-1.20.1/forge-1.20.1/tag.definition.yaml +++ /dev/null @@ -1,4 +0,0 @@ -templates: - - template: tag.json.ftl # loaded from datapack generator - writer: json - name: "@RESROOT/data/@[getNamespace()]/tags/@[tagType()]/@[getName()].json" \ No newline at end of file diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/block/mineable_tag.json.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/block/mineable_tag.json.ftl deleted file mode 100644 index 17a286ae43d..00000000000 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/block/mineable_tag.json.ftl +++ /dev/null @@ -1,8 +0,0 @@ -{ - "replace": false, - "values": [ - <#list blocks?filter(block -> block.destroyTool == var_type) as block> - "${generator.getResourceLocationForModElement(block.getModElement())}"<#sep>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/elementinits/entities.java.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/elementinits/entities.java.ftl index 998015a7938..55635ebe299 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/elementinits/entities.java.ftl +++ b/plugins/generator-1.20.1/forge-1.20.1/templates/elementinits/entities.java.ftl @@ -45,7 +45,7 @@ package ${package}.init; <#list entities as entity> <#if entity.getModElement().getTypeString() == "projectile"> public static final RegistryObject> ${entity.getModElement().getRegistryNameUpper()} = - register("projectile_${entity.getModElement().getRegistryName()}", EntityType.Builder.<${entity.getModElement().getName()}Entity> + register("${entity.getModElement().getRegistryName()}", EntityType.Builder.<${entity.getModElement().getName()}Entity> of(${entity.getModElement().getName()}Entity::new, MobCategory.MISC).setCustomClientFactory(${entity.getModElement().getName()}Entity::new) .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); <#elseif entity.getModElement().getTypeString() == "livingentity"> diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/item/item.java.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/item/item.java.ftl index 24ab9ef0a17..50d0443d58f 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/item/item.java.ftl +++ b/plugins/generator-1.20.1/forge-1.20.1/templates/item/item.java.ftl @@ -128,7 +128,7 @@ public class ${name}Item extends Item { if (equipmentSlot == EquipmentSlot.MAINHAND) { ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(super.getDefaultAttributeModifiers(equipmentSlot)); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Item modifier", ${data.damageVsEntity - 2}d, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Item modifier", ${data.damageVsEntity - 1}d, AttributeModifier.Operation.ADDITION)); builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Item modifier", -2.4, AttributeModifier.Operation.ADDITION)); return builder.build(); } diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/json/carvertag.json.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/json/carvertag.json.ftl deleted file mode 100644 index ffb81d30462..00000000000 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/json/carvertag.json.ftl +++ /dev/null @@ -1,30 +0,0 @@ -<#include "../mcitems.ftl"> -{ - "replace": false, - "values": [ - <#assign elements = []> - <#list w.getElementsOfType("dimension") as me> - <#assign ge = me.getGeneratableElement() /> - - <#assign elements += ["${mappedMCItemToRegistryName(ge.mainFillerBlock)}"]> - <#list w.filterBrokenReferences(ge.biomesInDimension) as biome> - <#if biome.getUnmappedValue().startsWith("CUSTOM:")> - <#assign gebiome = w.getWorkspace().getModElementByName(biome.getUnmappedValue().replace("CUSTOM:", "")).getGeneratableElement()/> - <#assign elements += ["${mappedMCItemToRegistryName(gebiome.groundBlock)}"]> - <#assign elements += ["${mappedMCItemToRegistryName(gebiome.undergroundBlock)}"]> - - - - - <#assign elementsUnique = [] /> - <#list elements as element> - <#if ! elementsUnique?seq_contains(element)> - <#assign elementsUnique = elementsUnique + [element] /> - - - - <#list elementsUnique as e> - "${e}"<#if e?has_next>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/json/musicdisctag.json.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/json/musicdisctag.json.ftl deleted file mode 100644 index 7f8f16c7a30..00000000000 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/json/musicdisctag.json.ftl +++ /dev/null @@ -1,8 +0,0 @@ -{ - "replace": false, - "values": [ - <#list musicdiscs as musicdisc> - "${modid}:${musicdisc.getModElement().getRegistryName()}"<#sep>, - - ] -} \ No newline at end of file diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/mod.java.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/mod.java.ftl index d6ce8d18b80..fe0cfb55b69 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/mod.java.ftl +++ b/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/mod.java.ftl @@ -68,7 +68,7 @@ import org.apache.logging.log4j.Logger; private static final Collection> workQueue = new ConcurrentLinkedQueue<>(); public static void queueServerWork(int tick, Runnable action) { - workQueue.add(new AbstractMap.SimpleEntry(action, tick)); + workQueue.add(new AbstractMap.SimpleEntry<>(action, tick)); } @SubscribeEvent public void tick(TickEvent.ServerTickEvent event) { diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/variableslist.java.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/variableslist.java.ftl index bb436636553..b1424a879dc 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/variableslist.java.ftl +++ b/plugins/generator-1.20.1/forge-1.20.1/templates/modbase/variableslist.java.ftl @@ -183,7 +183,7 @@ import net.minecraft.nbt.Tag; this.setDirty(); if (world instanceof Level && !world.isClientSide()) - ${JavaModName}.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new SavedDataSyncMessage(0, this)); + ${JavaModName}.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new SavedDataSyncMessage(0, this)); } static MapVariables clientSide = new MapVariables(); @@ -299,8 +299,8 @@ import net.minecraft.nbt.Tag; return nbt; } - public void readNBT(Tag Tag) { - CompoundTag nbt = (CompoundTag) Tag; + public void readNBT(Tag tag) { + CompoundTag nbt = (CompoundTag) tag; <#list variables as var> <#if var.getScope().name() == "PLAYER_LIFETIME"> <@var.getType().getScopeDefinition(generator.getWorkspace(), "PLAYER_LIFETIME")['read']?interpret/> diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/tool.java.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/tool.java.ftl index b77803fdddd..cf0dae560bd 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/tool.java.ftl +++ b/plugins/generator-1.20.1/forge-1.20.1/templates/tool.java.ftl @@ -54,7 +54,13 @@ public class ${name}Item extends ${data.toolType?replace("Spade", "Shovel")?repl } public float getAttackDamageBonus() { + <#if data.toolType == "Sword"> + return ${data.damageVsEntity - 4}f; + <#elseif data.toolType == "Hoe"> + return ${data.damageVsEntity - 1}f; + <#else> return ${data.damageVsEntity - 2}f; + } public int getLevel() { @@ -134,7 +140,7 @@ public class ${name}Item extends ${data.toolType?replace("Spade", "Shovel")?repl if (equipmentSlot == EquipmentSlot.MAINHAND) { ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(super.getDefaultAttributeModifiers(equipmentSlot)); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 2}f, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 1}f, AttributeModifier.Operation.ADDITION)); builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Tool modifier", ${data.attackSpeed - 4}, AttributeModifier.Operation.ADDITION)); return builder.build(); } @@ -188,7 +194,7 @@ public class ${name}Item extends Item { if (equipmentSlot == EquipmentSlot.MAINHAND) { ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.putAll(super.getDefaultAttributeModifiers(equipmentSlot)); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 2}f, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", ${data.damageVsEntity - 1}f, AttributeModifier.Operation.ADDITION)); builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Tool modifier", ${data.attackSpeed - 4}, AttributeModifier.Operation.ADDITION)); return builder.build(); } diff --git a/plugins/mcreator-core/blockly/js/mcreator_extensions.js b/plugins/mcreator-core/blockly/js/mcreator_extensions.js index 1d0431e4fe7..0dd46260ed7 100644 --- a/plugins/mcreator-core/blockly/js/mcreator_extensions.js +++ b/plugins/mcreator-core/blockly/js/mcreator_extensions.js @@ -372,7 +372,7 @@ function simpleRepeatingInputMixin(mutatorContainer, mutatorInput, inputName, in for (let j = 0; j < fieldNames.length; j++) { // If this is a new field, then keep its initial value, otherwise assign the stored value if (fieldValues[i][j] != null) - this.getField(fieldNames[j] + i).setValue(fieldValues[i][j]); + this.getField(fieldNames[j] + i).setValue(fieldValues[i][j]); } } } diff --git a/plugins/mcreator-localization/help/default/tag/namespace.md b/plugins/mcreator-localization/help/default/tag/namespace.md deleted file mode 100644 index cfccd82ee75..00000000000 --- a/plugins/mcreator-localization/help/default/tag/namespace.md +++ /dev/null @@ -1,8 +0,0 @@ -This parameter defines the way the tag will function. - -* **forge:** is a replacement for Ore Dictionary for tags. -They can be used to give other mod creators access to their mod with your mod if you provide them with the tag name. -* **c** is a namespace used by Minecraft Fabric mods for conventional tags (standardized tag naming scheme). -* **minecraft:** is used to add custom blocks or items to vanilla tag groups. -For example, adding your mod logs to Minecraft's log group (by setting name to logs and namespace to minecraft). -* **mod:** is used for grouping mod elements in your mod for internal use. \ No newline at end of file diff --git a/plugins/mcreator-localization/help/default/tag/registry_name.md b/plugins/mcreator-localization/help/default/tag/registry_name.md deleted file mode 100644 index 5b31309d0da..00000000000 --- a/plugins/mcreator-localization/help/default/tag/registry_name.md +++ /dev/null @@ -1,5 +0,0 @@ -This is the registry name of your tag. - -The text you write in this field is the text you will have to write to be able to use your tag. - -When extending vanilla tag groups, use appropriate vanilla tag names here and use minecraft namespace. \ No newline at end of file diff --git a/plugins/mcreator-localization/help/default/tag/tag_elements.md b/plugins/mcreator-localization/help/default/tag/tag_elements.md deleted file mode 100644 index fd3c310e39d..00000000000 --- a/plugins/mcreator-localization/help/default/tag/tag_elements.md +++ /dev/null @@ -1 +0,0 @@ -Elements that belong to this tag group are listed here. \ No newline at end of file diff --git a/plugins/mcreator-localization/help/default/tag/type.md b/plugins/mcreator-localization/help/default/tag/type.md deleted file mode 100644 index 90f6bb6e43a..00000000000 --- a/plugins/mcreator-localization/help/default/tag/type.md +++ /dev/null @@ -1,8 +0,0 @@ -* **Items:** use this to group multiple items together for recipes, procedures, ... - Item tags replace the old ore dictionary system -* **Blocks:** only use the block type if you are targeting a block and not its item (_these tags can not be used in recipes_) -* **Entities:** use this tag type to group multiple entities together for a same purpose. -* **Functions:** this tag type is used for tagging functions into groups. -One such group is called "tick" from the "minecraft" namespace. -Functions tagged under the "tick" namespace will be executed each game tick. -* **Damage types:** this tag type is used to group damage types together. \ No newline at end of file diff --git a/plugins/mcreator-localization/help/ko_KR/armor/max_damage_absorbed.md b/plugins/mcreator-localization/help/ko_KR/armor/max_damage_absorbed.md index 5e96d984546..2ccd39e5a48 100644 --- a/plugins/mcreator-localization/help/ko_KR/armor/max_damage_absorbed.md +++ b/plugins/mcreator-localization/help/ko_KR/armor/max_damage_absorbed.md @@ -1,14 +1,15 @@ 이 매개 변수는 방어구 내구성을 정의하며, 실제로 다음과 같이 적용됩니다: -* 헬멧: max_damage_absorbed * 13 -* 흉갑: max_damage_absorbed * 15 -* 레깅스: max_damage_absorbed * 16 -* 부츠: max_damage_absorbed * 11 +* 투구: max_damage_absorbed * 11 +* 흉갑: max_damage_absorbed * 16 +* 레깅스: max_damage_absorbed * 15 +* 부츠: max_damage_absorbed * 13 바닐라 방어구는 다음의 인자를 사용합니다: * 가죽 방어구: 5 * 사슬 방어구: 15 +* 철 방어구: 15 * 금 방어구: 7 * 다이아몬드 방어구: 33 * 네더라이트 방어구: 37 \ No newline at end of file diff --git a/plugins/mcreator-localization/help/ko_KR/damagetype/effects.md b/plugins/mcreator-localization/help/ko_KR/damagetype/effects.md new file mode 100644 index 00000000000..c90b3453d2c --- /dev/null +++ b/plugins/mcreator-localization/help/ko_KR/damagetype/effects.md @@ -0,0 +1 @@ +이 매개변수는 이러한 유형의 피해를 받을 때 어떤 소리가 재생되어야 하는지를 결정합니다. diff --git a/plugins/mcreator-localization/help/ko_KR/damagetype/exhaustion.md b/plugins/mcreator-localization/help/ko_KR/damagetype/exhaustion.md new file mode 100644 index 00000000000..d5aebaa8791 --- /dev/null +++ b/plugins/mcreator-localization/help/ko_KR/damagetype/exhaustion.md @@ -0,0 +1,3 @@ +이 매개변수는 피해를 입힐 때 플레이어에게 적용되는 피로도를 결정합니다. + +값이 높을수록 배고픔이 더 빨리 소모됩니다. diff --git a/plugins/mcreator-localization/help/ko_KR/damagetype/item_death_message.md b/plugins/mcreator-localization/help/ko_KR/damagetype/item_death_message.md new file mode 100644 index 00000000000..05804239a67 --- /dev/null +++ b/plugins/mcreator-localization/help/ko_KR/damagetype/item_death_message.md @@ -0,0 +1,7 @@ +이 메시지는 명명된 아이템을 보유한 개체에 의해 플레이어가 사망할 때 채팅에 표시됩니다. + +메시지에 다음 토큰을 사용할 수 있습니다. + +- ``: 사망한 플레이어의 이름 +- ``: 피해를 입힌 개체의 이름 +- ``: 공격자가 들고 있는 아이템의 이름 diff --git a/plugins/mcreator-localization/help/ko_KR/damagetype/normal_death_message.md b/plugins/mcreator-localization/help/ko_KR/damagetype/normal_death_message.md new file mode 100644 index 00000000000..aafa511f61b --- /dev/null +++ b/plugins/mcreator-localization/help/ko_KR/damagetype/normal_death_message.md @@ -0,0 +1,8 @@ +이 메시지는 대부분의 상황에서 플레이어가 이러한 유형의 피해로 사망할 때 채팅에 표시됩니다. + +메시지에 다음 토큰을 사용할 수 있습니다. + +- ``: 사망한 플레이어의 이름 +- ``: 피해를 입힌 개체의 이름 + +참고: 두 번째 토큰은 항상 몹에 의해 피해가 발생하는 경우에만 사용하세요. diff --git a/plugins/mcreator-localization/help/ko_KR/damagetype/player_death_message.md b/plugins/mcreator-localization/help/ko_KR/damagetype/player_death_message.md new file mode 100644 index 00000000000..64e2ce73069 --- /dev/null +++ b/plugins/mcreator-localization/help/ko_KR/damagetype/player_death_message.md @@ -0,0 +1,6 @@ +이 메시지는 플레이어가 이러한 유형의 피해로 사망했지만 최근 다른 개체에 의해 피해를 입었을 때 채팅에 표시됩니다. + +메시지에 다음 토큰을 사용할 수 있습니다. + +- ``: 사망한 플레이어의 이름 +- ``: 피해를 입힌 개체의 이름 diff --git a/plugins/mcreator-localization/help/ko_KR/damagetype/scaling.md b/plugins/mcreator-localization/help/ko_KR/damagetype/scaling.md new file mode 100644 index 00000000000..9660adb1b7a --- /dev/null +++ b/plugins/mcreator-localization/help/ko_KR/damagetype/scaling.md @@ -0,0 +1,6 @@ +이 매개변수는 난이도에 따라 피해량이 증가해야 하는지 여부를 결정합니다. + +- '절대': 난이도는 피해량에 영향을 주지 않습니다. +- `항상`: 소스에 관계없이 난이도가 항상 피해량을 증가시킵니다. +- `when_caused_by_living_non_player`: 난이도는 생명체에 의해 발생한 경우에만 피해량이 증가합니다. + (좀비나 거미 등) diff --git a/plugins/mcreator-localization/help/ko_KR/item/enable_ranged_item.md b/plugins/mcreator-localization/help/ko_KR/item/enable_ranged_item.md index 46b97f6ecaf..10c810a866a 100644 --- a/plugins/mcreator-localization/help/ko_KR/item/enable_ranged_item.md +++ b/plugins/mcreator-localization/help/ko_KR/item/enable_ranged_item.md @@ -1 +1,7 @@ -이 매개 변수를 활성화하면 해당 아이템은 활이나 쇠뇌와 같은 발사체를 발사할 수 있는 원거리 아이템이 됩니다. \ No newline at end of file +이 매개변수를 활성화하면 해당 항목은 원거리 항목이 됩니다. 활이나 석궁과 같은 발사체를 쏠 수 있습니다. + +원거리 아이템이 작동하려면 애니메이션을 활이나 이와 유사한 것으로 설정하세요. 아이템 사용 기간은 0이 아닌 값을 사용해야 합니다. + +원거리 아이템 기능을 사용하는 경우 플레이어의 인벤토리에 필요한 아이템이 있는 경우에만 아이템이 발사됩니다. 이는 바닐라 화살을 사용할 때의 화살이거나 사용자 정의 발사체의 필수 항목 매개변수에 지정된 항목입니다. + +필수 아이템 시스템 없이 발사체를 발사하려면 오른쪽 클릭 절차 트리거와 절차를 사용하여 발사하세요. \ No newline at end of file diff --git a/plugins/mcreator-localization/help/ko_KR/tag/type.md b/plugins/mcreator-localization/help/ko_KR/tag/type.md index 9bd2379a272..37fc7cdedb8 100644 --- a/plugins/mcreator-localization/help/ko_KR/tag/type.md +++ b/plugins/mcreator-localization/help/ko_KR/tag/type.md @@ -1,4 +1,5 @@ * **Items:** 레시피, 절차 등을 위해 여러 아이템을 그룹화하는 데 사용합니다. 아이템 태그는 기존 Ore Dictionary 시스템을 대체합니다. * **Blocks:** 아이템이 아닌 블록을 대상으로 하는 경우에만 block 유형을 사용하십시오. (_이러한 태그는 레시피에 사용할 수 없습니다._) * **Entities:** 동일한 목적으로 여러 객체를 그룹화하려면 이 태그 유형을 사용합니다. -* **Functions:** 이 태그 유형은 함수를 그룹으로 태그 지정하는 데 사용됩니다. 이러한 그룹 중 하나는 "minecraft" 네임스페이스에서 "tick" 으로 불립니다. "tick" 네임스페이스 아래에 태그된 함수는 각 게임 틱마다 실행됩니다. \ No newline at end of file +* **함수:** 이 태그 유형은 함수를 그룹으로 태그하는 데 사용됩니다. 이러한 그룹 중 하나는 "minecraft" 네임스페이스에서 "tick"이라고 합니다. "tick" 네임스페이스 아래에 태그된 함수는 각 게임 틱마다 실행됩니다. +* **피해 유형:** 이 태그 유형은 손상 유형을 그룹화하는 데 사용됩니다. \ No newline at end of file diff --git a/plugins/mcreator-localization/help/zh_CN/villagerprofession/profession_block.md b/plugins/mcreator-localization/help/zh_CN/villagerprofession/profession_block.md index fa16b4c5cb4..7a5b303c96c 100644 --- a/plugins/mcreator-localization/help/zh_CN/villagerprofession/profession_block.md +++ b/plugins/mcreator-localization/help/zh_CN/villagerprofession/profession_block.md @@ -1,3 +1,3 @@ 该方块用于供给拥有该职业的村民工作 -如果有两个模组同时定义相同的工作站点方块,或者另外一个模组通过 POI 将该工作站点方块用于其他功能,该职业将不起作用。因此,建议仔细检查该村民的工作站点方块是否有被其它模组所定义 \ No newline at end of file +如果有两个模组同时定义相同的工作站点方块,或者另外一个模组通过兴趣点将该工作站点方块用于其他功能,该职业将不起作用。因此,建议仔细检查该村民的工作站点方块是否有被其它模组所定义 \ No newline at end of file diff --git a/plugins/mcreator-localization/lang/texts.properties b/plugins/mcreator-localization/lang/texts.properties index 82ab49849d9..e7b477c6bc4 100644 --- a/plugins/mcreator-localization/lang/texts.properties +++ b/plugins/mcreator-localization/lang/texts.properties @@ -593,6 +593,19 @@ dialog.variables.variable_name=Variable name: dialog.variables.variable_type=Variable type: dialog.variables.variable_scope=Variable scope: dialog.variables.new_title=New variable +dialog.tags.tag=Tag +dialog.tags.tag_type=Tag type: +dialog.tags.tag_namespace=Tag namespace: +dialog.tags.tag_name=Tag name: +dialog.tags.new_title=Add new tag +dialog.tags.tag_exists=Tag with this type, name, and namespace already exists! +dialog.itemlistfield.deleteall=Are you sure you want to delete all entries in the list? +dialog.itemlistfield.deleteall.title=Delete all entries +dialog.itemlistfield.deletemanaged=One or more of the selected entries were added automatically. Generally, you should not delete these.
\ + If you do, they will be re-added when regenerating code or saving mod element that added them.

\ + Are you sure you want to delete the selected entries, including those that were added automatically?

\ + Clicking "No" will still delete selected entries that were not added automatically (if any are selected). +dialog.itemlistfield.deletemanaged.title=Deleting managed entry workspace.loading=Loading the workspace... workspace.elements.list.locked=Locked workspace.elements.folders.add_tooltip=Add new folder into the current folder @@ -637,6 +650,7 @@ workspace.elements.list.ascending=Ascending workspace.category.mod_elements=Mod elements workspace.category.resources=Resources workspace.category.variables=Variables +workspace.category.tags=Element tags workspace.category.localization=Localization workspace.elements.add.tooltip=Add new mod element workspace.elements.edit.tooltip=Edit selected mod element @@ -652,10 +666,6 @@ workspace.elements.list.edit.duplicate=Duplicate mod element... workspace.elements.list.edit.code=Open mod element in code editor workspace.elements.list.edit.lock=Lock/unlock mod element workspace.elements.list.edit.id=Edit registry names... -workspace.elements.list.edit.usages.tags=Selected elements list contains tag type mod elements.

\ - Tags with same registry names may also be defined by other mods and could be weakly referenced.
\ - Therefore usage search for these elements is not possible. -workspace.elements.list.edit.usages.tags.title=Tag usages workspace.elements.list.edit.add.folder=Add new folder... workspace.elements.list.edit.rename.folder=Rename selected folder... workspace.elements.confirm_delete_msg_suffix=Mod elements in deleted folder and sub-folders will be moved to the parent folder. @@ -1607,7 +1617,6 @@ modelement.projectile=Projectile modelement.recipe=Recipe modelement.structure=Structure modelement.tab=Creative tab -modelement.tag=Tag modelement.tool=Tool modelement.villagerprofession=Villager profession modelement.villagertrade=Villager trade @@ -1645,7 +1654,6 @@ modelement.projectile.description=Projectile is an entity that can be shot in an modelement.recipe.description=Recipe is a defined set of blocks and items that gives you new block or item. modelement.structure.description=Structure is a smaller set of blocks that generates based on defined conditions. modelement.tab.description=Creative tab is a set of items and blocks that can be seen in creative inventory. -modelement.tag.description=Tags are used to group elements using different tag types. modelement.tool.description=Tool is an item that helps you dig or attack faster and better than using hand. modelement.villagerprofession.description=Villager profession defines a version of villager with custom skin and trades. modelement.villagertrade.description=Villager trade adds new trades to villager professions. @@ -1745,8 +1753,8 @@ preferences.ide.lineNumbers=Show line numbers in editor preferences.ide.lineNumbers.description= preferences.ide.errorInfoEnable=Show info strip in the editor preferences.ide.errorInfoEnable.description=Shows lines of errors, warnings and current search results -preferences.gradle.compileOnSave=Build the workspace when a mod element is saved -preferences.gradle.compileOnSave.description=Unless you know why you need this, keep this selected or you might not be notified of errors in your mod. +preferences.gradle.buildOnSave=Update base code and build the workspace when a mod element is saved +preferences.gradle.buildOnSave.description=Enable this to be notified of errors in your mod element code as soon as you save it. Slows down mod element saving. preferences.gradle.passLangToMinecraft=Pass language setting to test Minecraft client preferences.gradle.passLangToMinecraft.description=When enabled, Minecraft''s interface language/localization setting will be set to MCreator''s language on each run. preferences.gradle.Xms=Initial memory @@ -1981,10 +1989,10 @@ elementgui.common.properties_dropping=Dropping properties elementgui.common.event_right_clicked_air=When right-clicked (entity pos.) elementgui.common.event_right_clicked_block=When right-clicked on block (block pos.) elementgui.common.event_on_neighbour_block_changes=When neighbour block changes -elementgui.common.event_on_update_tick=Update tick +elementgui.common.event_on_update_tick=On tick update elementgui.common.event_on_crafted=When item is crafted/smelted elementgui.common.event_on_block_placed_by=When block is placed by -elementgui.common.event_on_random_update=Client display random tick +elementgui.common.event_on_random_update=On random client display tick elementgui.common.event_on_block_hit_by_projectile=On block hit by projectile elementgui.common.event_is_bonemeal_target=Can bone meal be used on this block elementgui.common.event_bonemeal_success_condition=Bone meal success condition @@ -2391,7 +2399,7 @@ elementgui.item.container_item_damage=Damage item instead on crafting
< elementgui.item.number_of_uses=Item use count / durability (leave 0 to disable damage):
If you want to make a tool, create a tool instead elementgui.item.is_immune_to_fire=Is item immune to fire? elementgui.item.recipe_remainder=Recipe remainder
Make sure to enable "stay in crafting grid". Leave empty to use current item. -elementgui.item.damage_vs_entity=Damage vs mob/animal (check to enable):
Melee damage +elementgui.item.damage_vs_entity=Attack damage (check to enable): elementgui.item.glowing_effect=Has item glowing effect? elementgui.item.item_3d_model=Item 3D model elementgui.item.bind_gui=Bind this item to GUI:
Set to <NONE> to disable inventory @@ -2733,10 +2741,6 @@ elementgui.tab.icon=Tab icon: elementgui.tab.search_bar=Show search bar: elementgui.tab.add_stuff_tip=To add blocks/items to this tab, make new element and set this tab as inventory tab. elementgui.tab.error_needs_name=Creative tab needs a name -elementgui.tag.registry_name=Tag registry name: -elementgui.tag.namespace=Tag namespace:
Use minecraft namespace to add to tags, use forge for tags shared with other mods -elementgui.tag.type=Tag type: -elementgui.tag.elements=Elements under this tag: elementgui.tool.event_block_destroyed=When block destroyed with tool elementgui.tool.event_entity_hit_with=When living entity is hit with tool elementgui.tool.event_in_inventory_tick=When tool in inventory tick @@ -2749,7 +2753,7 @@ elementgui.tool.type=Type: elementgui.tool.harvest_level=Harvest level: elementgui.tool.efficiency=Efficiency: elementgui.tool.attack_speed=Attack speed: -elementgui.tool.damage_vs_entity=Damage vs mob/animal (melee damage): +elementgui.tool.damage_vs_entity=Attack damage: elementgui.tool.usage_count=Number of uses / durability: elementgui.tool.blocks_affected=Blocks affected: elementgui.tool.is_immune_to_fire=Is tool immune to fire? @@ -2825,6 +2829,14 @@ workspace.screenshots.export_selected=Export selected... workspace.screenshots.action_complete=Action complete workspace.screenshots.use_background_message=Selected screenshots will be used as potential background on the next launch. workspace.screenshots.use_as_background=Use selected as MCreator background... +workspace.tags.add_new=Add new tag +workspace.tags.add_common=Add common tags +workspace.tags.tag_type=Tag type +workspace.tags.tag_namespace=Tag namespace +workspace.tags.tag_name=Tag name +workspace.tags.tag_elements=Tag elements +workspace.tags.remove_tags_managed_error=This tag can not be removed because it contains entries that were added automatically +workspace.tags.remove_tags_confirmation=Are you sure that you want to remove the selected tag? workspace.variables.variable_name=Variable name workspace.variables.variable_type=Variable type workspace.variables.variable_scope=Variable scope @@ -3033,6 +3045,7 @@ dialog.generator_selector.coverage.sounds=Sounds dialog.generator_selector.coverage.soundcategories=Sound categories dialog.generator_selector.coverage.structures=Structures dialog.generator_selector.coverage.translations=Translations +dialog.generator_selector.coverage.tags=Tags dialog.generator_selector.coverage.variables=Variables dialog.generator_selector.coverage.java_models=Java 3D models dialog.generator_selector.coverage.json_models=JSON 3D models @@ -3119,9 +3132,7 @@ dialog.selector.structures.message=Please select a structure: dialog.selector.title=Data list entry selection dialog.tools.inject_tags.title=Add common tags to the workspace dialog.tools.inject_tags.confirm=Add tags -dialog.tools.inject_tags.text_top=Select the tags to add to the workspace and click "Add tags".
\ - If you already manually (not using this tool) added any of these tag types, don''t check them here to avoid conflicts. -action.pack_tools.tag=Add common tags to workspace... +dialog.tools.inject_tags.text_top=Select the tags to add to the workspace and click "Add tags". dialog.tools.inject_tags.tag.blocks.minecraft.dirt=Trees and foliage can grow on these blocks. Add blocks you use for (under)ground of your biomes to this tag group. dialog.tools.inject_tags.tag.blocks.minecraft.logs=If a block in this tag is around a leaves block, the leaves will not decay. dialog.tools.inject_tags.tag.blocks.minecraft.climbable=This tag is used to determine what blocks the player can climb. Also used by entity AI pathfinding. @@ -3484,4 +3495,7 @@ notification.plugin_updates.msg=There are some plugin updates available notification.news.title=News from the website: {0} notification.news.read_more=Read more about this notification.news.hide=Hide this notification -simple_list_entry.remove=Remove this entry \ No newline at end of file +simple_list_entry.remove=Remove this entry +mod_element_code_viewer.no_files=No files to display +mod_element_code_viewer.no_files.desc=
No files specific to this mod element are generated.
\ + All mod element code is part of base workspace files that this viewer does not display. \ No newline at end of file diff --git a/plugins/mcreator-localization/lang/texts_ar_SA.properties b/plugins/mcreator-localization/lang/texts_ar_SA.properties index 9fecb2465de..7937bd9a504 100644 --- a/plugins/mcreator-localization/lang/texts_ar_SA.properties +++ b/plugins/mcreator-localization/lang/texts_ar_SA.properties @@ -938,8 +938,6 @@ blockly.block.call_procedure.at=\ عند blockly.block.aitasks_container=قائمة مهمة/أهداف AI blockly.block.aitasks_container.tip=المهام الأعلى في القائمة لها أولوية أعلى blockly.block.aitasks_container.tooltip=هذه هي نقطة الانطلاق في قائمة مهام AI. -blockly.block.advancement_trigger=منح هذا الترقية للاعب -blockly.block.advancement_trigger.tooltip=قم بتوصيل البلوك تشغيل واحدة تشغل هذا الترقية إلى هذه البلوك blockly.block.set_var=تَعيين blockly.block.set_to=إلى\: blockly.block.get_var=احصل diff --git a/plugins/mcreator-localization/lang/texts_cs_CZ.properties b/plugins/mcreator-localization/lang/texts_cs_CZ.properties index d718be12835..839b4937a08 100644 --- a/plugins/mcreator-localization/lang/texts_cs_CZ.properties +++ b/plugins/mcreator-localization/lang/texts_cs_CZ.properties @@ -1072,8 +1072,6 @@ blockly.block.rule_test_blockstate_match=Stav bloku je %1 blockly.block.aitasks_container=Seznam úloh / cílů AI blockly.block.aitasks_container.tip=Úkoly výš v seznamu mají vyšší prioritu blockly.block.aitasks_container.tooltip=Toto je výchozí bod seznamu úkolů AI. -blockly.block.advancement_trigger=Udělit tento pokrok hráči -blockly.block.advancement_trigger.tooltip=Připojte jeden spouštěcí blok, který spustí tento postup k tomuto bloku blockly.block.set_var=Nastavit blockly.block.set_to=na\: blockly.block.get_var=Získat @@ -1734,7 +1732,6 @@ elementgui.item.container_item_damage=Při výrobě předmět pouze poško elementgui.item.number_of_uses=Počet použití předmětu / odolnost (ponechte 0 pro vypnutí poškození)\:
Pokud chcete vytvořit nástroj, vytvořte místo toho nástroj elementgui.item.is_immune_to_fire=Je předmět odolný vůči ohni? elementgui.item.recipe_remainder=zbyde v receptu
Ujisti se, že chceš povolit "zůstat ve výrobní mřížce". Nechej prázdné pro použití aktuální položky. -elementgui.item.damage_vs_entity=Poškození moba/zvířete (zaškrtněte pro povolení)\:
Poškození na blízko elementgui.item.item_3d_model=3D model předmětu elementgui.item.bind_gui=Spojte tuto položku s GUI\:
Nastavte <NONE> pro vypnutí inventáře elementgui.item.inventory_size=Velikost inventáře (počet slotů)\:
Nastavte tuto hodnotu na největší ID slotu v GUI + 1 @@ -1953,7 +1950,6 @@ elementgui.tool.type=Typ\: elementgui.tool.harvest_level=Úroveň sklizně\: elementgui.tool.efficiency=Účinnost\: elementgui.tool.attack_speed=Rychlost útoku\: -elementgui.tool.damage_vs_entity=Poškození proti mobu/zvířeti (poškození na blízko)\: elementgui.tool.usage_count=Počet použití / odolnost\: elementgui.tool.blocks_affected=Dotčené bloky\: elementgui.tool.is_immune_to_fire=Je předmět odolný vůči ohni? @@ -2072,8 +2068,6 @@ dialog.workspace_settings.section.external_apis=Externí podpora API dialog.workspace_settings.section.external_apis.tooltip=Zaškrtněte políčka pro přidání podpory a závislostí pro podporované externí API
VAROVÁNÍ\: Pokud váš mód používá externí API, nebude fungovat bez nich, jakmile jej exportujete dialog.workspace_settings.explore_plugins=Prozkoumat rozšíření dialog.workspace_settings.plugins_tip=Hledáte více API? Prozkoumejte rožšíření pro MCreator. -dialog.workspace_settings.version_check=Kontrola verze Forge -dialog.workspace_settings.section.version_check=Zakázat kontrolu verze Minecraft Forge?
Pokud chcete zajistit, aby uživatelé používali správnou verzi Minecraft Forge,
zrušte zaškrtnutí a povolte kontrolu verze Minecraft Forge. dialog.workspace_settings.section.advanced=Pokročilá nastavení dialog.workspace_settings.server_side_only=Je tato modifikace serverová? dialog.workspace_settings.lock_base_files_label=Zamknout základní soubory módu?
Používejte pouze v nutných případech a pokud rozumíte Javě diff --git a/plugins/mcreator-localization/lang/texts_de_DE.properties b/plugins/mcreator-localization/lang/texts_de_DE.properties index 5cc8fd60bdf..429b844a98c 100644 --- a/plugins/mcreator-localization/lang/texts_de_DE.properties +++ b/plugins/mcreator-localization/lang/texts_de_DE.properties @@ -1362,8 +1362,6 @@ blockly.block.aitasks_container=KI Aufgaben-/Zielliste blockly.block.aitasks_container.tip=Aufgaben weiter oben auf der Liste haben eine höhere Priorität blockly.block.aitasks_container.tooltip=Hier ist der Startpunkt der KI-Aufgabenliste. blockly.block.cmdargs_start=Befehlseintragspunkt -blockly.block.advancement_trigger=Gebe diese Errungenschaft an den Spieler -blockly.block.advancement_trigger.tooltip=Verbinde einen Auslöser-Block, der diese Errungenschaft auslöst, mit diesem Block blockly.block.feature_container=Konfigurierbare Funktionen blockly.block.feature_container.tooltip=Dies ist der Typ der zu definierenden Funktion blockly.block.feature_container.with_placement=mit Platzierung @@ -2178,7 +2176,6 @@ elementgui.item.container_item_damage=Item schaden statt zu craften
Gebrauchsanzahl / Haltbarkeit (0 lassen, um Schaden zu deaktivieren)\:
Wenn du ein Werkzeug erstellen möchtest, erstelle stattdessen ein Werkzeug elementgui.item.is_immune_to_fire=Ist Gegenstand immun gegen Feuer? elementgui.item.recipe_remainder=Rezeptrest
Stelle sicher, dass "Im Craftinggitter bleiben" aktiviert ist. Leer lassen, um geradiges Item zu nutzen. -elementgui.item.damage_vs_entity=Schaden gegen Mob/Tier (Anhaken zum Aktivieren)\:
Nahkampfschaden elementgui.item.item_3d_model=Item 3D-Modell elementgui.item.bind_gui=Binde dieses Item an GUI\:
Setze auf <NONE> , um das Inventar zu deaktivieren elementgui.item.inventory_size=Größe des Inventars (Slot Count)\:
Setze diesen Wert auf die größte Slot-ID in der GUI + 1 @@ -2479,7 +2476,6 @@ elementgui.tool.type=Typ\: elementgui.tool.harvest_level=Ernte-Level\: elementgui.tool.efficiency=Effizienz\: elementgui.tool.attack_speed=Angriffsgeschwindigkeit\: -elementgui.tool.damage_vs_entity=Schaden gegen Mob/Tier (Nahkampfschaden)\: elementgui.tool.usage_count=Anzahl der Verwendungen / Haltbarkeit\: elementgui.tool.blocks_affected=Betroffene Blöcke\: elementgui.tool.is_immune_to_fire=Ist Werkzeug immung gegen Feuer? @@ -2643,8 +2639,6 @@ dialog.workspace_settings.section.external_apis=Externe API-Unterstützung dialog.workspace_settings.section.external_apis.tooltip=Kontrollkästchen, um Unterstützung und Abhängigkeiten für die unterstützten externen APIs hinzuzufügen
WARNUNG\: Wenn deine Modifikation externe APIs verwendet, wird es nicht ohne diese funktionieren, sobald du die Modifikation exportiert hast dialog.workspace_settings.explore_plugins=Plugins entdecken dialog.workspace_settings.plugins_tip=Sie suchen mehr APIs? Überprüfen Sie MCreator Plugins. -dialog.workspace_settings.version_check=Forge-Version überprüfen -dialog.workspace_settings.section.version_check=Deaktiviere die Überprüfung der Minecraft Forge Version?
Wenn Sie sicherstellen wollen, dass Benutzer die richtige Minecraft Forge Version verwenden,
deaktivieren Sie dies und aktivieren Sie die Überprüfung der Minecraft Forge Version. dialog.workspace_settings.section.advanced=Erweiterte Einstellungen dialog.workspace_settings.server_side_only=Is this mod server-side only? dialog.workspace_settings.lock_base_files_label=Basismod-Dateien sperren?
NUR verwenden wenn benötigt und sie Java verstehen diff --git a/plugins/mcreator-localization/lang/texts_es_AR.properties b/plugins/mcreator-localization/lang/texts_es_AR.properties index 868c20ee1de..2d6e3f834fe 100644 --- a/plugins/mcreator-localization/lang/texts_es_AR.properties +++ b/plugins/mcreator-localization/lang/texts_es_AR.properties @@ -1401,8 +1401,6 @@ blockly.block.aitasks_container=Tareas de la AI / Lista de objetivos blockly.block.aitasks_container.tip=Las tareas más altas en la lista tienen una mayor prioridad blockly.block.aitasks_container.tooltip=Acá inicia la lista de tareas de AI. blockly.block.cmdargs_start=Punto de entrada del comando -blockly.block.advancement_trigger=Conceder este logro al jugador -blockly.block.advancement_trigger.tooltip=Conectar un bloque activador que active este logro a este bloque blockly.block.feature_container=Característica configurada blockly.block.feature_container.tooltip=Este es el tipo de característica a definir blockly.block.feature_container.with_placement=con posición @@ -2210,7 +2208,6 @@ elementgui.item.container_item_damage=Dañar al usarse en una receta
Durabilidad del objeto (Deje 0 para que no tenga durabilidad)\:
Si quiere crear una herramienta, haga un elemento de herramienta elementgui.item.is_immune_to_fire=¿Es inmune al fuego? elementgui.item.recipe_remainder=Receta que deja
Asegúrese de maracar "¿No se gasta al usarse en una receta?" y deje en blanco para usar el artículo actual. -elementgui.item.damage_vs_entity=Daño que infringe a mobs\:
Daño cuerpo a cuerpo elementgui.item.glowing_effect=¿Ítem tiene efecto de brillo? elementgui.item.item_3d_model=Modelo 3D del objeto elementgui.item.bind_gui=Enlace este objeto a la GUI\:
Establecer a <NONE> para desactivar el inventario @@ -2531,7 +2528,6 @@ elementgui.tool.type=Tipo\: elementgui.tool.harvest_level=Nivel que rompe\: elementgui.tool.efficiency=Eficiencia\: elementgui.tool.attack_speed=Velocidad de ataque\: -elementgui.tool.damage_vs_entity=Daño a entidades (Daño cuerpo a cuerpo)\: elementgui.tool.usage_count=Número de usos o durabilidad\: elementgui.tool.blocks_affected=Bloques afectados\: elementgui.tool.is_immune_to_fire=¿Es inmune al fuego? @@ -2688,8 +2684,6 @@ dialog.workspace_settings.section.external_apis=Soporte de API externa dialog.workspace_settings.section.external_apis.tooltip=Marque las casillas para añadir soporte y dependencias para las APIs externas soportadas
ADVERTENCIA\: Si su mod usa APIs externas, no funcionará sin ellas una vez las exporte dialog.workspace_settings.explore_plugins=Explorar plugins dialog.workspace_settings.plugins_tip=¿Busca más APIs? Revise los plugins de MCreator. -dialog.workspace_settings.version_check=Comprobar versión de Forge -dialog.workspace_settings.section.version_check=¿Desactivar la comprobación de la versión de Minecraft Forge?
Si desea asegurarse de que los usuarios usen la versión correcta de Minecraft Forge,
desmarque esto y active la comprobación de versiones de Minecraft Forge. dialog.workspace_settings.section.advanced=Opciones avanzadas dialog.workspace_settings.server_side_only=¿Es este mod sólo para servidores? dialog.workspace_settings.lock_base_files_label=¿Bloquear archivos base del mod?
Usar sólo si es necesario, y si entiende Java diff --git a/plugins/mcreator-localization/lang/texts_es_CL.properties b/plugins/mcreator-localization/lang/texts_es_CL.properties index 01c412f9123..beeffa7672f 100644 --- a/plugins/mcreator-localization/lang/texts_es_CL.properties +++ b/plugins/mcreator-localization/lang/texts_es_CL.properties @@ -1401,8 +1401,6 @@ blockly.block.aitasks_container=Tareas de la AI / Lista de objetivos blockly.block.aitasks_container.tip=Las tareas más altas en la lista tienen una mayor prioridad blockly.block.aitasks_container.tooltip=Acá inicia la lista de tareas de AI. blockly.block.cmdargs_start=Punto de entrada del comando -blockly.block.advancement_trigger=Conceder este logro al jugador -blockly.block.advancement_trigger.tooltip=Conectar un bloque activador que active este logro a este bloque blockly.block.feature_container=Característica configurada blockly.block.feature_container.tooltip=Este es el tipo de característica a definir blockly.block.feature_container.with_placement=con posición @@ -2210,7 +2208,6 @@ elementgui.item.container_item_damage=Dañar al usarse en una receta
Durabilidad del objeto (Deje 0 para que no tenga durabilidad)\:
Si quiere crear una herramienta, haga un elemento de herramienta elementgui.item.is_immune_to_fire=¿Es inmune al fuego? elementgui.item.recipe_remainder=Receta que deja
Asegúrese de maracar "¿No se gasta al usarse en una receta?" y deje en blanco para usar el artículo actual. -elementgui.item.damage_vs_entity=Daño que infringe a mobs\:
Daño cuerpo a cuerpo elementgui.item.glowing_effect=¿Ítem tiene efecto de brillo? elementgui.item.item_3d_model=Modelo 3D del objeto elementgui.item.bind_gui=Enlace este objeto a la GUI\:
Establecer a <NONE> para desactivar el inventario @@ -2531,7 +2528,6 @@ elementgui.tool.type=Tipo\: elementgui.tool.harvest_level=Nivel que rompe\: elementgui.tool.efficiency=Eficiencia\: elementgui.tool.attack_speed=Velocidad de ataque\: -elementgui.tool.damage_vs_entity=Daño a entidades (Daño cuerpo a cuerpo)\: elementgui.tool.usage_count=Número de usos o durabilidad\: elementgui.tool.blocks_affected=Bloques afectados\: elementgui.tool.is_immune_to_fire=¿Es inmune al fuego? @@ -2688,8 +2684,6 @@ dialog.workspace_settings.section.external_apis=Soporte de API externa dialog.workspace_settings.section.external_apis.tooltip=Marque las casillas para añadir soporte y dependencias para las APIs externas soportadas
ADVERTENCIA\: Si su mod usa APIs externas, no funcionará sin ellas una vez las exporte dialog.workspace_settings.explore_plugins=Explorar plugins dialog.workspace_settings.plugins_tip=¿Busca más APIs? Revise los plugins de MCreator. -dialog.workspace_settings.version_check=Comprobar versión de Forge -dialog.workspace_settings.section.version_check=¿Desactivar la comprobación de la versión de Minecraft Forge?
Si desea asegurarse de que los usuarios usen la versión correcta de Minecraft Forge,
desmarque esto y active la comprobación de versiones de Minecraft Forge. dialog.workspace_settings.section.advanced=Opciones avanzadas dialog.workspace_settings.server_side_only=¿Es este mod sólo para servidores? dialog.workspace_settings.lock_base_files_label=¿Bloquear archivos base del mod?
Usar sólo si es necesario, y si entiende Java diff --git a/plugins/mcreator-localization/lang/texts_es_ES.properties b/plugins/mcreator-localization/lang/texts_es_ES.properties index 6531f7b9250..6a5f77a4612 100644 --- a/plugins/mcreator-localization/lang/texts_es_ES.properties +++ b/plugins/mcreator-localization/lang/texts_es_ES.properties @@ -1401,8 +1401,6 @@ blockly.block.aitasks_container=Tareas de la AI / Lista de objetivos blockly.block.aitasks_container.tip=Las tareas más altas en la lista tienen una mayor prioridad blockly.block.aitasks_container.tooltip=Acá inicia la lista de tareas de AI. blockly.block.cmdargs_start=Punto de entrada del comando -blockly.block.advancement_trigger=Conceder este logro al jugador -blockly.block.advancement_trigger.tooltip=Conectar un bloque activador que active este logro a este bloque blockly.block.feature_container=Característica configurada blockly.block.feature_container.tooltip=Este es el tipo de característica a definir blockly.block.feature_container.with_placement=con posición @@ -2210,7 +2208,6 @@ elementgui.item.container_item_damage=Dañar al usarse en una receta
Durabilidad del objeto (Deje 0 para que no tenga durabilidad)\:
Si quiere crear una herramienta, haga un elemento de herramienta elementgui.item.is_immune_to_fire=¿Es inmune al fuego? elementgui.item.recipe_remainder=Receta que deja
Asegúrese de maracar "¿No se gasta al usarse en una receta?" y deje en blanco para usar el artículo actual. -elementgui.item.damage_vs_entity=Daño que infringe a mobs\:
Daño cuerpo a cuerpo elementgui.item.glowing_effect=¿Ítem tiene efecto de brillo? elementgui.item.item_3d_model=Modelo 3D del objeto elementgui.item.bind_gui=Enlazar este elemento a GUI\:
Establecer a <NONE> para desactivar el inventario @@ -2531,7 +2528,6 @@ elementgui.tool.type=Tipo\: elementgui.tool.harvest_level=Nivel que rompe\: elementgui.tool.efficiency=Eficiencia\: elementgui.tool.attack_speed=Velocidad de ataque\: -elementgui.tool.damage_vs_entity=Daño a entidades (Daño cuerpo a cuerpo)\: elementgui.tool.usage_count=Número de usos o durabilidad\: elementgui.tool.blocks_affected=Bloques afectados\: elementgui.tool.is_immune_to_fire=¿Es inmune al fuego? @@ -2688,8 +2684,6 @@ dialog.workspace_settings.section.external_apis=Soporte de API externa dialog.workspace_settings.section.external_apis.tooltip=Marque las casillas para añadir soporte de APIs externas
ADVERTENCIA\: Si su mod funciona con APIs externas, no funcionará sin ellas una vez exportado dialog.workspace_settings.explore_plugins=Explorar plugins dialog.workspace_settings.plugins_tip=¿Busca más APIs? Revise los plugins de MCreator. -dialog.workspace_settings.version_check=Comprobar versión de Forge -dialog.workspace_settings.section.version_check=¿Desactivar la comprobación de la versión de Minecraft Forge?
Si desea asegurarse de que los usuarios usen la versión correcta de Minecraft Forge,
desmarque esto y active la comprobación de versiones de Minecraft Forge. dialog.workspace_settings.section.advanced=Opciones avanzadas dialog.workspace_settings.server_side_only=¿Es este mod sólo para servidores? dialog.workspace_settings.lock_base_files_label=¿Bloquear archivos base del mod?
Usar sólo si es necesario, y si entiende Java diff --git a/plugins/mcreator-localization/lang/texts_fr_FR.properties b/plugins/mcreator-localization/lang/texts_fr_FR.properties index 030a234c24c..64066cc0cfb 100644 --- a/plugins/mcreator-localization/lang/texts_fr_FR.properties +++ b/plugins/mcreator-localization/lang/texts_fr_FR.properties @@ -701,6 +701,8 @@ trigger.entity_travels_to_dimension=L''''entité voyage vers une dimension trigger.entity_uses_totem=L'entité utilise un totem d'immortalité trigger.explosion_occurs=Une explosion se produit trigger.farmland_trampled=La terre labourée est piétinée +trigger.gem_dropped=L'item est lâché +trigger.gem_expired=L'item lâché expire trigger.item_crafted=Un item est fabriqué trigger.item_destroyed=Un item est détruit trigger.item_smelted=Un item est cuit @@ -764,6 +766,7 @@ blockly.category.villagetasks=Tâches liées au village blockly.category.blocks=Déclencheurs liés aux blocs blockly.category.items=Déclencheurs liés aux items blockly.category.utility=Déclencheurs utilitaires +blockly.category.utility.description=Ces déclencheurs ne doivent pas être utilisés en combinaison avec d'autres. blockly.category.world=Déclencheurs liés au monde blockly.category.minecraft_components=Composants de Minecraft blockly.category.custom_variables=Variables personnalisées @@ -784,6 +787,8 @@ blockly.category.heightplacements=Hauteur des placements blockly.category.orefeatures=Caractéristiques de minerai blockly.category.placements=Placements communs blockly.category.treefeatures=Caractéristiques d'arbres +blockly.category.trees=Arbres +blockly.category.treedecorators=Racines et décoration blockly.category.arg_types=Paramètres blockly.category.actions=Actions blockly.block.action_result_type=Résultat d'actions de type %1 @@ -1132,6 +1137,7 @@ blockly.block.math_random_number_between=Nombre aléatoire entre min\: %1 et max blockly.block.mcitem_to_block=Convertir %2 %1 en %3 ou AIR si la conversion échoue blockly.block.move_entity=Définir la localisation de %4 à x\: %1 y\: %2 z\: %3 blockly.block.place_schematic=Placer la structure NBT %6 %7 à x \: %1 y \: %2 z \: %3 avec rotation \: %4 miroir \: %5 %8 +blockly.block.play_sound=Jouez le son %6 à l'emplacement x \: %1 y \: %2 z \: %3 niveau \: %4 pitch %5 catégorie \: %7 blockly.block.projectile_shoot_from_entity=Tirer %1 de l'entité \: %2 avec vitesse \: %3 inexactitude \: %4 %5 blockly.block.projectile_shoot_from_pos=Tirer %1 de x \: %2 y \: %3 z \: %4 avec la direction dx \: %5 dy \: %6 dz \: %7 vitesse \: %8 inexactitude \: %9 %10 blockly.block.projectiles_arrow=Flèche de type %1 avec des dégâts \: %2 recul\: %3 perforation \: %4 tireur\: %5 tir \: %6 particules \: %7 type de ramassage\: %8 @@ -1408,8 +1414,7 @@ blockly.block.aitasks_container=Tâches IA / liste d'objectifs blockly.block.aitasks_container.tip=Tâches les plus hautes dans la liste ont une priorité plus élevée blockly.block.aitasks_container.tooltip=Ceci est le point de départ de la liste des tâches AI. blockly.block.cmdargs_start=Point d'entrée de la commande -blockly.block.advancement_trigger=Accorde cet avancement au joueur -blockly.block.advancement_trigger.tooltip=Connectez un bloc déclencheur qui déclenche cette avancement à ce bloc +blockly.block.advancement_trigger=Accorder si tous les critères ci-dessous sont remplis blockly.block.feature_container=Caractéristique configurée blockly.block.feature_container.tooltip=C'est le type de caractéristique à définir blockly.block.feature_container.with_placement=avec emplacement @@ -1498,6 +1503,7 @@ blockly.extension.feature_delta.rimSize=La taille de la jante doit être compris blockly.extension.feature_replace_sphere.radius=Le rayon doit être compris entre 0 et 12 blockly.extension.feature_block_column_simple.height=La hauteur doit être d'au moins 0 blockly.extension.feature_tree_pine.foliage_height=La hauteur du feuillage doit être comprise entre 0 et 24 +blockly.extension.feature_tree_spruce.radius=Le rayon de feuillage doit être compris entre 0 et 16 blockly.extension.feature_tree_spruce.trunk_height=La hauteur du tronc exposé doit être entre 0 et 24 action.workspace.export_mod=Exporter le mod pour distribution... action.workspace.export_mod_deobf=Exporter le mod désobfusqué... @@ -1507,6 +1513,7 @@ dialog.workspace.export_deobf.title=Exporter le mod désobfusqué dialog.workspace.export_deobf.message=Les mods désobfusqués ne fonctionneront pas avec les installations standard de Minecraft \!
Utilisez cette option que si vous avez une bonne raison de l''''utiliser.

Voulez-vous vraiment l''''utiliser ? dialog.workspace.export.option.donate_and_export=Faire un don et exporter le mod dialog.workspace.export.option.just_export=Exportez le mod sans faire de don +dialog.workspace.export.error.message=Votre espace de travail n'a pas pu être exporté.

Aucun fichier . jar n'a été généré. dialog.workspace.export.error.title=L'exportation a échoué action.workspace.import_from_zip=Importer un projet à partir d'un ZIP partageable... action.workspace.new=Nouveau projet... @@ -1776,6 +1783,8 @@ dialog.workspace.is_not_valid_message=Échec de l'ouverture de l'espa dialog.workspace.is_not_valid_title=Échec de l''''ouverture de l''''espace de travail dialog.workspace.unknown_generator_message=Cet espace de travail utilise le type de générateur non pris en charge \: {0}
Sélectionnez l''un des générateurs pris en charge pour l''espace de travail. dialog.workspace.unknown_generator_title=Générateur non supporté +dialog.workspace.missing_plugins_message=Cette espace de travail semble avoir besoin de plugins qui ne sont pas installé ou ne sont pas supporté.
Assurez-vous d''avoir tous les plugins nécessaire installés et qu''ils supportent le
générateur selectionée and la version de Mcreator.

Les plugins suivants semblent être manquant\:

{0} +dialog.workspace.missing_plugins_title=Plugins manquants action.check_for_updates=Vérification des mises à jour action.check_for_plugin_updates=Vérifier les mises à jour des plugins action.open_java_edition_dir=Ouvrir le repertoire de l''''installation de la Java Edition @@ -2140,6 +2149,7 @@ elementgui.dimension.biomes_in=Biomes dans cette dimension \: elementgui.dimension.main_filler_block=Bloc de remplissage principal\:
Normal, Nether, End elementgui.dimension.fluid_block=Bloc de fluide\:
Normal, Nether, End elementgui.dimension.sleep_result=Résultat de tentative de sommeil\: +elementgui.dimension.fog_air_color=Remplacer la couleur du brouillard / ciel \:
Laisser PAR DEFAUT pour la gestion par défaut elementgui.dimension.enable_dimension_portal=Activer le portail de la dimension\: elementgui.dimension.portal_frame_block=Bloc du cadre du portail\: elementgui.dimension.portal_particles=Particules du bloc du portail \: @@ -2269,7 +2279,7 @@ elementgui.item.container_item_damage=Endommage l'item à la place de fabr elementgui.item.number_of_uses=Nombre d'utilisation / durabilité de l'item (laissez 0 pour désactiver les dégâts)\:
Si vous voulez faire un outil, créez un outil à la place elementgui.item.is_immune_to_fire=L'item est-il immunisé contre le feu ? elementgui.item.recipe_remainder=Rappel de recette
Assurez-vous d'activer "rester dans la grille de recette". Laissez vide pour utiliser l'item actuel. -elementgui.item.damage_vs_entity=Dégâts contre mob/animal (cocher pour activer)\:
Dégâts de mêlée +elementgui.item.damage_vs_entity=Dégâts d'attaque (cocher pour activer) \: elementgui.item.glowing_effect=L'item a-t-il un effet lumineux ? elementgui.item.item_3d_model=Modèle 3D de l'item elementgui.item.bind_gui=Lier cet objet au GUI\:
Définir à <NONE> pour désactiver l'inventaire @@ -2358,6 +2368,7 @@ elementgui.living_entity.event_initial_spawn=Lors de l'apparition initiale de l' elementgui.living_entity.condition_natural_spawn=Condition d'apparition naturelle de l'entité elementgui.living_entity.condition_is_model_transparent=Le modèle d'entité est-il transparent ? elementgui.living_entity.condition_is_shaking=Est-ce que le modèle d'entité tremble ? +elementgui.living_entity.behaviour=Caractéristiques comportementales (Mob est agressif, Créature est passive)\: elementgui.living_entity.creature_type=Type de créature (définit certains attributs d'entité)\: elementgui.living_entity.drop_health_xp_amount=Récompense facultative, valeur de la santé, quantité d'expérience \: elementgui.living_entity.model_layers=Liste des calques du modèle @@ -2414,6 +2425,7 @@ elementgui.living_entity.error_entity_needs_name=L'entité a besoin d'un nom elementgui.living_entity.page_visual=Visuel elementgui.living_entity.page_model_layers=Couches du modèle elementgui.living_entity.page_sound=Son +elementgui.living_entity.page_behaviour=Comportement elementgui.living_entity.page_entity_data=Données synchronisées elementgui.living_entity.page_ai_and_goals=IA et objectifs elementgui.living_entity.page_spawning=Apparition @@ -2552,6 +2564,7 @@ elementgui.procedure.name_already_exists_dep=Ce nom existe déjà comme dépenda elementgui.procedure.confirm_delete_var_msg=Voulez-vous vraiment supprimer ces variables ?
Si ces variables sont en cours d'utilisation, cette action peut entraîner des erreurs de compilation. elementgui.procedure.required_dependencies=Dépendances nécessaires elementgui.procedure.provided_dependencies=\ Dépendances fournies +elementgui.procedure.external_trigger_does_not_provide_all_dependencies=Le déclencheur externe que vous avez sélectionné le fournit pastoutes les dépendances que votre procédure requiert \! elementgui.projectile.power=Puissance par défaut des projectiles \:
1 est comme un arc elementgui.projectile.damage=Dégâts par défaut des projectiles \: elementgui.projectile.knockback=Recul par défaut du projectile \: @@ -2621,7 +2634,7 @@ elementgui.tool.type=Type\: elementgui.tool.harvest_level=Niveau de récolte\: elementgui.tool.efficiency=Efficacité\: elementgui.tool.attack_speed=Vitesse d'attaque\: -elementgui.tool.damage_vs_entity=Dégâts contre monstres/animaux (dégâts de mêlée)\: +elementgui.tool.damage_vs_entity=Dégâts d'attaque \: elementgui.tool.usage_count=Nombre d'utilisations / durabilité\: elementgui.tool.blocks_affected=Blocs affectés\: elementgui.tool.is_immune_to_fire=L'outil est-il immunisé contre le feu ? @@ -2787,8 +2800,6 @@ dialog.workspace_settings.section.external_apis=Prise en charge d'API externe dialog.workspace_settings.section.external_apis.tooltip=Cases à cocher pour ajouter le support et les dépendances pour les APIs externes supportées
ATTENTION \: Si votre mod utilise des APIs externes, il ne fonctionnera pas sans elles une fois exporté. dialog.workspace_settings.explore_plugins=Explorer les plugins dialog.workspace_settings.plugins_tip=Vous cherchez plus d'APIs ? Vérifiez les plugins MCreator. -dialog.workspace_settings.version_check=Vérifier la version de Forge -dialog.workspace_settings.section.version_check=Désactiver la vérification de version de Minecraft Forge ?
Si vous voulez vous assurer que les utilisateurs utilisent la bonne version de Minecraft Forge,
décochez cette case et activez la vérification de la version de Minecraft Forge. dialog.workspace_settings.section.advanced=Paramètres avancés dialog.workspace_settings.server_side_only=Ce mod n'est-il que côté serveur ? dialog.workspace_settings.lock_base_files_label=Verrouiller les fichiers de mod de base ?
Utiliser SEULEMENT si nécessaire et que vous comprenez Java @@ -3168,6 +3179,7 @@ blockly.warning.no_side_sync=Le bloc {0} n''est pas synchronisé automatiquement blockly.warning.no_more_argument=Ajouter plus d'arguments après l'argument de message rendra cette branche de la commande non fonctionnelle. blockly.warning.no_item_extension_fuel=Obtenir la puissance du carburant d'une procédure déclenchée à partir d'une condition d'extension d'item de carburant fera planter le jeu en raison d'un appel récursif. blockly.warning.state_provider_int_property_warning=La validation du datapack échouera si le bloc n'a pas la propriété donnée, ou si la valeur est hors de portée. +blockly.warning.utility_adv_trigger=Le déclencheur {0} est un déclencheur de progression utilitaire et ne doit pas être utilisé en combinaison avec d''autres déclencheurs. blockly.warnings.binary_operations=Un des blocs d'entrée double est vide. La valeur par-defaut sera utilisé. blockly.warnings.boolean=Impossible de trouver la valeur du bloc logique, en utilisant vrai comme valeur. blockly.warnings.flow_control=Impossible de trouvé le type de cassage de boucle.{0} diff --git a/plugins/mcreator-localization/lang/texts_hu_HU.properties b/plugins/mcreator-localization/lang/texts_hu_HU.properties index 91888e6295e..2a7c040a80d 100644 --- a/plugins/mcreator-localization/lang/texts_hu_HU.properties +++ b/plugins/mcreator-localization/lang/texts_hu_HU.properties @@ -910,8 +910,6 @@ blockly.block.call_procedure.at=\ ennél blockly.block.aitasks_container=AI feladatok / célok listája blockly.block.aitasks_container.tip=A feladat ami magasabban van a listán nagyobb a prioritása blockly.block.aitasks_container.tooltip=Ez a kezdő pontja az AI feladatok listájának. -blockly.block.advancement_trigger=Eredmény biztosítása a játékosnak -blockly.block.advancement_trigger.tooltip=Hozzákötni egy aktiváló kockát ami aktiválja ezt az eredményt ennek a kockának blockly.block.set_var=Beállítani blockly.block.set_to=erre\: blockly.block.get_var=Megállapítani diff --git a/plugins/mcreator-localization/lang/texts_it_IT.properties b/plugins/mcreator-localization/lang/texts_it_IT.properties index 9e6d21181b7..664d7da9720 100644 --- a/plugins/mcreator-localization/lang/texts_it_IT.properties +++ b/plugins/mcreator-localization/lang/texts_it_IT.properties @@ -1413,8 +1413,6 @@ blockly.block.aitasks_container=Lista di compiti / obiettivi dell'IA blockly.block.aitasks_container.tip=Le attività più in alto nella lista hanno priorità maggiore blockly.block.aitasks_container.tooltip=Questo è il punto di inizio della lista di compiti dell'IA. blockly.block.cmdargs_start=Punto d'ingresso del comando -blockly.block.advancement_trigger=Concedi questo progresso al giocatore -blockly.block.advancement_trigger.tooltip=Collega un blocco di causa del progresso a questo blocco blockly.block.feature_container=Caratteristica configurata blockly.block.feature_container.tooltip=Questo è il tipo di funzione da definire blockly.block.feature_container.with_placement=con posizionamento @@ -2279,7 +2277,6 @@ elementgui.item.container_item_damage=Danneggia l'oggetto anziché usarlo elementgui.item.number_of_uses=Durabilità dell'oggetto (lascia 0 per disattivarla)\:
Se vuoi creare uno strumento, usa l'elemento "Strumento" elementgui.item.is_immune_to_fire=L'oggetto è immune al fuoco? elementgui.item.recipe_remainder=Ricordatore della ricetta
Assicurati di abilitare "Rimane nella griglia di costruzione". Lascia in bianco per usare l'oggetto corrente. -elementgui.item.damage_vs_entity=Danno contro mob/animali (seleziona per abilitare)\:
Danno corpo a corpo elementgui.item.glowing_effect=L'item è luccicante? elementgui.item.item_3d_model=Modello 3D dell'oggetto elementgui.item.bind_gui=Associa questo oggetto all'interfaccia grafica\:
Impostare a <NONE> per disabilitare l'inventario @@ -2634,7 +2631,6 @@ elementgui.tool.type=Tipo\: elementgui.tool.harvest_level=Livello di raccolta\: elementgui.tool.efficiency=Efficienza\: elementgui.tool.attack_speed=Velocità di attacco\: -elementgui.tool.damage_vs_entity=Danni contro mob/animali (danni per colpo)\: elementgui.tool.usage_count=Numero di usi / durabilità\: elementgui.tool.blocks_affected=Blocchi affetti\: elementgui.tool.is_immune_to_fire=Lo strumento è immune al fuoco? @@ -2800,8 +2796,6 @@ dialog.workspace_settings.section.external_apis=Supporto per API esterne dialog.workspace_settings.section.external_apis.tooltip=Caselle di controllo per aggiungere supporto e dipendenze per le API esterne supportate
ATTENZIONE\: Se la mod utilizza API esterne, non funzionerà senza di loro una volta esportato dialog.workspace_settings.explore_plugins=Esplora i plugin dialog.workspace_settings.plugins_tip=Stai cercando altre API? Controlla i plugin di MCreator. -dialog.workspace_settings.version_check=Controllo della versione di Forge -dialog.workspace_settings.section.version_check=Disabilitare il controllo della versione di Minecraft Forge?
Se vuoi che gli utenti usino la versione di Minecraft Forge corretta,
deseleziona questa scelta e attiva il controllo della versione di Minecraft Forge. dialog.workspace_settings.section.advanced=Impostazioni avanzate dialog.workspace_settings.server_side_only=Questa mod è solo lato server? dialog.workspace_settings.lock_base_files_label=Bloccare i file di base della mod?
Usa SOLO se necessario e se conosci Java diff --git a/plugins/mcreator-localization/lang/texts_ja_JP.properties b/plugins/mcreator-localization/lang/texts_ja_JP.properties index 75e28756b34..420836b4903 100644 --- a/plugins/mcreator-localization/lang/texts_ja_JP.properties +++ b/plugins/mcreator-localization/lang/texts_ja_JP.properties @@ -1288,8 +1288,6 @@ blockly.block.aitasks_container=AIタスク/ゴール一覧 blockly.block.aitasks_container.tip=上にあるタスクほど優先度が高くなります blockly.block.aitasks_container.tooltip=これがAIタスク一覧の出発点です blockly.block.cmdargs_start=コマンド入力ポイント -blockly.block.advancement_trigger=プレイヤーにこの進捗を与える -blockly.block.advancement_trigger.tooltip=この進歩をトリガーする1つのトリガーブロックをこのブロックに接続します blockly.block.feature_container=構成された生成物 blockly.block.feature_container.tooltip=定義する機能の種類です blockly.block.feature_container.with_placement=配置で @@ -2101,7 +2099,6 @@ elementgui.item.container_item_damage=クラフトの代わりにアイテ elementgui.item.number_of_uses=アイテム使用回数/耐久値(ダメージを無効にするには0のままにします)\:
ツールを作成したい場合は、代わりに要素「ツール」を作成します elementgui.item.is_immune_to_fire=アイテムは火に耐性がある elementgui.item.recipe_remainder=レシピの残り
「クラフレィンググリッド上に残す」を有効にしてください。現在のアイテムを使用する場合は空のままにしてください。 -elementgui.item.damage_vs_entity=モブ/動物にダメージを与える (有効にするためにはチェックしてください)\:
近接ダメージ elementgui.item.glowing_effect=アイテムが光る効果を持っているか elementgui.item.item_3d_model=アイテムの3Dモデル elementgui.item.bind_gui=このアイテムを GUI に関連付ける\:
インベントリを無効にするには <NONE> に設定してください @@ -2379,7 +2376,6 @@ elementgui.tool.type=タイプ\: elementgui.tool.harvest_level=採掘レベル\: elementgui.tool.efficiency=効率\: elementgui.tool.attack_speed=攻撃速度\: -elementgui.tool.damage_vs_entity=モブ/動物へのダメージ (近接ダメージ)\: elementgui.tool.usage_count=耐久値\: elementgui.tool.blocks_affected=影響を受けるブロック\: elementgui.tool.is_immune_to_fire=道具のの火炎耐性 @@ -2536,8 +2532,6 @@ dialog.workspace_settings.section.external_apis=外部 API のサポート dialog.workspace_settings.section.external_apis.tooltip=サポートされている外部APIのサポートと依存関係を追加するチェックボックスをオンにします。
警告\: Modが外部APIを使用している場合、一度出力するとそれらなしでは動作しません dialog.workspace_settings.explore_plugins=プラグインを探す dialog.workspace_settings.plugins_tip=もっと他のAPIをお探しですか? MCreator プラグインを確認してください。 -dialog.workspace_settings.version_check=Forge のバージョンチェック -dialog.workspace_settings.section.version_check=マインクラフト Forge のバージョンチェックを無効にしますか?
ユーザーが適切な マインクラフト Forge のバージョンを使用していることを確認したい場合は、
チェックを外し、マインクラフト Forge のバージョンチェックを有効にしてください。 dialog.workspace_settings.section.advanced=高度な設定 dialog.workspace_settings.server_side_only=この Mod はサーバ専用ですか? dialog.workspace_settings.lock_base_files_label=ベースとなる Mod ファイルをロックしますか?
必要な場合にのみ使用してください。Java を理解している必要があります。 diff --git a/plugins/mcreator-localization/lang/texts_ko_KR.properties b/plugins/mcreator-localization/lang/texts_ko_KR.properties index 3c7de91ea6b..aeae82a9482 100644 --- a/plugins/mcreator-localization/lang/texts_ko_KR.properties +++ b/plugins/mcreator-localization/lang/texts_ko_KR.properties @@ -79,6 +79,10 @@ dialog.animation_maker.settings=애니메이션 설정 dialog.animation_maker.next_frame=다음 프레임 dialog.animation_maker.previous_frame=이전 프레임 dialog.animation_maker.animation_timeline=애니메이션 타임라인 +dialog.animation_maker.add_frames=프레임 추가... +dialog.animation_maker.add_frames_from_template=템플릿에서 프레임 추가... +dialog.animation_maker.add_frames_from_strip=애니메이션 스트립에서 프레임 추가... +dialog.animation_maker.add_frames_from_gif=GIF에서 프레임 추가... dialog.animation_maker.gif_importing=GIF 불러오기 dialog.animation_maker.gif_reading=GIF 읽는 중 dialog.animation_maker.gif_processing=GIF 처리 중 @@ -167,6 +171,15 @@ dialog.gui.model_rotation_x=모델 yaw 회전(도) dialog.gui.model_follow_mouse=마우스 움직임을 따라 회전 dialog.gui.add_tooltip=도구 설명 편집기 dialog.gui.tooltip_display_condition=도구 설명 표시 상태 +dialog.gui.anchor.top_left=왼쪽 상단 +dialog.gui.anchor.top_center=상단 중앙 +dialog.gui.anchor.top_right=오른쪽 상단 +dialog.gui.anchor.center_left=왼쪽 중앙 +dialog.gui.anchor.center=중앙 +dialog.gui.anchor.center_right=오른쪽 중앙 +dialog.gui.anchor.bottom_left=왼쪽 하단 +dialog.gui.anchor.bottom_center=하단 중앙 +dialog.gui.anchor.bottom_right=오른쪽 하단 dialog.gradle_console.clear_log=내역 지우기 dialog.gradle_console.search=Gardle 콘솔에서 검색 dialog.gradle_console.start_build= 전체 작업 공간을 빌드하려면 클릭하십시오.
Ctrl 키를 누른 상태에서 콘솔 탭을 클릭하여 빌드를 시작할 수도 있습니다. @@ -305,6 +318,8 @@ dialog.image_maker.tools.types.noise_description=레이어에 색상을 적용 dialog.image_maker.tools.types.move=이동 도구 dialog.image_maker.tools.types.move_layer=레이어 이동 dialog.image_maker.tools.types.move_description=활성 레이어 이동 도구 +dialog.image_maker.tools.types.select=도구 선택 +dialog.image_maker.tools.types.select_description=영역을 선택하는 도구 dialog.image_maker.tools.types.pencil=연필 dialog.image_maker.tools.types.pencil_description=기본 그리기 도구 dialog.image_maker.tools.types.resizecanvas=캔버스 크기 조정 @@ -320,7 +335,12 @@ dialog.image_maker.tools.types.stamp=도장 dialog.image_maker.tools.types.stamp_description=템플릿에서 텍스처를 적용하기 위한 도구 dialog.image_maker.tools.types.threshold=임계값\: dialog.image_maker.tools.types.shape=모양\: +dialog.image_maker.tools.types.shape.square=정사각형 +dialog.image_maker.tools.types.shape.frame=프레임 +dialog.image_maker.tools.types.shape.circle=원 +dialog.image_maker.tools.types.shape.ring=링 dialog.image_maker.tools.types.smooth_edge=부드러운 가장자리 +dialog.image_maker.tools.types.pick_opacity=불투명도 선택 dialog.image_maker.tools.types.saturation=채도\: dialog.image_maker.tools.types.drawing_size=크기\: dialog.image_maker.tools.types.drawing_connect_points=포인트 연결 @@ -331,7 +351,14 @@ dialog.image_maker.tools.component.colorselector_swap=텍스트 및 배경 색 dialog.image_maker.tools.component.colorselector_select_foreground=글자 색상 선택\: dialog.image_maker.tools.component.colorselector_select_background=배경색을 선택하세요\: dialog.item_selector.title=블록/아이템 선택기 +dialog.item_selector.use_selected=선택된 항목 사용 dialog.item_selector.use_tag=태그 사용 +dialog.item_selector.use_tag.entities=엔티티 태그 사용 +dialog.item_selector.enter_tag_name.blocks=아래에 블록 태그를 입력하세요(템플릿 목록 확인).
+dialog.item_selector.enter_tag_name.items=아래에 항목 태그를 입력하세요(템플릿 목록 확인).
+dialog.item_selector.enter_tag_name.biomes=아래에 생물군계 태그를 입력하세요(템플릿 목록 확인)\:
+dialog.item_selector.enter_tag_name.entities=아래에 엔티티 태그 이름을 입력하세요(템플릿 목록 확인).
+dialog.item_selector.enter_tag_name.damage_types=아래에 피해 유형 태그 이름을 입력하세요(템플릿 목록 확인).
dialog.item_selector.error_invalid_tag_name_title=유효하지 않은 태그 이름 dialog.item_selector.all=모두 dialog.item_selector.blocks=블록 @@ -340,11 +367,18 @@ dialog.item_selector.potions=물약 dialog.item_selector.custom_elements=커스텀 요소 dialog.item_selector.name=이름\: dialog.item_selector.display_filter=\ 디스플레이 필터\: +dialog.list_editor.title=문자열 목록 편집기 +dialog.list_editor.add=새 항목 추가 +dialog.list_editor.clear=모든 항목 제거 +dialog.list_editor.validator=목록 항목 +dialog.list_editor.errors.message=목록의 일부 문자열 항목이 제대로 정의되지 않았습니다. +dialog.list_editor.errors.title=잘못된 목록 항목 dialog.modelement_id.info_message=이 모드 요소에는 코드가 잠겨 있습니다\!
코드가 잠겨 있으면 MCreator에서 소스 코드를 변경할 수 없습니다. dialog.modelement_id.info_message_title=모드 요소 코드가 잠겨 있습니다. dialog.modelement_id.registry_name=레지스트리 이름\: dialog.modelement_id.registry_name_info=레지스트리 이름(모든 모드 요소에서 사용하는 것은 아님) dialog.modelement_id.registry_name_validator=레지스트리 이름 +dialog.modelement_id.use_caution_warn=이 도구를 조심해서 사용하세요\! 중복된 이름을 사용하지 마세요\!

레지스트리 이름을 변경하면 기존 세계가 손상되고
모드의 다른 모드 요소와 충돌이 발생할 수 있습니다\! dialog.modelement_id.id_and_registry_names="{0} - 레지스트리 이름" dialog.modelement_id.invalid_registry_name=입력한 레지스트리 이름이 잘못되었습니다\!
변경 사항이 저장되지 않았습니다. dialog.modelement_id.invalid_registry_name_title=잘못된 레지스트리 이름 @@ -385,6 +419,20 @@ dialog.preferences.themes.list=
사용 dialog.preferences.description={0}

{1} dialog.preferences.entry_description={0}
{1} dialog.preferences.unknown_property_type={0}\: 알 수 없는 속성 유형 +dialog.search_usages.list=선택한 {0}을 사용하는 모드 요소 목록\: +dialog.search_usages.list.empty=선택한 {0}을 사용하는 모드 요소가 없습니다. +dialog.search_usages.open_selected=선택한 모드 요소 편집 +dialog.search_usages.title=요소 사용법 +dialog.search_usages.deletion.confirm_msg=선택한 {0} 을 삭제하시겠습니까?

선택한 {0} 중 일부는 아래 나열된 모드 요소에서 여전히 사용됩니다.
삭제를 진행하면 작업공간이 깨지거나 빌드에 실패할 수 있습니다\! +dialog.search_usages.deletion_safe.confirm_msg=선택한 {0}을 삭제하시겠습니까?

선택한 목록에서 {0}을 사용하는 모드 요소가 없습니다. 그러나 사용자 정의 코드에서는 계속 사용될 수 있습니다.
계속 진행하면 이러한 참조가 유효하지 않게 되어 리소스가 손상되거나 게임이 충돌할 수 있습니다. +dialog.search_usages.deletion.confirm=무시하고 삭제 +dialog.search_usages.type.mod_element=모드 요소 +dialog.search_usages.type.resource.texture=텍스처 +dialog.search_usages.type.resource.model=모델 +dialog.search_usages.type.resource.sound=소리 +dialog.search_usages.type.resource.structure=구조물 +dialog.search_usages.type.global_variable=전역 변수 +dialog.search_usages.type.localization_key=현지화 키 dialog.sounds.name=소리 이름 dialog.sounds.registry_name=사운드 저장명;
사용중인 사운드의 이름을 변경하면, 기존 설정이 손상됩니다. dialog.sounds.files=사운드 파일\: @@ -396,6 +444,7 @@ dialog.sounds.error_name_not_valid_title=잘못된 사운드명 dialog.sounds.error_select_valid_file=최소 하나 이상의 파일을 선택해주세요\!
변경사항은 저장되지 않습니다. dialog.sounds.error_select_valid_file_title=사운드 파일 없음 dialog.state_editor.header=값의 성질 +dialog.state_editor.use_entry=해당 속성을 사용하려면 이 확인란을 선택하세요. dialog.state_editor.title=상태 편집기 dialog.textures_import.texture_type=텍스처 유형 dialog.textures_import.block=블록 @@ -418,6 +467,7 @@ dialog.textures_mapping.title_for_model=모델에 대한 texture mappings dialog.textures_mapping.add_new=새로운 texture mapping 추가 dialog.textures_mapping.enter_name_message=Texture mapping 이름을 입력합니다.
이 이름은 모델의 Texture mapping 을 선택할 때
텍스처 세트를 식별하는 데 사용됩니다. dialog.textures_mapping.enter_name_title=새로운 texture mapping +dialog.textures_mapping.jump_to=...로 이동 dialog.textures_mapping.save=매핑 저장 dialog.textures_mapping.model_texture_part=모델 텍스처 부분\:
{0} dialog.textures_mapping.confirm_deletion_message=이 texture mapping을 삭제하시겠습니까?
매핑이 아직 사용 중이면 텍스처가 깨질 수 있습니다\! @@ -503,6 +553,7 @@ dialog.variables.variable_name=변수 이름\: dialog.variables.variable_type=변수 유형\: dialog.variables.variable_scope=변수 범위\: dialog.variables.new_title=새 변수 +workspace.loading=작업공간을 불러오는중... workspace.elements.list.locked=잠김 workspace.elements.folders.add_tooltip=현재 폴더에 새 폴더 추가 workspace.elements.folders.up_tooltip=상위 폴더로 다시 이동 @@ -513,6 +564,7 @@ workspace.elements.folders.add.error_letters=폴더 이름은 영문자, 숫자, workspace.elements.folders.add.error_exists=같은 이름을 가진 폴더가 이미 존재합니다. workspace.elements.folders.rename.title=폴더 이름 변경 workspace.elements.folders.rename.message=새 폴더 이름 입력\: +workspace.elements.list.special.item={0}
유형\: {1} workspace.elements.list.folder=폴더 workspace.elements.list.notlocked=잠기지 않음 workspace.elements.list.compiles=컴파일 @@ -540,6 +592,7 @@ workspace.elements.list.filter_all=모두 보기 workspace.elements.list.filter_locked=잠긴 요소 workspace.elements.list.filter_witherrors=빌드 오류가 있는 요소 workspace.elements.list.ascending=오름차순 +workspace.category.mod_elements=모드 요소 workspace.category.resources=리소스 workspace.category.variables=변수 workspace.category.localization=현지화 @@ -556,6 +609,9 @@ workspace.elements.list.edit.delete=삭제 workspace.elements.list.edit.duplicate=모드 요소 복제... workspace.elements.list.edit.code=코드 편집기에서 모드 요소 열기 workspace.elements.list.edit.lock=모드 요소 잠금/잠금 해제 +workspace.elements.list.edit.id=레지스트리 이름 편집... +workspace.elements.list.edit.usages.tags=선택한 요소 목록에는 태그 유형 모드 요소가 포함되어 있습니다.

동일한 레지스트리 이름을 가진 태그는 다른 모드에 의해 정의될 수도 있으며 참조될 수도 있습니다.
따라서 이러한 요소에 대한 사용법 검색은 불가능합니다. +workspace.elements.list.edit.usages.tags.title=태그 사용법 workspace.elements.list.edit.add.folder=새로운 폴더 추가… workspace.elements.list.edit.rename.folder=선택한 폴더 이름 변경... workspace.elements.delete.tooltip=선택된 모드 요소를 삭제 @@ -791,7 +847,7 @@ blockly.block.entity_canusecommand=%2에 명령 권한 부여 수준 %1이(가) blockly.block.entity_check_creature_type=%1의 생물 유형이 %2입니다. blockly.block.entity_clear_inventory=%1의 인벤토리 지우기 blockly.block.entity_clearpotions=%1의 물약 효과를 모두 지웁니다. -blockly.block.entity_close_gui=%1에 대해 열려 있는 모든 GUI를 닫습니다 +blockly.block.entity_close_gui=%1에게 열려 있는 모든 GUI를 닫습니다 blockly.block.entity_create=%1 유형 %2의 정적 엔티티 인스턴스(생성하지 않음) blockly.block.entity_dimension_id=차원 %1의 ID가 다음에 있습니다. blockly.block.entity_direction_value=%1의 위치 @@ -1392,7 +1448,6 @@ elementgui.tool.type=유형\: elementgui.tool.harvest_level=수확 레벨\: elementgui.tool.efficiency=효율\: elementgui.tool.attack_speed=공격 속도\: -elementgui.tool.damage_vs_entity=피해 VS 몹/동물 (근거리 피해)\: elementgui.tool.usage_count=사용 횟수 / 내구도\: elementgui.tool.blocks_affected=영향 받는 블록\: elementgui.tool.is_immune_to_fire=이 도구는 화염에 면역이 있습니까? @@ -1558,6 +1613,19 @@ blockly.warnings.if_no_condition=조건이 없는 if block 구문을 찾았습 blockly.warnings.if_no_main_body=주요 부분이 누락된 if block 구문을 찾았습니다\! blockly.warnings.empty_code_block=빈 코드 블록을 건너뛰었습니다. blockly.warnings.call_procedure.empty=빈 절차 호출 블록을 건너뛰었습니다. +blockly.errors.disabled_block_type.remove=블록 유형 {0} 을(를) 비활성화했습니다. 이 블록을 제거하세요\! +blockly.errors.unknown_block_type.remove=알 수 없는 블록 유형 {0}. 이 블록을 제거하세요\! +blockly.errors.cancel_event.null=선택한 외부 트리거를 로드하지 못했습니다. +blockly.errors.cancel_event.not_cancellable=선택한 글로벌 트리거는 취소할 수 없습니다. +blockly.errors.cancel_event.no_selected_trigger=이 프로시저는 전역 트리거를 사용하지 않으므로 취소 이벤트 블록은 트리거를 취소할 수 없습니다. +blockly.errors.custom_dependency=사용자 정의 종속성 블록이 제대로 정의되지 않았습니다\! +blockly.errors.variables.invalid_local_var={0} 블록이 존재하지 않는 지역 변수에 바인딩되었습니다. {1} +blockly.errors.variables.invalid_var={0} 블록이 존재하지 않는 변수에 바인딩되었습니다. {1} +blockly.errors.variables.no_local_scope.statement=문 {0} 은 지역 변수를 지원하지 않습니다. +blockly.errors.variables.missing_entity_input=플레이어 변수의 {0} 블록에 항목 입력이 누락되었습니다. +blockly.errors.variables.no_getter_support=현재 생성기는 {1} 범위에서 {0} 유형의 변수 가져오기를 지원하지 않습니다. +blockly.errors.variables.no_setter_support=현재 생성기는 {1} 범위에서 {0} 유형의 변수 설정을 지원하지 않습니다. {2} +blockly.errors.variables.improperly_defined={0} 변수 블록 중 하나가 잘못 정의되었습니다. blockly.errors.empty_mcitem=빈 Minecraft 원소 블록입니다. 원소를 정의해야 합니다. blockly.errors.empty_output_code_block=출력 코드 블록을 비어 있을 수 없습니다\! blockly.block.cancel_event=이벤트 취소 @@ -1567,12 +1635,18 @@ dialog.bedrock.options.close_reload_always=닫고 다시 열기 (다신 묻지 dialog.bedrock.options.cancel=테스트 실행 취소 dialog.bedrock.already_opened.title=Minecraft 베드락 에디션이 이미 열려 있음 dialog.bedrock.failed.title=클라이언트 열기에 실패함 +dialog.bedrock.unsupported=스토어에서 마인크래프트 베드락 에디션을 설치하지 않은것 같습니다. dialog.bedrock.unsupported.windows=Minecraft 베드락 에디션은 현재 Windows 10 이상에서만 작동됨 -dialog.bedrock.unsupported.title=클라이언트 열기가 호환 되지 않음 +dialog.bedrock.unsupported.title=클라이언트가 호환되지 않음 dialog.plugin_load_failed.msg1=몇 가지 플러그인을 불러오는데 실패함\: +dialog.plugin_load_failed.msg2=특정 기능이 제대로 작동하지 않을 수 있습니다. 자세한 내용은 MCreator 로그 파일을 확인하세요.
자세한 정보와 지원은 플러그인 작성자에게 문의하는 것이 좋습니다. dialog.plugin_load_failed.title=몇 가지 플러그인을 불러오는데 실패함 notification.plugin_load_failed.msg=다음 플러그인을 불러오는데 실패함\: notification.common.more_info=추가 정보 notification.update_available.msg=사용 가능한 최신 버전의 MCreator이 있습니다.

설치된 버전\: {0}
새 버전\: {1} notification.patch_available.msg=사용 가능한 {0}의 최신 버전이 있습니다.

설치된 버전\:{0}.{1}
새 버전\: {0}.{2} -notification.plugin_updates.msg=업데이트가 가능한 플러그인이 있습니다 \ No newline at end of file +notification.plugin_updates.msg=업데이트가 가능한 플러그인이 있습니다 +notification.news.title=웹사이트의 뉴스\: {0} +notification.news.read_more=이에 대해 자세히 알아보기 +notification.news.hide=이 알림 숨기기 +simple_list_entry.remove=이 항목 삭제 \ No newline at end of file diff --git a/plugins/mcreator-localization/lang/texts_pl_PL.properties b/plugins/mcreator-localization/lang/texts_pl_PL.properties index a020fdcaf8e..52ad763199d 100644 --- a/plugins/mcreator-localization/lang/texts_pl_PL.properties +++ b/plugins/mcreator-localization/lang/texts_pl_PL.properties @@ -1411,8 +1411,6 @@ blockly.block.aitasks_container=Zadania SI / lista celów blockly.block.aitasks_container.tip=Zadania wyżej na liście mają wyższy priorytet blockly.block.aitasks_container.tooltip=Jest to punkt wyjścia listy zadań SI. blockly.block.cmdargs_start=Punkt wejścia komendy -blockly.block.advancement_trigger=Przyznaj te osiągnięcie graczowi -blockly.block.advancement_trigger.tooltip=Połącz jeden blok wyzwalacza, który wyzwala te osiągnięcie do tego bloku blockly.block.feature_container=Skonfigurowana cecha blockly.block.feature_container.tooltip=To jest typ cechy do zdefiniowania blockly.block.feature_container.with_placement=z umiejscowieniem @@ -2274,7 +2272,6 @@ elementgui.item.container_item_damage=W zamian uszkodź przedmiot przy wyt elementgui.item.number_of_uses=Liczba użyć przedmiotu / trwałości (pozostaw 0, aby wyłączyć obrażenia)\:
Jeśli chcesz stworzyć narzędzie, utwórz narzędzie zamiast tego elementgui.item.is_immune_to_fire=Czy przedmiot jest odporny na ogień? elementgui.item.recipe_remainder=Pozostałość receptury
Upewnij się, żeby włączyć "pozostaw w siatce tworzenia". Pozostaw puste, aby użyć bieżącego przedmiotu. -elementgui.item.damage_vs_entity=Obrażenia przeciwko mobom/zwierzętom (zaznacz aby włączyć)\:
Obrażenia wręcz elementgui.item.glowing_effect=Czy przedmiot ma efekt świecenia? elementgui.item.item_3d_model=Model 3D przedmiotu elementgui.item.bind_gui=Powiąż ten przedmiot z GUI\:
Ustaw <NONE> , aby wyłączyć ekwipunek @@ -2628,7 +2625,6 @@ elementgui.tool.type=Typ\: elementgui.tool.harvest_level=Poziom zbiorów\: elementgui.tool.efficiency=Wydajność\: elementgui.tool.attack_speed=Prędkość ataku\: -elementgui.tool.damage_vs_entity=Obrażenia względem moba/zwierzęcia (obrażenia wręcz)\: elementgui.tool.usage_count=Liczba użyć / trwałość\: elementgui.tool.blocks_affected=Dotyczy bloków\: elementgui.tool.is_immune_to_fire=Czy narzędzie jest odporne na ogień? @@ -2794,8 +2790,6 @@ dialog.workspace_settings.section.external_apis=Wsparcie dla zewnętrznego API dialog.workspace_settings.section.external_apis.tooltip=Pola wyboru, aby dodać wsparcie i zależności dla obsługiwanych zewnętrznych interfejsów API
OSTRZEŻENIE\: Jeśli twój mod używa zewnętrznych interfejsów API, nie zadziała bez nich po wyeksportowaniu dialog.workspace_settings.explore_plugins=Przeglądaj wtyczki dialog.workspace_settings.plugins_tip=Szukasz więcej API? Sprawdź wtyczki MCreator. -dialog.workspace_settings.version_check=Sprawdzanie wersji Forge -dialog.workspace_settings.section.version_check=Wyłączyć sprawdzanie wersji Minecraft Forge?
Jeśli chcesz upewnić się, że użytkownicy używają odpowiedniej wersji Minecraft Forge,
odznacz to i włącz sprawdzanie wersji Minecraft Forge. dialog.workspace_settings.section.advanced=Zaawansowane ustawienia dialog.workspace_settings.server_side_only=Czy ten mod jest tylko po stronie serwera? dialog.workspace_settings.lock_base_files_label=Zablokować bazowe pliki moda?
Używaj TYLKO w razie potrzeby, i jeśli rozumiesz Javę diff --git a/plugins/mcreator-localization/lang/texts_pt_BR.properties b/plugins/mcreator-localization/lang/texts_pt_BR.properties index 8eac53c6192..6f55447a6fd 100644 --- a/plugins/mcreator-localization/lang/texts_pt_BR.properties +++ b/plugins/mcreator-localization/lang/texts_pt_BR.properties @@ -396,7 +396,7 @@ dialog.new_modelement.desc=Insira o nome dialog.new_modelement.title_window=Entrar {0} nome dialog.new_modelement.create_new=Criar novo(a) {0} dialog.option_pane.invalid_input=Entrada inválida -dialog.option_pane.invalid_text=Você digitou um texto inválido

mensagem de erro\:
+dialog.option_pane.invalid_text=Você digitou um texto inválido.

Mensagem de erro\:
dialog.preferences.change_language=Personalizado {0}
Você pode gerenciar o personalizado {0} (*.{1}) aqui dialog.preferences.add_language=Adicionar {0} dialog.preferences.remove_selected_language=Remover selecionados @@ -640,24 +640,24 @@ workspace.elements.edit_modelement_nosavedinstance.title=Não foi possível carr blockly.compile_notes=Avisos e erros ({0})\: blockly.templates.aitasks=Modelos de IA blockly.templates.aitasks.export=Exportar configuração de IA -blockly.templates.aitasks.export_failed.message=Falha ao exportar a configuração de IA\!
Sua configuração de tarefa IA pode estar vazia ou corrompida. +blockly.templates.aitasks.export_failed.message=Falha ao exportar a configuração de IA\!
Sua configuração de tarefa de IA pode estar vazia ou corrompida. blockly.templates.aitasks.export_failed.title=Falha na exportação blockly.templates.aitasks.import=Importar configuração de IA -blockly.templates.aitasks.import_failed.message= Falha ao importar o procedimento\!
O arquivo de procedimento que você está importando é inválido. +blockly.templates.aitasks.import_failed.message=Falha ao importar a configuração de IA\!
O arquivo de configuração de tarefa de IA que você está importando é inválido. blockly.templates.aitasks.import_failed.title=Falha na importação blockly.templates.cmdargs=Modelos de parâmetro blockly.templates.cmdargs.export=Exportar configuração de parâmetros blockly.templates.cmdargs.export_failed.message=Falha ao exportar a configuração de parâmetros\!
Sua configuração de parâmetros pode estar vazia ou corrompida. blockly.templates.cmdargs.export_failed.title=Falha na exportação blockly.templates.cmdargs.import=Importar configuração de parâmetros -blockly.templates.cmdargs.import_failed.message=Falha ao importar a configuração de parâmetros\!
O arquivo de configuração de parâmetros que você esta importando é invalido. +blockly.templates.cmdargs.import_failed.message=Falha ao importar a configuração de parâmetros\!
O arquivo de configuração de parâmetros que você está importando é invalido. blockly.templates.cmdargs.import_failed.title=Falha na importação blockly.templates.features=Modelos de recurso blockly.templates.features.export=Exportar recurso blockly.templates.features.export_failed.message=Falha ao exportar o recurso\!
Seu recurso pode estar vazio ou corrompido. blockly.templates.features.export_failed.title=Falha na exportação blockly.templates.features.import=Importar recurso -blockly.templates.features.import_failed.message=Falha ao importar a característica\!
O arquivo da característica que você está importando é inválido. +blockly.templates.features.import_failed.message=Falha ao importar o recurso\!
O arquivo do recurso que você está importando é inválido. blockly.templates.features.import_failed.title=Falha na importação blockly.templates.procedures=Modelos de procedimento blockly.templates.procedures.export=Exportar procedimento @@ -762,6 +762,7 @@ blockly.category.villagetasks=Tarefas relacionadas às vilas blockly.category.blocks=Triggers de bloco blockly.category.items=Triggers de item blockly.category.utility=Gatilhos de utilidade +blockly.category.utility.description=Estes gatilhos não devem ser usados em combinação com outros. blockly.category.world=Gatilhos relacionados ao mundo blockly.category.minecraft_components=Componentes do Minecraft blockly.category.custom_variables=Variáveis personalizadas @@ -777,8 +778,8 @@ blockly.category.advancedfeatures=Recursos avançados blockly.category.blockpredicates=Posicionamentos condicionais blockly.category.blocks.feature=Blocos blockly.category.features=Recursos diversos -blockly.category.intproviders=Provedores inteiros -blockly.category.heightplacements=Altura do posicionamento +blockly.category.intproviders=Provedores de inteiros +blockly.category.heightplacements=Posicionamentos de altura blockly.category.orefeatures=Recursos de minério blockly.category.placements=Posicionamentos comuns blockly.category.treefeatures=Recursos de árvore @@ -807,49 +808,49 @@ blockly.block.block_fluidtank_tanks=Pegue o número de tanques do bloco em x\: % blockly.block.block_registry_name=Obter o nome de registro de %1 blockly.block.block_inv_clear_slot=Limpar o slot %4 do bloco em x\: %1 y\: %2 z\: %3 se o bloco tiver inventário blockly.block.block_inv_damage_item=Dê %4 de dano no item do slot %5 do bloco em x\: %1 y\: %2 z\: %3 se o bloco tiver inventário -blockly.block.block_inv_get_amount_inslot=Obter número de itens do slot %4 do bloco em x\: %1 y\: %2 z\: %3 se o bloco tiver inventário -blockly.block.block_inv_get_item_inslot=Obter uma cópia do item do slot %4 do bloco em x\: %1 y\: %2 z\: %3 se o bloco tiver inventário +blockly.block.block_inv_get_amount_inslot=Obter o número de itens do slot %4 do bloco em x\: %1 y\: %2 z\: %3 se tiver inventário +blockly.block.block_inv_get_item_inslot=Obter uma cópia do item do slot %4 do bloco em x\: %1 y\: %2 z\: %3 se tiver inventário blockly.block.block_inv_remove_items=Remover %4 itens do slot %5 do bloco em x\: %1 y\: %2 z\: %3 se o bloco tiver inventário blockly.block.block_inv_set_items=Definir %4 %6 no slot %5 do bloco em x\: %1 y\: %2 z\: %3 se o bloco tiver inventario blockly.block.block_is_fluid=%1 é um fluido blockly.block.block_is_fluid_source=%1 é uma fonte de fluido blockly.block.block_is_tagged_in=%1 é etiquetado em etiquetas de bloco como\: %2 blockly.block.block_is_fertilizable=%1 pode ser fertilizado com farinha de osso -blockly.block.block_is_valid_position=É x\: %2 y\: %3 z\: %4 uma posição válida para %1 +blockly.block.block_is_valid_position=x\: %2 y\: %3 z\: %4 é uma posição válida para %1 blockly.block.block_is_waterloggable=%1 é alagável -blockly.block.block_nbt_logic_get=Coletar a tag de lógica de NBT %4 do bloco em x\: %1 y\: %2 z\: %3 se ele tiver um bloco-entidade -blockly.block.block_nbt_logic_set=Definir a tag de lógica de NBT %4 do bloco em x\: %1 y\: %2 z\: %3 para %5 se ele tiver um bloco-entidade %6 -blockly.block.block_nbt_num_get=Coletar a tag numérica de NBT %4 do bloco em x\: %1 y\: %2 z\: %3 se ele tiver um bloco-entidade -blockly.block.block_nbt_num_set=Definir a tag numérica de NBT %4 do bloco em x\: %1 y\: %2 z\: %3 para %5 se ele tiver um bloco-entidade %6 -blockly.block.block_nbt_text_get=Coletar a tag de texto de NBT %4 do bloco em x\: %1 y\: %2 z\: %3 se ele tiver um bloco-entidade -blockly.block.block_nbt_text_set=Definir a tag de texto de NBT %4 do bloco em x\: %1 y\: %2 z\: %3 para %5 se ele tiver um bloco-entidade %6 +blockly.block.block_nbt_logic_get=Obter a etiqueta lógica NBT %4 do bloco em x\: %1 y\: %2 z\: %3 se for um bloco-entidade +blockly.block.block_nbt_logic_set=Definir a etiqueta lógica NBT %4 do bloco em x\: %1 y\: %2 z\: %3 para %5 se for um bloco entidade %6 +blockly.block.block_nbt_num_get=Obter a etiqueta numérica NBT %4 do bloco em x\: %1 y\: %2 z\: %3 se for um bloco-entidade +blockly.block.block_nbt_num_set=Definir a etiqueta numérica NBT %4 do bloco em x\: %1 y\: %2 z\: %3 para %5 se for um bloco-entidade %6 +blockly.block.block_nbt_text_get=Obter a etiqueta textual NBT %4 do bloco em x\: %1 y\: %2 z\: %3 se for um bloco-entidade +blockly.block.block_nbt_text_set=Definir a etiqueta textual NBT %4 do bloco em x\: %1 y\: %2 z\: %3 para %5 se for um bloco-entidade %6 blockly.block.block_notify=Atualizar/notificar bloco em x\: %1 y\: %2 z\: %3 -blockly.block.block_play_break_effect=Tocar efeito de quebra de %1 em x\: %2 y\: %3 z\: %4 -blockly.block.block_random_from_tag=Bloco aleatório da tag %1 ou AIR se nenhum bloco for encontrado +blockly.block.block_play_break_effect=Reproduzir efeito de quebramento de %1 em x\: %2 y\: %3 z\: %4 +blockly.block.block_random_from_tag=Bloco aleatório da etiqueta %1 ou AR se nenhum bloco for encontrado blockly.block.block_remove=Remover bloco em x\: %1 y\: %2 z\: %3 -blockly.block.block_remove_drop=Remover bloco de x\: %1 y\: %2 z\: %3 e largar em x\: %4 y\: %5 z\: %6 +blockly.block.block_remove_drop=Remover bloco em x\: %1 y\: %2 z\: %3 e dropar em x\: %4 y\: %5 z\: %6 blockly.block.block_remove_with_particles=Remover bloco de x\: %1 y\: %2 z\: %3 e spawnar partículas de quebramento blockly.block.block_replace=Substituir bloco em x\: %2 y\: %3 z\: %4 com %1 manter estado %5 manter NBT/inventário %6 blockly.block.block_schedule_tick=Agendar tick update do bloco em x\: %1 y\: %2 z\: %3 em %4 ticks -blockly.block.block_set_boolean_property=Define a propriedade boleano %1 do bloco em x\: %2 y\: %3 z\: %4 para %5 -blockly.block.block_set_direction=Defina a direção do bloco em x\: %1 y\: %2 z\: %3 para %4 +blockly.block.block_set_boolean_property=Definir a propriedade booleana %1 do bloco em x\: %2 y\: %3 z\: %4 para %5 +blockly.block.block_set_direction=Definir a direção do bloco em x\: %1 y\: %2 z\: %3 para %4 blockly.block.block_set_enum_property=Definir a propriedade enum %1 do bloco em x\: %2 y\: %3 z\: %4 para %5 -blockly.block.block_set_integer_property=Definir propriedade integer %1 no bloco em X\: %2 Y\: %3 Z\: %4 para %5 +blockly.block.block_set_integer_property=Definir a propriedade inteiro %1 do bloco em X\: %2 Y\: %3 Z\: %4 para %5 blockly.block.block_simulate_right_click=Simular o clique do botão direito do %4 no bloco em x\: %1 y\: %2 z\: %3 -blockly.block.blockat_enchant_power_bonus=Pegar poder de bonus de encantamento no bloco em x\: %1 y\: %2 z\: %3 -blockly.block.blockat_hardness=Pegue o hardness(dureza) do bloco em x\: %1 y\: %2 z\: %3 -blockly.block.blockat_harvestlevel=Pegue o nível de mineração do bloco em x\: %1 y\: %2 z\: %3 -blockly.block.blockat_is_solid=O bloco em x\: %1 y\: %2 z\: %3 é solido -blockly.block.blockat_is_side_solid=Lado %1 do bloco em x\: %2 y\: %3 z\: %4 sólido -blockly.block.blockat_lightlevel=Pegue o nivel de luz do bloco em x\: %1 y\: %2 z\: %3 -blockly.block.blockat_opacity=Pegar opacidade do bloco em x\: %1 y\: %2 z\: %3 -blockly.block.blockat_plant_type=O bloco em x\: %1 y\: %2 z\: %3 é do tipo de planta %4 -blockly.block.blockitem_to_mcitem=Converta %3 %1 para %2 +blockly.block.blockat_enchant_power_bonus=Obter o bônus de poder de encanamento do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.blockat_hardness=Obter a dureza do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.blockat_harvestlevel=Obter o nível de coleta do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.blockat_is_solid=O bloco em x\: %1 y\: %2 z\: %3 for sólido +blockly.block.blockat_is_side_solid=O lado %1 do bloco em x\: %2 y\: %3 z\: %4 for sólido +blockly.block.blockat_lightlevel=Obter o nível de iluminação do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.blockat_opacity=Obter a opacidade do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.blockat_plant_type=O bloco em x\: %1 y\: %2 z\: %3 for do tipo de planta %4 +blockly.block.blockitem_to_mcitem=Converter %3 %1 para %2 blockly.block.blockstate_from_deps=Estado de bloco provido -blockly.block.blockstate_get_boolean_property=Obter propriedade booleana %1 de %3 %2 -blockly.block.blockstate_get_direction=Obter direção de %2 %1 -blockly.block.blockstate_get_enum_property=Obter propriedade enum %1 de %3 %2 -blockly.block.blockstate_get_integer_property=Obter a propriedade integer %1 de %3 %2 +blockly.block.blockstate_get_boolean_property=Obter a propriedade booleana %1 de %3 %2 +blockly.block.blockstate_get_direction=Obter a direção de %2 %1 +blockly.block.blockstate_get_enum_property=Obter a propriedade enum %1 de %3 %2 +blockly.block.blockstate_get_integer_property=Obter a propriedade inteiro %1 de %3 %2 blockly.block.blockstate_with_boolean_property=%1 com propriedade boolean %2 definida para %3 %4 blockly.block.blockstate_with_direction=%1 com direção definida para %2 %3 blockly.block.blockstate_with_enum_property=%1 com propriedade enum %2 definida para %3 %4 @@ -857,12 +858,12 @@ blockly.block.blockstate_with_integer_property=%1 com propriedade integer %2 def blockly.block.compare_blockstates=É %3 %1 o mesmo bloqueio de %4 %2 blockly.block.compare_dimensionids=%1 \= %2 blockly.block.compare_directions=%1 \= %2 -blockly.block.compare_entities=É %1 a mesma entidade que %2 -blockly.block.compare_mcblocks=É %3 %1 o mesmo bloco que %4 %2 +blockly.block.compare_entities=%1 é a mesma entidade que %2 +blockly.block.compare_mcblocks=%3 %1 é o mesmo bloco que %4 %2 blockly.block.compare_mcitems=%3 %1 \= %4 %2 -blockly.block.compare_mcitems_oredictionary=%1 possui a tag de item %2 -blockly.block.console_log=Log %1 com nível de log %2 -blockly.block.copy_mcitem=Faça uma cópia de %2 %1 +blockly.block.compare_mcitems_oredictionary=%1 estiver etiquetado nas tags de item como %2 +blockly.block.console_log=Registrar %1 com nível de registro %2 +blockly.block.copy_mcitem=Fazer uma cópia de %2 %1 blockly.block.deal_damage=Causa %1 de dano a %2 pela fonte %3 blockly.block.damagesource_isequalto=%1 é do tipo %2 blockly.block.direction_compare_axes=As direções %1 e %2 estão no mesmo eixo @@ -872,7 +873,7 @@ blockly.block.direction_iterator=Iterador de direção blockly.block.direction_offset_x=Deslocamento X da direção %1 blockly.block.direction_offset_y=Deslocamento em Y da direção %1 blockly.block.direction_offset_z=Deslocamento de direção Z %1 -blockly.block.direction_opposite=oposto de %1 +blockly.block.direction_opposite=Oposto de %1 blockly.block.direction_random=Direção aleatória blockly.block.direction_rotated_clockwise=%1 girou 90 graus, no sentido horário em torno do eixo Y blockly.block.direction_rotated_counterclockwise=%1 girou 90 graus, no sentido anti-horário em torno do eixo Y @@ -883,8 +884,8 @@ blockly.block.entity_add_item=Adicione %2 %1 para o inventário de %3 blockly.block.entity_add_potion=Adicionar poção %4 de nível %1 por %2 ticks para %3 %5 blockly.block.entity_add_potion_advanced=Adicionar poção %6 de nível %1 por %2 ticks do ambiente %3 e partículas %4 para %5 %7 blockly.block.entity_add_recipe=Adicionar receita %2 para %1 -blockly.block.entity_add_xp=Dê %1 XP para %2 -blockly.block.entity_add_xp_level=Dê %1 níveis de XP para %2 +blockly.block.entity_add_xp=Adicionar %1 XP para %2 +blockly.block.entity_add_xp_level=Adicionar %1 níveis de XP para %2 blockly.block.entity_allow_building=Deixe %2 construir se %1 caso contrario não deixe blockly.block.entity_allow_flying=Deixe %2 voar se %1 caso contrario não deixe blockly.block.entity_armor_value=Valor da armadura de %1 @@ -892,11 +893,11 @@ blockly.block.entity_canusecommand=%2 possui nível de permissão para comandos blockly.block.entity_check_creature_type=%1 tipo de criatura %2 blockly.block.entity_check_main_hand=%1 está segurando %2 blockly.block.entity_checkgamemode=%1 está no modo de jogo %2 -blockly.block.entity_clear_inventory=Limpar inventario de %1 -blockly.block.entity_clearpotions=Retirar todos os efeitos de poção de %1 -blockly.block.entity_close_gui=Feche todas as GUI abertas por %1 +blockly.block.entity_clear_inventory=Limpar inventário de %1 +blockly.block.entity_clearpotions=Limpar todos os efeitos de poção de %1 +blockly.block.entity_close_gui=Fechar qualquer interface gráfica aberta para %1 blockly.block.entity_create=%1 instância de entidade estática do tipo %2 (sem spawn) -blockly.block.entity_data_logic_get=Para a entidade customizada %1 do tipo %2, obter valor do parâmetro lógico %3 +blockly.block.entity_data_logic_get=Para a entidade personalizada %1 do tipo %2 obter o valor do parâmetro de dados %3 blockly.block.entity_data_logic_set=Para entidade personalizada %1 do tipo %2 definir o valor do parâmetro de dados lógicos %3 para %4 blockly.block.entity_despawn=Desinvocar %1 %2 blockly.block.entity_dimension_id=ID da dimensão que %1 está @@ -905,31 +906,31 @@ blockly.block.entity_direction_value=Direção de %1 blockly.block.entity_disable_damage=Desabilitar o dano dê %2 se %1 caso contrario deixe ativado blockly.block.entity_execute_command=Executar comando /%1 no nome de %2 %3 blockly.block.entity_extinguish=Extinguir %1 -blockly.block.entity_foodlevel=Pegue o nível de comida de %1 -blockly.block.entity_get_absorption=Obter nível de absorção de vida de %1 -blockly.block.entity_get_armor_slot_item=Pegue o item do slot de armadura %1 de %2 +blockly.block.entity_foodlevel=Obter o nível alimentar de %1 +blockly.block.entity_get_absorption=Obter o nível de absorção de vida de %1 +blockly.block.entity_get_armor_slot_item=Obter o item do slot de armadura %1 de %2 blockly.block.entity_get_controlling_passenger=%2 Obter o passageiro que está controlando %1 blockly.block.entity_get_first_passenger=%2 Obtém o primeiro passageiro de %1 -blockly.block.entity_get_fire_ticks=Obter ticks em fogo restantes de %1 -blockly.block.entity_get_oxygen=Receber oxigênio de %1 -blockly.block.entity_get_saturation=Obter nível de saturação de comida de %1 +blockly.block.entity_get_fire_ticks=Obter os ticks restantes de incêndio de %1 +blockly.block.entity_get_oxygen=Obter o nível de oxigênio de %1 +blockly.block.entity_get_saturation=Obter o nível de saturação alimentar de %1 blockly.block.entity_get_scoreboard_score=Pegue a tabela de score de %2 score\: %1 -blockly.block.entity_get_shootpower=Obter poder de tiro se %1 é um projétil -blockly.block.entity_get_slot=Pegua a cópia do item no slot %1 de %2 se ele ter inventario +blockly.block.entity_get_shootpower=Obter o poder de disparo se %1 for um projétil +blockly.block.entity_get_slot=Obter uma cópia do item do slot %1 de %2 se tiver inventário blockly.block.entity_getowner=%2 Obter o dono de %1 se domesticado blockly.block.entity_getridingentity=Se a entidade %1 está montada blockly.block.entity_gettargetentity=Pegue o alvo de ataque de %1 blockly.block.entity_has_achievement=%1 Completou a conquista %2 %3 blockly.block.entity_has_recipe=%1 desbloqueou a receita %2 -blockly.block.entity_has_item_inventory=%2 possui em seu inventario %1 +blockly.block.entity_has_item_inventory=%2 possui %1 no inventário blockly.block.entity_has_nogravity=%1 não tem gravidade blockly.block.entity_haspotioneffect=%1 ativou a poção %2 blockly.block.entity_health=Vida atual de %1 blockly.block.entity_health_max=Vida máxima de %1 blockly.block.entity_inventory_foreach=Para cada slot de inventário de %1 obter cópia de conteúdo como %2 faça %3 -blockly.block.entity_is_elytra_flying=Está %1 elytra voando -blockly.block.entity_is_glowing=%1 está brilhando -blockly.block.entity_is_swimming=%1 está nadando +blockly.block.entity_is_elytra_flying=%1 estiver voando de élitro +blockly.block.entity_is_glowing=%1 estiver brilhando +blockly.block.entity_is_swimming=%1 estiver nadando blockly.block.entity_is_tagged_in=É %1 marcado em etiquetas de entidade como %2 blockly.block.entity_isalive=É %1 vivo blockly.block.entity_isbeingridden=%1 Está sendo montado @@ -938,23 +939,23 @@ blockly.block.entity_isburning=%1 Está queimando blockly.block.entity_ischild=É %1 filho blockly.block.entity_iscreative=%1 Está com a habilidade de modo criativo ativa blockly.block.entity_isimmunetoexplosions=É %1 imune a explosões -blockly.block.entity_isimmunetofire=É %1 imune ao fogo -blockly.block.entity_isinlava=%1 está na lava -blockly.block.entity_isinvisible=É %1 invisível -blockly.block.entity_isinvulnerable=É %1 invulnerável -blockly.block.entity_isinwall=%1 está dentro de uma parede sólida -blockly.block.entity_isinwater=%1 está na água -blockly.block.entity_isinwater_orbubblecolumn=%1 está em na água ou em uma coluna de bolhas -blockly.block.entity_isinwaterrain_orbubblecolumn=%1 está na água, chuva ou coluna de bolhas -blockly.block.entity_isleashed=%1 está laçado -blockly.block.entity_isnonboss=Pode %1 mudar dimensões -blockly.block.entity_isonground=%1 está no chão -blockly.block.entity_isriding=%1 Está montado -blockly.block.entity_issleeping=%1 está dormindo -blockly.block.entity_issneaking=%1 Está esgueirando -blockly.block.entity_issprinting=%1 Está correndo -blockly.block.entity_istamed=%1 É domesticado -blockly.block.entity_istamed_by=%1 é domesticado por %2 +blockly.block.entity_isimmunetofire=%1 for imune ao fogo +blockly.block.entity_isinlava=%1 estiver na lava +blockly.block.entity_isinvisible=%1 estiver invisível +blockly.block.entity_isinvulnerable=%1 for invulnerável +blockly.block.entity_isinwall=%1 estiver dentro de uma parede sólida +blockly.block.entity_isinwater=%1 estiver na água +blockly.block.entity_isinwater_orbubblecolumn=%1 estiver na água ou em coluna de bolhas +blockly.block.entity_isinwaterrain_orbubblecolumn=%1 estiver na água, chuva, ou coluna de bolhas +blockly.block.entity_isleashed=%1 estiver amarrado(a) +blockly.block.entity_isnonboss=%1 pode alterar dimensões +blockly.block.entity_isonground=%1 estiver no chão +blockly.block.entity_isriding=%1 estiver montado(a) +blockly.block.entity_issleeping=%1 estiver dormindo +blockly.block.entity_issneaking=%1 estiver se esgueirando +blockly.block.entity_issprinting=%1 estiver correndo +blockly.block.entity_istamed=%1 estiver domado +blockly.block.entity_istamed_by=%1 estiver domesticado por %2 blockly.block.entity_iteminhand=Item na mão principal de %1 blockly.block.entity_iteminoffhand=Item na mão secundaria de %1 blockly.block.entity_look_angle_x=Valor X do vetor de ângulo de aparência de %1 @@ -966,54 +967,54 @@ blockly.block.entity_lookpos_x=Posição X de %2 com modo de bloco de distância blockly.block.entity_lookpos_y=Posição Y de %2 com modo de bloco de distância %1 em modo %3 modo de bloco %4 blockly.block.entity_lookpos_z=Posição Z de %2 com raytrace de distância %1 modo de fluido %3 modo de bloco %4 blockly.block.entity_loot_table_foreach=Para cada item da loot table %1 concedido para %2 como %3 %4 %5 para %6 -blockly.block.entity_makeride=Faça %1 montar %2 +blockly.block.entity_makeride=Fazer %1 montar %2 blockly.block.entity_maketamed=Domar %1 por %2 -blockly.block.entity_makestopriding=Fazer %1 parar de montar em entidade -blockly.block.entity_name=Pegue o nome de exibição de %1 -blockly.block.entity_nbt_logic_get=Obter a lógica personalizada da tag NBT %1 de %2 -blockly.block.entity_nbt_logic_set=Definir a lógica personalizada da tag NBT %1 de %3 para %2 -blockly.block.entity_nbt_num_get=Obter a tag NBT de número personalizado %1 de %2 -blockly.block.entity_nbt_num_set=Definir a tag NBT de número personalizado %1 de %3 para %2 -blockly.block.entity_nbt_text_get=Obter a tag NBT de texto personalizado %1 de %2 -blockly.block.entity_nbt_text_set=Definir a tag NBT de texto personalidado %1 de %3 para %2 -blockly.block.entity_override_fall=Substituir a distancia de queda de %2 com %1 blocos para o proximo tick +blockly.block.entity_makestopriding=Fazer %1 parar de montar na entidade +blockly.block.entity_name=Obter o nome de exibição de %1 +blockly.block.entity_nbt_logic_get=Obter a etiqueta lógica NBT %1 de %2 +blockly.block.entity_nbt_logic_set=Definir a etiqueta lógica NBT %1 de %3 para %2 +blockly.block.entity_nbt_num_get=Obter a etiqueta numérica NBT %1 de %2 +blockly.block.entity_nbt_num_set=Definir a etiqueta numérica NBT %1 de %3 para %2 +blockly.block.entity_nbt_text_get=Obter a etiqueta textual NBT %1 de %2 +blockly.block.entity_nbt_text_set=Definir a etiqueta textual NBT %1 de %3 para %2 +blockly.block.entity_override_fall=Substituir a distância de queda de %2 com %1 blocos para o próximo tick blockly.block.entity_passengers_direct_foreach=Para cada passageiro direto de %1 como %2 faça %3 blockly.block.entity_passengers_indirect_foreach=Para cada passageiro direto ou indireto de %1 como %2 faça %3 blockly.block.entity_pathfind_to=Tentar fazer %1 encontrar o caminho e mover para x\: %2 y\: %3 z\: %4 com fator de velocidade %5 blockly.block.entity_pitch=Arco da cabeça de %1 em graus -blockly.block.entity_pos_x=Posição X de%1 -blockly.block.entity_pos_y=Posição Y de%1 +blockly.block.entity_pos_x=Posição X de %1 +blockly.block.entity_pos_y=Posição Y de %1 blockly.block.entity_pos_z=Posição Z de %1 -blockly.block.entity_potioneffectlevel=Obter nível/amplificação de efeito da poção %2 para %1 -blockly.block.entity_potioneffectremaining=Obter ticks restantes da poção %2 para %1 -blockly.block.entity_registry_name=Pegue o nome registrado de %1 -blockly.block.entity_remove_item=Remova %2 %1 do inventario principal de %3 +blockly.block.entity_potioneffectlevel=Obter o nível de efeito da poção %2 para %1 +blockly.block.entity_potioneffectremaining=Obter os ticks restantes da poção %2 para %1 +blockly.block.entity_registry_name=Obter o nome de registro de %1 +blockly.block.entity_remove_item=Remover %2 %1 do inventário principal de %3 blockly.block.entity_remove_recipe=Remover receita %2 de %1 blockly.block.entity_remove_specific_potion_effect=Remover efeito de poção específico %2 do %1 blockly.block.entity_remove_xp=Remover %1 XP de %2 -blockly.block.entity_remove_xp_level=Remova %1 níveis de XP de %2 +blockly.block.entity_remove_xp_level=Remover %1 níveis de XP de %2 blockly.block.entity_run_function=Executar função %1 no nome de %2 %3 -blockly.block.entity_send_chat=Mande a mensagem\: %1 para %3 mostrar na barra de ação\: %2 %4 -blockly.block.entity_set_armor_slot_item=Coloque %2 no slot de armadura %1 de %3 -blockly.block.entity_set_display_name=Defina o nome exibido de %2 para %1 -blockly.block.entity_set_fire=Faça %2 Pegar fogo por %1 segundos +blockly.block.entity_send_chat=Enviar a mensagem\: %1 para %3 exibir na barra de ação\: %2 %4 +blockly.block.entity_set_armor_slot_item=Definir %2 no slot de armadura %1 de %3 +blockly.block.entity_set_display_name=Definir nome de exibição de %2 para %1 +blockly.block.entity_set_fire=Incendiar %2 por %1 segundo(s) blockly.block.entity_set_flying=fazer %2 voar se %1 caso contrário não faça -blockly.block.entity_set_foodlevel=Defina o nível de comida de %2 para %1 -blockly.block.entity_set_health=Defina a vida de %2 para %1 -blockly.block.entity_set_mainhand_item=Defina item na mão principal de %3 para %2 %1 +blockly.block.entity_set_foodlevel=Definir nível alimentar de %2 para %1 +blockly.block.entity_set_health=Definir vida de %2 para %1 +blockly.block.entity_set_mainhand_item=Definir item na mão principal de %3 para %2 %1 blockly.block.entity_set_movement=Tentativa de sobrepor vetor de movimento de %4 para vx\: %1 vy\: %2 vz\: %3 blockly.block.entity_set_nogravity=Colocar não-gravidade de %1 para %2 -blockly.block.entity_set_offhand_item=Defina o item na mão secundaria de %3 para %2 %1 -blockly.block.entity_set_oxygen=Define oxigênio de %1 para %2 +blockly.block.entity_set_offhand_item=Definir item na mão secundária de %3 para %2 %1 +blockly.block.entity_set_oxygen=Definir o nível de oxigênio de %1 para %2 blockly.block.entity_set_rotation=Defina rotação de %3 yaw\: %1 pitch\: %2 -blockly.block.entity_set_saturation=Definir saturação de comida de %1 para %2 -blockly.block.entity_set_scoreboard_score=Defina o score %1 para %2 na tabela de score de %3 -blockly.block.entity_set_slot=Coloque %4 %3 no slot %1 de %2 se ele ter inventario -blockly.block.entity_set_sneaking=Definir agachar de %1 para %2 -blockly.block.entity_set_spawn=Defina o spawn de %4 para x\: %1 y\: %2 z\: %3 +blockly.block.entity_set_saturation=Definir a saturação alimentar de %1 para %2 +blockly.block.entity_set_scoreboard_score=Definir a pontuação %1 para %2 no placar de %3 +blockly.block.entity_set_slot=Definir %4 %3 no slot %1 de %2 se tiver inventario +blockly.block.entity_set_sneaking=Definir o esgueiramento de %1 para %2 +blockly.block.entity_set_spawn=Definir o spawn de %4 para x\: %1 y\: %2 z\: %3 blockly.block.entity_set_sprinting=Definir corrida de %1 para %2 blockly.block.entity_set_target=Definir o alvo de ataque de %1 para %2 -blockly.block.entity_setinweb=Coloque %1 na teia de aranha por um tick +blockly.block.entity_setinweb=Definir %1 em teia de aranha por um tick blockly.block.entity_size_height=Pegar altura de %1 blockly.block.entity_size_width=Pegue a largura de %1 blockly.block.entity_stop_navigation=Tentar de parar a navegação de %1 @@ -1037,11 +1038,11 @@ blockly.block.get_command_parameter_number=Obter parâmetro de número do comand blockly.block.get_command_parameter_string=Obter parâmetro de linha do comando %1 blockly.block.get_dimensionid=%1 blockly.block.get_localized_text=Obter texto localizado para a chave %1 %2 -blockly.block.gui_clear_slot=Limpar slot %1 da GUI atualmente aberta de %2 -blockly.block.gui_damage_item=Dê %1 de dano para o item no slot %2 da GUI atualmente aberta de %3 -blockly.block.gui_get_amount_inslot=Pegue o número de items no slot %1 da GUI atualmente aberta de %2 -blockly.block.gui_get_item_inslot=Pegue o item do slot %1 da GUI atualmente aberta de %2 -blockly.block.gui_get_text_textfield=Obter texto dentro do campo de texto %1 %2 +blockly.block.gui_clear_slot=Limpar slot %1 da interface gráfica aberta de %2 +blockly.block.gui_damage_item=Causar %1 de dano ao item do slot %2 da interface gráfica aberta de %3 +blockly.block.gui_get_amount_inslot=Obter o número de itens do slot %1 da interface gráfica aberta de %2 +blockly.block.gui_get_item_inslot=Obter o item do slot %1 da interface gráfica aberta de %2 +blockly.block.gui_get_text_textfield=Obter o texto dentro do campo de texto %1 %2 blockly.block.gui_get_value_checkbox=A caixa de seleção %1 tem %2 marcada blockly.block.gui_set_text_textfield=Definir o texto dentro do campo de texto %1 para %3 %2 blockly.block.gui_remove_items=Remover %1 itens do slot %2 da GUI atualmente aberta de %3 @@ -1049,31 +1050,31 @@ blockly.block.gui_set_items=Coloque %1 %3 no slot %2 da GUI atualmente aberta de blockly.block.item_add_enhancement=Adicione um encantamento %3 de nível %1 a %2 blockly.block.item_bucket_to_fluid=Converter balde %2 %1 para fluido %3 ou AR se a conversão falhar blockly.block.item_can_harvest=%3 %1 Pode coletar %4 %2 -blockly.block.item_can_smelt=%1 Pode ser cozinhado -blockly.block.item_check_rarity=É %1 de raridade %2 +blockly.block.item_can_smelt=%1 pode ser fundido +blockly.block.item_check_rarity=%1 é de raridade %2 blockly.block.item_cooldown_for=Tempo de recarga %3 por %1 ticks por %2 -blockly.block.item_damage=Dê %1 de dano para %2 +blockly.block.item_damage=Causar %1 de dano para %2 blockly.block.item_enchanted_with_xp=%1 Encantado com %2 níveis de EXP, encantamentos de tesouro\: %3 -blockly.block.item_fuel_power=Pegue poder de combustível %1 -blockly.block.item_get_damage=Pegue o dano de %1 +blockly.block.item_fuel_power=Obter o poder de combustão de %1 +blockly.block.item_get_damage=Obter o dano de %1 blockly.block.item_get_enhancement=Pegue o nível de encantamento %2 de %1 -blockly.block.item_get_max_damage=Pegue a durabilidade de %1 +blockly.block.item_get_max_damage=Obter o dano máximo possível de %1 blockly.block.item_is_cooldown=%2 está em espera por %1 -blockly.block.item_is_enchantable=%1 É encantavel -blockly.block.item_is_enchanted=%1 está encantado -blockly.block.item_istype=É %1 do tipo de item %2 -blockly.block.item_is_food=É %1 comida -blockly.block.item_get_food_value=Obter valor de comida de %1 -blockly.block.item_get_saturation_value=Obter valor de saturação de %1 -blockly.block.item_get_harvest_level=Obter nível de colheita de %1 -blockly.block.item_name=Pegue o nome exibido de %1 -blockly.block.item_nbt_copy=Copiar etiquetas NBT de %1 (se tiver alguma) em %2 -blockly.block.item_nbt_logic_get=Pegue a tag NBT lógica %1 de %2 -blockly.block.item_nbt_logic_set=Defina a tag NBT lógica %1 de %3 para %2 -blockly.block.item_nbt_num_get=Pegue a tag NBT numérica %1 de %2 -blockly.block.item_nbt_num_set=Defina a tag NBT numérica %1 de %3 para %2 -blockly.block.item_nbt_text_get=Pegue a tag NBT do tipo texto %1 de %2 -blockly.block.item_nbt_text_set=Defina a tag NBT do tipo texto %1 de %3 para %2 +blockly.block.item_is_enchantable=%1 for encantável +blockly.block.item_is_enchanted=%1 estiver encantado +blockly.block.item_istype=%1 for do tipo de item %2 +blockly.block.item_is_food=%1 for comestível +blockly.block.item_get_food_value=Obter o valor alimentar de %1 +blockly.block.item_get_saturation_value=Obter o valor de saturação de %1 +blockly.block.item_get_harvest_level=Obter o nível de coleta de %1 +blockly.block.item_name=Obter o nome de exibição de %1 +blockly.block.item_nbt_copy=Copiar etiquetas NBT de %1 (se houver alguma) em %2 +blockly.block.item_nbt_logic_get=Obter a etiqueta lógica NBT %1 de %2 +blockly.block.item_nbt_logic_set=Definir etiqueta lógica NBT %1 de %3 para %2 +blockly.block.item_nbt_num_get=Obter a etiqueta numérica NBT %1 de %2 +blockly.block.item_nbt_num_set=Definir etiqueta numérica NBT %1 de %3 para %2 +blockly.block.item_nbt_text_get=Obter a etiqueta textual NBT %1 de %2 +blockly.block.item_nbt_text_set=Definir etiqueta textual NBT %1 de %3 para %2 blockly.block.item_random_from_tag=Item aleatório da tag %1 ou AR se nenhum item for encontrado blockly.block.item_registry_name=Pegue o nome registrado de %1 blockly.block.item_set_damage=Defina o dano de %2 para %1 @@ -1086,15 +1087,15 @@ blockly.block.itemhandler_set_slot=Coloque %4 %3 no slot %1 de %2 se ter inventa blockly.block.itemstack_get_count=Pegue o número de itens em %1 blockly.block.itemstack_get_max_stack_size=Obter a pilhagem máxima de %1 blockly.block.itemstack_is_stackable=%1 É empilhável -blockly.block.itemstack_is_damaged=%1 Está danificado -blockly.block.itemstack_is_damageable=%1 É danificável +blockly.block.itemstack_is_damaged=%1 estiver danificado +blockly.block.itemstack_is_damageable=%1 for danificável blockly.block.itemstack_grow=Aumente %2 por %1 blockly.block.itemstack_has_enchantment=%1 tem encantamento %2 -blockly.block.itemstack_iterator=Iterador de Itemstack +blockly.block.itemstack_iterator=Iterador de Pilha de Itens blockly.block.itemstack_remove_specific_enchantment=Remover encantamento específico %2 de %1 blockly.block.itemstack_set_count=Defina o número de itens em %2 para %1 blockly.block.itemstack_shrink=Diminui %1 por %2 -blockly.block.itemstack_to_mcitem=Itemstack fornecido +blockly.block.itemstack_to_mcitem=Pilha de itens provida blockly.block.logic_entity_compare=%1 é (sub)tipo de %2 blockly.block.loot_table_foreach=Para cada item da loot table %1 como %2 %3 %4 fazer %5 blockly.block.math_random_int_between=Inteiro aleatório entre o min\: %1 e máx\: %2 incluído @@ -1102,49 +1103,49 @@ blockly.block.math_random_number_between=Número aleatório entre mín\: %1 e m blockly.block.mcitem_to_block=Converta %2 %1 para %3 ou ar se a conversão falhar blockly.block.move_entity=Defina localização de %4 para x\: %1 y\: %2 z\: %3 blockly.block.place_schematic=Coloque o arquivo de estrutura NBT %6 %7 em x\: %1 y\: %2 z\: %3 com rotação\: %4 espelhado\: %5 %8 -blockly.block.projectile_shoot_from_entity=Dispare %1 a partir da entidade\: %2 com velocidade\: %3 imprecisão\: %4 %5 -blockly.block.projectile_shoot_from_pos=Dispare %1 a partir de x\: %2 y\: %3 z\: %4 com direção dx\: %5 dy\: %6 dz\: %7, velocidade\: %8 e imprecisão de\: %9 %10 -blockly.block.projectiles_arrow=Flecha de tipo %1 com dano\: %2, repulsão\: %3, penetração\: %4, atirador\: %5, fogo\: %6, partículas\: %7 e tipo de coleta\: %8 -blockly.block.projectiles_fireball=Bola de fogo de tipo %1 com aceleração ax\: %2 ay\: %3 az\: %4 e atirador\: %5 -blockly.block.projectiles_throwable=Projétil jogável do tipo %1 com atirador\: %2 +blockly.block.projectile_shoot_from_entity=Disparar %1 a partir da entidade\: %2 com velocidade\: %3 imprecisão\: %4 %5 +blockly.block.projectile_shoot_from_pos=Disparar %1 a partir de x\: %2 y\: %3 z\: %4 com direção dx\: %5 dy\: %6 dz\: %7, velocidade\: %8 imprecisão\: %9 %10 +blockly.block.projectiles_arrow=Flecha de tipo %1 com dano\: %2 repulsão\: %3 penetração\: %4 atirador\: %5 fogo\: %6, partículas\: %7 tipo de coleta\: %8 +blockly.block.projectiles_fireball=Bola de fogo de tipo %1 com aceleração ax\: %2 ay\: %3 az\: %4 atirador\: %5 +blockly.block.projectiles_throwable=Projétil arremessável de tipo %1 com atirador\: %2 blockly.block.provided_dimensionid=Tipo de dimensão fornecida -blockly.block.run_function=Iniciar a função %1 em x\: %2 y\: %3 z\: %4 %5 -blockly.block.set_global_spawn=Defina o spawn global para x\: %1 y\: %2 z\: %3 +blockly.block.run_function=Executar função %1 em x\: %2 y\: %3 z\: %4 %5 +blockly.block.set_global_spawn=Definir spawn global em x\: %1 y\: %2 z\: %3 blockly.block.set_time=Definir horário para %1 %2 blockly.block.spawn_entity=Invocar entidade\: %4 em x\: %1 y\: %2 z\: %3 %5 blockly.block.spawn_entity_with_rotation=Invocar entidade\: %6 em x\: %1 y\: %2 z\: %3 com grau\: %4 tom\: %5 %7 blockly.block.spawn_entity_with_rotation_velocity=Invocar entidade\: %9 no x\: %1 y\: %2 z\: %3 com grau\: %4 tom\: %5 vx\: %6 vy\: %7 vz\: %8 %10 blockly.block.spawn_particle=Spawnar partícula única em x\: %1 y\: %2 z\: %3 com vx\: %4 vy\: %5 vz\: %6 tipo\: %7 blockly.block.spawn_particle_multi=Invocar %8 partículas no servidor em x\: %1 y\: %2 z\: %3 na área de dx\: %4 dy\: %5 dz\: %6 com velocidade de %7 tipo\: %9 %10 -blockly.block.spawn_xporb=Invocar orbe de XP no x\: %2 y\: %3 z\: %4 com quantidade de XP de %1 %5 +blockly.block.spawn_xporb=Invocar orbe de XP em x\: %2 y\: %3 z\: %4 com quantidade de XP de %1 %5 blockly.block.strike_lightning=Cair um trovão em x\: %1 y\: %2 z\: %3 efeito\: %4 %5 blockly.block.wait=Aguarde %1 %2 ticks depois no lado do servidor %5 %3 fazer %4 blockly.block.world_data_heightat=Obter altura %3 em x\: %1 z\: %2 blockly.block.world_data_biomeat=É bioma em x\:%1 y\: %2 z %3 tipo %4 -blockly.block.world_data_biomeat_tag=O bioma no X\: %1 Y\: %2 Z\: %3 tem a tag de %4 -blockly.block.world_data_block_direction_at=Pegue a direção do bloco em x\: %1 y\: %2 z\: %3 -blockly.block.world_data_blockat=Pegue o bloco em x\: %1 y\: %2 z\: %3 %4 -blockly.block.world_data_canseesky=Pode localizar em x\: %1 y\: %2 z\: %3 veja o céu -blockly.block.world_data_checkdifficulty=É a dificuldade no mundo %1 -blockly.block.world_data_current_time=Pegue o tempo do mundo atual -blockly.block.world_data_dimensionid=Pegue a ID da dimensão do mundo fornecido -blockly.block.world_data_fluidat=Pegar o fluido como bloco em %1 y\: %2 z\: %3 %4 -blockly.block.world_data_get_indirect_power=Pegue a força indireta no bloco em x\: %1 y\: %2 z\: %3 -blockly.block.world_data_get_redstone_power=Pegue a força da redstone no lado %4 do bloco em x\: %1 y\: %2 z\: %3 -blockly.block.world_data_is_block_powered=O bloco em x\: %1 y\: %2 z\: %3 é energizado por redstone -blockly.block.world_data_isair=É ar em x\: %1 y\: %2 z\: %3 -blockly.block.world_data_isday=É dia no mundo %1 -blockly.block.world_data_israining=Está chovendo no mundo fornecido -blockly.block.world_data_isremote=Mundo fornecido é remoto -blockly.block.world_data_isthundering=Está trovejando no mundo fornecido %1 -blockly.block.world_data_light_level=Pegue o nível de luz em x\: %1 y\: %2 z\: %3 -blockly.block.world_data_moon_phase=Pegue o fator da fase da lua +blockly.block.world_data_biomeat_tag=O bioma em x\: %1 y\: %2 z\: %3 estiver etiquetado nas etiquetas de bioma como %4 +blockly.block.world_data_block_direction_at=Obter a direção do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.world_data_blockat=Obter o bloco em x\: %1 y\: %2 z\: %3 %4 +blockly.block.world_data_canseesky=Pode ver o céu em x\: %1 y\: %2 z\: %3 +blockly.block.world_data_checkdifficulty=A dificuldade no mundo provido for %1 +blockly.block.world_data_current_time=Obter o horário do mundo +blockly.block.world_data_dimensionid=Obter o ID da dimensão do mundo provido +blockly.block.world_data_fluidat=Obter fluido como bloco em x\: %1 y\: %2 z\: %3 %4 +blockly.block.world_data_get_indirect_power=Obter a força indireta do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.world_data_get_redstone_power=Obter a força de redstone no lado %4 do bloco em x\: %1 y\: %2 z\: %3 +blockly.block.world_data_is_block_powered=O bloco em x\: %1 y\: %2 z\: %3 for energizado por redstone +blockly.block.world_data_isair=For ar em x\: %1 y\: %2 z\: %3 +blockly.block.world_data_isday=For dia no mundo provido %1 +blockly.block.world_data_israining=Estiver chovendo no mundo provido +blockly.block.world_data_isremote=O mundo provido estiver no cliente +blockly.block.world_data_isthundering=Estiver trovejando no mundo provido %1 +blockly.block.world_data_light_level=Obter o nível de iluminação em x\: %1 y\: %2 z\: %3 +blockly.block.world_data_moon_phase=Obter o fator da fase da lua blockly.block.world_data_number_players_server=Número de jogadores conectados ao servidor -blockly.block.world_data_number_players_world=Número de jogadores no mundo fornecido -blockly.block.world_data_spawn_x=Pegue a coordenada X do spawn do mundo atual -blockly.block.world_data_spawn_y=Pegue a coordenada Y do spawn do mundo atual -blockly.block.world_data_spawn_z=Pegue a coordenada Z do spawn do mundo atual -blockly.block.world_data_temperature=Pegua a temperatura do bioma em x\: %1 y\: %2 z\: %3 +blockly.block.world_data_number_players_world=Número de jogadores no mundo provido +blockly.block.world_data_spawn_x=Obter a coordenada X de spawn do mundo atual +blockly.block.world_data_spawn_y=Obter a coordenada Y de spawn do mundo atual +blockly.block.world_data_spawn_z=Obter a coordenada Z de spawn do mundo atual +blockly.block.world_data_temperature=Obter a temperatura do bioma em x\: %1 y\: %2 z\: %3 blockly.block.world_entity_inrange=%5 Pegar entidade mais próxima em x\: %1 y\: %2 z\: %3 em cubo quadrado com tamanho %4 do tipo %6 blockly.block.world_entity_inrange_exists=Entidade existe em x\: %1 y\: %2 z\: %3 em cubo quadrado com tamanho %4 do tipo %5 blockly.block.world_entity_inrange_foreach=Para cada entidade como %5 em x\: %1 y\: %2 z\: %3 no cubo quadrado com tamanho %4 para %6 @@ -1209,7 +1210,7 @@ blockly.block.string=String do tipo %2 parâmetro %1 %3 %4 blockly.block.string.tooltip="texto citável" permite ter uma frase citada. blockly.block.entity=Parâmetro de entidade %1 para %2 %3 %4 blockly.block.item=Parâmetro de item %1 %2 %3 -blockly.block.is_mod_loaded=O mod com ID %1 está carregado +blockly.block.is_mod_loaded=O mod com o ID %1 estiver carregado blockly.block.message=Parâmetro da mensagem %1 %2 %3 blockly.block.message.tooltip=Um argumento da mensagem é usado para comandos como /ban ou /kick. blockly.block.literal=Parâmetro literal %1 %2 %3 @@ -1226,13 +1227,13 @@ blockly.block.cancel_event.line1=Cancelar evento que acionou o trigger global blockly.block.cancel_event.line2=Only works with cancelable global triggers blockly.block.set_event_result.line1=Definir resultado do evento de gatilho global para blockly.block.set_event_result.line2=Funciona apenas com triggers globais com um resultado -blockly.block.call_procedure=Chamar/acionar o procedure -blockly.block.procedure_retval=Chamar/acionar o procedure e pegar o valor de retorno +blockly.block.call_procedure=Chamar procedimento +blockly.block.procedure_retval=Chamar procedimento e obter valor de retorno blockly.block.block_holderset_list=Lista de blocos\: blockly.block.block_holderset_list.empty=(Lista vazia) blockly.block.block_holderset_list.input=bloco\: blockly.block.call_procedure.at=\ em -blockly.block.block_holderset_tag=Tag do bloco\: %1 +blockly.block.block_holderset_tag=Etiqueta do bloco\: %1 blockly.block.block_predicate_all_of=Todas as condições são atendidas\: blockly.block.block_predicate_all_of.empty=(Sempre) blockly.block.block_predicate_all_of.input=condição\: @@ -1241,8 +1242,8 @@ blockly.block.block_predicate_any_of.empty=(Nunca) blockly.block.block_predicate_any_of.input=condição\: blockly.block.block_predicate_inside_world=Posição deslocada por x\: %1 y\: %2 z\: %3 está dentro dos limites do mundo blockly.block.block_predicate_has_sturdy_face=Bloco deslocado de posição x\: %1 y\: %2 z\: %3 com face sólida %4 -blockly.block.block_predicate_is_air=É ar na posição atual -blockly.block.block_predicate_is_air_or_water=É ar ou água na posição atual +blockly.block.block_predicate_is_air=For ar na posição atual +blockly.block.block_predicate_is_air_or_water=For ar ou água na posição atual blockly.block.block_predicate_matching_blocks=Bloco deslocado de posição x\: %2 y\: %3 z\: %4 esta na lista de blocos ou tag\: %1 blockly.block.block_predicate_mutator.container=Lista de condições blockly.block.block_predicate_mutator.input=Condição @@ -1309,16 +1310,15 @@ blockly.block.weighted_list.weight=peso\: blockly.block.weighted_list.entry=entrada\: blockly.block.weighted_list_mutator.container=Lista de entradas blockly.block.weighted_list_mutator.input=Entrada -blockly.block.aitasks_container=Lista de tarefas / objetivos IA +blockly.block.aitasks_container=Lista de tarefas/objetivos da IA blockly.block.aitasks_container.tip=Tarefas superiores da lista têm maior prioridade -blockly.block.aitasks_container.tooltip=Este é o ponto de inicio da lista de tarefas da IA. +blockly.block.aitasks_container.tooltip=Este é o ponto de partida da lista de tarefas da IA. blockly.block.cmdargs_start=Ponto de entrada de comando -blockly.block.advancement_trigger=Conceder esta conquista ao jogador -blockly.block.advancement_trigger.tooltip=Conecte um bloco de trigger que aciona esta conquista a este bloco +blockly.block.advancement_trigger=Conceder se todos os critérios abaixo forem atendidos blockly.block.feature_container=Recurso configurado blockly.block.feature_container.tooltip=Este é o tipo de recurso a definir blockly.block.feature_container.with_placement=com posicionamento -blockly.block.set_var=Colocar +blockly.block.set_var=Definir blockly.block.set_to=para\: blockly.block.get_var=Obter blockly.block.var_for_entity=para a entidade\: @@ -1333,16 +1333,16 @@ blockly.block.damagesource_from_type_cause=Fonte de dano do tipo\: %1 causado po blockly.block.damagesource_from_type_cause_directcause=Fonte de dano do tipo\: %1 causado por\: %2 causa direta\: %3 blockly.block.damagesource_get_direct_entity=%2 Obter entidade que causou diretamente %1 blockly.block.damagesource_get_entity=%2 Obter entidade que causou %1 -blockly.block.damagesource_get_exhaustion=Obter valor de exaustão de %1 +blockly.block.damagesource_get_exhaustion=Obter o valor de exaustão de %1 blockly.block.damagesource_is_cause_creative=É %1 causada por um jogador no modo criativo blockly.block.damagesource_is_indirect=É %1 indireto blockly.block.damagesource_is_tagged_in=O tipo %1 está etiquetado nas etiquetas de tipo de dano como %2 blockly.block.direction_from_deps=Direção / face do gatilho blockly.block.direction_unspecified=Qualquer direção -blockly.block.java_code=Fragmento de código personalizado\: +blockly.block.java_code=Trecho de código personalizado\: blockly.block.logic_ternary_op.if=Se blockly.block.logic_ternary_op.then=então -blockly.block.logic_ternary_op.else=se não +blockly.block.logic_ternary_op.else=senão blockly.block.controls_while=Enquanto blockly.block.math_from_text=Número do texto blockly.block.text_replace.replace=Substituir\: @@ -1357,7 +1357,7 @@ blockly.block.text_format_number.format=Formatar número\: blockly.block.text_format_number.as=como\: blockly.block.text_is_empty=O texto está vazio\: blockly.block.text_trim=Aparar texto\: -blockly.block.text_uppercase=Texto em Maiúsculo\: +blockly.block.text_uppercase=Texto em maiúsculo\: blockly.block.text_lowercase=Texto em minúsculo\: blockly.block.text_starts_with.check=iniciar com\: blockly.block.text_ends_with.check=terminar com\: @@ -1365,7 +1365,7 @@ blockly.block.time_as_string=Tempo como texto blockly.block.time_to_formatted_string=Hora como texto formatado blockly.block.time_day_of_week=Dia da semana atual blockly.block.time_day_of_month=Dia do mês atual -blockly.block.time_hours=Horário do dia atual +blockly.block.time_hours=Horário atual do dia blockly.block.time_minutes=Minutos após a hora atual blockly.block.time_month=Mês atual blockly.block.time_seconds=Segundos após o minuto atual @@ -1384,27 +1384,27 @@ blockly.block.registryname_to_mcitem=Converter nome de registro %1 em item ou AR blockly.block.registryname_to_mcitemblock=Converter nome de registro %1 em bloco ou ar se conversão falhar blockly.extension.data_list_selector.no_entry=Nenhuma entrada selecionada action.workspace.export_mod=Exportar o mod para distribuição -action.workspace.export_mod_deobf=Exportar mod deofuscado... +action.workspace.export_mod_deobf=Exportar mod desofuscado... dialog.workspace.export.message=Por favor, tenha em mente o seguinte ao distribuir seu mod\:

Você está permitido distribuir seu mod gratuitamente sob seus próprios termos ou licenciamento.
Você é obrigado a cumprir outras leis, licenças e termos que se aplicam a você como autor de mods de Minecraft
(ex. EULA do Minecraft, licença do Minecraft Forge, etc...).
Você é bem-vindo a dar créditos ao MCreator e recomendá-lo na página do seu mod.

Por favor, considere fazer uma doação aos desenvolvedores do MCreator para que possamos manter e desenvolver
este software e oferecer suporte e atualizações. Obrigado\! dialog.workspace.export.title=Exportando e distribuindo o mod -dialog.workspace.export_deobf.title=Exportar mod deofuscado -dialog.workspace.export_deobf.message=Deobfuscated mods não funcionarão na instalação normal do minecraft\!
Apenas use essa opção se você tiver uma boa razão para usa-la.

Tem certeza que quer usar essa opção? +dialog.workspace.export_deobf.title=Exportar mod desofuscado +dialog.workspace.export_deobf.message=Mods desofuscados não funcionarão na instalação normal do Minecraft\!
Apenas use esta opção se você tiver uma boa razão para usá-la.

Tem certeza que quer usar esta opção? dialog.workspace.export.option.donate_and_export=Doar e exportar o mod dialog.workspace.export.option.just_export=Exportar o mod sem doar aos desenvolvedores dialog.workspace.export.error.title=Falha ao exportar -action.workspace.import_from_zip=Importar o workspace de um arquivo .zip -action.workspace.new=Novo workspace -action.workspace.open=Abrir workspace -action.workspace.export_workspace=Exportar o workspace para um arquivo .zip compartilhavel -action.workspace.export_workspace_include_run=Exportar em um arquivo .zip compartilhavel (com a pasta "run" que possui mundos/salves, mods, etc)... -dialog.workspace.export_workspace.title=Exportar workspace +action.workspace.import_from_zip=Importar espaço de trabalho de um arquivo compactado compartilhável... +action.workspace.new=Novo espaço de trabalho... +action.workspace.open=Abrir espaço de trabalho... +action.workspace.export_workspace=Exportar o espaço de trabalho para um arquivo compactado compartilhável... +action.workspace.export_workspace_include_run=Exportar para um arquivo compactado compartilhável (com a pasta "run", que possui mundos, mods, etc)... +dialog.workspace.export_workspace.title=Exportar espaço de trabalho action.workspace.regenerate_and_build=Regenerar código e compilar modelement.unknown=Desconhecido modelement.achievement=Conquista modelement.armor=Armadura modelement.biome=Bioma modelement.block=Bloco -modelement.code=Elemento customizado +modelement.code=Elemento personalizado modelement.command=Comando modelement.dimension=Dimensão modelement.enchantment=Encantamento @@ -1413,30 +1413,30 @@ modelement.fluid=Fluido modelement.food=Comida modelement.fuel=Combustível modelement.function=Função -modelement.gui=GUI +modelement.gui=Interface Gráfica modelement.item=Item -modelement.keybind=Função de tecla -modelement.loottable=Tabela de looting -modelement.livingentity=Entidade Viva +modelement.keybind=Atalho +modelement.loottable=Tabela de pilhagem +modelement.livingentity=Entidade viva modelement.musicdisc=Disco de música -modelement.overlay=Overlay(Sobreposição) +modelement.overlay=Sobreposição modelement.painting=Pintura modelement.particle=Partícula modelement.plant=Planta -modelement.potioneffect=Efeito da poção -modelement.potion=Ícone da Poção +modelement.potioneffect=Efeito de poção +modelement.potion=Item de poção modelement.procedure=Procedimento modelement.recipe=Receita modelement.structure=Estrutura -modelement.tab=Janela do criativo -modelement.tag=Tag +modelement.tab=Aba do criativo +modelement.tag=Etiqueta modelement.tool=Ferramenta -modelement.villagertrade=Troca de Villager -modelement.unknown.description=Este tipo de elemento mod não existe mais -modelement.achievement.description=Conquista é um texto mostrado quando o jogador faz/completa algo requerido para completa-la, pode ser acessado no painel "Conquistas" do menu pause. -modelement.armor.description=Armadura é o item que você pode vestir e receber proteção. -modelement.biome.description=Bioma é uma área específica definida na geração de mundo, com cor, água e fauna personalizada. -modelement.code.description=Elemento customizado é um elemento com código customizado no editor de códigos. +modelement.villagertrade=Troca de aldeão +modelement.unknown.description=Este tipo de elemento do mod não existe mais +modelement.achievement.description=Conquista é um texto exibido quando um usuário faz algo que é necessário para alcançar. +modelement.armor.description=Armadura é um item que pode ser vestido e lhe dá proteção. +modelement.biome.description=Bioma é uma área específica com geração de mundo, cor, clima e fauna personalizada. +modelement.code.description=Elemento personalizado é definido usando código personalizado no editor de códigos. modelement.command.description=Comandos são textos que podem ativar uma ação(através de procedure) quando o player usa-lo no chat. modelement.dimension.description=Dimensão é um mundo que é gerado, com suas próprias propriedades e tendo um portal. modelement.enchantment.description=Encantamentos é um modificador que adiciona uma habilidade especial ao item que foi encantado. @@ -1468,8 +1468,8 @@ preferences.section.ui=Interface de Usuário preferences.section.ui.description=Nesta página você pode alterar as configurações e parâmetros da interface do usuário. Você precisará reiniciar o MCreator se você alterar essas configurações para que elas tenham efeito. preferences.section.backups=Backups e salvamento preferences.section.backups.description=Nesta página você pode alterar as configurações relacionadas a salvamento automático e backups automatizados do arquivo do projeto na área de trabalho. -preferences.section.blockly=Editor Blockly -preferences.section.blockly.description=Nesta página você pode modificar as preferências do editor que são utilizadas no procedimento, sobreposição e editor de mob. +preferences.section.blockly=Editor de blocos de procedimento +preferences.section.blockly.description=Nesta página você pode modificar as preferências do editor de blocos de procedimento que são usados no editor de procedimento, sobreposição e mob. preferences.section.ide=Editor de código preferences.section.ide.description=Nesta página, você pode modificar as configurações integradas do editor de código. preferences.section.gradle=Gradle e rodar @@ -1489,56 +1489,56 @@ preferences.ui.backgroundSource.description=Especifica qual fonte usar para carr preferences.ui.interfaceTheme=Tema de cor da interface preferences.ui.interfaceTheme.description=O tema de cores usado para a interface. Se alterado, o software precisa ser reiniciado.
AVISO\: Tema Claro é uma função experimental e pode não parecer bom ou não ser utilizável. preferences.ui.textAntialiasingType=Tipo de suavização -preferences.ui.textAntialiasingType.description=A menos que a renderização da fonte não seja boa, deixe como padrão (ativado). -preferences.ui.expandSectionsByDefault=Expandir seções avançadas de interface do usuário por padrão -preferences.ui.expandSectionsByDefault.description=Selecione esta opção para mostrar as seções da IU que são recolhidas por padrão, em estado expandido +preferences.ui.textAntialiasingType.description=A menos que a renderização da fonte não seja boa, deixe isso no padrão (ativado). +preferences.ui.expandSectionsByDefault=Expandir seções avançadas da interface do usuário por padrão +preferences.ui.expandSectionsByDefault.description=Selecione esta opção para exibir as seções da interface do usuário que são recolhidas por padrão, em estado expandido preferences.ui.use2DAcceleration=Acelerar renderização 2D na GPU usando OpenGL -preferences.ui.use2DAcceleration.description=Esta opção pode aumentar o desempenho de renderização em 2D da UI, mas também pode piorar em alguns computadores.
Requer reinicialização do MCreator para ter efeito. -preferences.ui.remindOfUnsavedChanges=Avisar sobre alterações não salvas no editor de elementos mod -preferences.ui.remindOfUnsavedChanges.description=Se habilitado, fechar o editor de elementos de mod sem salvar as alterações, irá sugerir salvá-los -preferences.ui.discordRichPresenceEnable=Habilitar o Rich Presence do Discord -preferences.backups.workspaceAutosaveInterval=Intervalo de auto-salvamento da área de trabalho (em segundos) -preferences.backups.workspaceAutosaveInterval.description=Este parâmetro define quantas vezes a área de trabalho deve ser salvo automaticamente no caso de haver quaisquer alterações.
A área de trabalho também é salvo automaticamente quando o MCreator é fechado. -preferences.backups.automatedBackupInterval=Intervalo automático do tempo de backup (em minutos) -preferences.backups.automatedBackupInterval.description=Este parâmetro define a frequência de backup da área de trabalho.
Valor menor significa backups mais graduais, mas um intervalo de histórico mais curto. -preferences.backups.numberOfBackupsToStore=Número de backups para armazenar -preferences.backups.numberOfBackupsToStore.description=Este número define quantos backups são armazenados.
Se mais do que este número de backups são feitos, os mais antigos serão descartados. -preferences.backups.backupOnVersionSwitch=Faça um backup completo ao abrir a área de trabalho em uma nova versão -preferences.backups.backupOnVersionSwitch.description=Se habilitado, o MCreator fará um backup completo da área de trabalho antes de abrir uma pasta de trabalho em uma nova versão +preferences.ui.use2DAcceleration.description=Esta opção pode aumentar o desempenho da renderização 2D da interface do usuário, mas também pode piorar em alguns computadores.
Requer a reinicialização do MCreator para ter efeito. +preferences.ui.remindOfUnsavedChanges=Avisar sobre alterações não salvas no editor de elementos do mod +preferences.ui.remindOfUnsavedChanges.description=Se ativado, fechar o editor de elementos do mod sem salvar suas alterações sugerirá salvá-las +preferences.ui.discordRichPresenceEnable=Ativar a Presença Rica do Discord +preferences.backups.workspaceAutosaveInterval=Intervalo de salvamento automático do espaço de trabalho (em segundos) +preferences.backups.workspaceAutosaveInterval.description=Este parâmetro define com que frequência o espaço de trabalho deverá ser salvo automaticamente caso haja alterações.
O espaço de trabalho também é salvo automaticamente quando o MCreator é fechado. +preferences.backups.automatedBackupInterval=Intervalo de tempo de cópia de segurança automática (em minutos) +preferences.backups.automatedBackupInterval.description=Este parâmetro define a frequência de cópias de segurança automáticas do espaço de trabalho.
Valores menores significam cópias de seguranças automáticas graduais, mas intervalo de histórico mais curto. +preferences.backups.numberOfBackupsToStore=Número de cópias de segurança para armazenar +preferences.backups.numberOfBackupsToStore.description=Este número define quantas cópias de seguranças serão armazenadas.
Se mais do que esse número de cópias de segurança for feito, as mais antigas serão descartadas. +preferences.backups.backupOnVersionSwitch=Fazer uma cópia de segurança completa ao abrir o espaço de trabalho em uma nova versão +preferences.backups.backupOnVersionSwitch.description=Se ativado, o MCreator fará uma cópia de segurança completa do espaço de trabalho antes de abrir sua pasta em uma nova versão preferences.blockly.blockRenderer=Renderizador de blocos -preferences.blockly.blockRenderer.description=O renderizador (estilo de exibição) dos blocos no editor Blockly -preferences.blockly.useSmartSort=Usar classificação de bloco de procedimento inteligente -preferences.blockly.useSmartSort.description=Quando ativado, os blocos de procedimento serão ordenados de forma inteligente, caso contrário eles serão classificados em ordem alfabética -preferences.blockly.enableComments=Permitir comentários -preferences.blockly.enableComments.description=Ative esta opção para tornar possível anexar comentários aos blocos de procedimento -preferences.blockly.enableCollapse=Deixe os blocos recolhíveis -preferences.blockly.enableCollapse.description=Esta opção faz com que os blocos Blockly sejam recolhidos -preferences.blockly.enableTrashcan=Habilitar lixeira -preferences.blockly.enableTrashcan.description=Esta opção habilita o lixo no editor Blockly +preferences.blockly.blockRenderer.description=O estilo de exibição do renderizador de blocos no editor de blocos +preferences.blockly.useSmartSort=Usar classificação de blocos de procedimento inteligente +preferences.blockly.useSmartSort.description=Quando ativado, os blocos de procedimento serão classificados de maneira inteligente, caso contrário serão classificados em ordem alfabética +preferences.blockly.enableComments=Permitir comentários nos blocos de procedimento +preferences.blockly.enableComments.description=Ative esta opção para tornar possível o anexo de comentários aos blocos de procedimento +preferences.blockly.enableCollapse=Tornar os blocos de procedimento recolhíveis +preferences.blockly.enableCollapse.description=Esta opção torna os blocos de procedimento recolhíveis +preferences.blockly.enableTrashcan=Ativar lixeira +preferences.blockly.enableTrashcan.description=Esta opção ativa a lixeira no editor de blocos de procedimento preferences.blockly.maxScale=Escala máxima de zoom -preferences.blockly.maxScale.description=Escala de zoom máxima suportada no editor Blockly em % +preferences.blockly.maxScale.description=Escala máxima de zoom suportada no editor de blocos de procedimento em % preferences.blockly.minScale=Escala mínima de zoom -preferences.blockly.minScale.description=Escala de zoom máxima suportada no editor Blockly em % +preferences.blockly.minScale.description=Escala mínima de zoom suportada no editor de blocos de procedimento em % preferences.blockly.scaleSpeed=Velocidade de zoom preferences.blockly.scaleSpeed.description=Sem zoom - 100, zoom positivo > 100, zoom negativo < 100 -preferences.blockly.legacyFont=Use fonte legada -preferences.blockly.legacyFont.description=Se o editor blockly aparecer corrompido (erros de renderização de texto), habilite esta opção +preferences.blockly.legacyFont=Usar fonte legado +preferences.blockly.legacyFont.description=Ative esta opção se o editor de blocos de procedimento parecer quebrado (falhas de renderização de textos) preferences.blockly.transparentBackground=Ativar fundo transparente preferences.ide.editorTheme=Tema de cores do editor de código preferences.ide.fontSize=Tamanho da fonte do editor -preferences.ide.fontSize.description=Tamanho inicial da fonte no editor de código -preferences.ide.autocomplete=Habilitar autocompletar -preferences.ide.autocompleteMode=Autocompletar modo dropdown -preferences.ide.autocompleteMode.description=Autocompletar manual somente com Ctrl + Espaço, o modo inteligente aciona baseado no contexto. -preferences.ide.autocompleteDocWindow=Habilitar janela de documentação de preenchimento automático -preferences.ide.autocompleteDocWindow.description=Mostra janela de documentação adicional Java além da janela de lista de preenchimento automático -preferences.ide.lineNumbers=Mostrar números de linhas no editor -preferences.ide.errorInfoEnable=Mostrar a faixa de informações no editor -preferences.ide.errorInfoEnable.description=Mostra linhas de erros, avisos e resultados de pesquisa atual -preferences.gradle.compileOnSave=Construir a área de trabalho quando um elemento de mod é salvo -preferences.gradle.compileOnSave.description=A menos que você saiba por que precisa disto, mantenha isto selecionado ou você não será notificado de erros no seu mod. -preferences.gradle.passLangToMinecraft=Passe a configuração do idioma para testar o cliente de Minecraft -preferences.gradle.passLangToMinecraft.description=Quando ativado, as configurações de interface do Minecraft/localização serão definidas para o idioma do MCreator a cada execução. +preferences.ide.fontSize.description=Tamanho inicial da fonte no editor de códigos +preferences.ide.autocomplete=Ativar preenchimento automático +preferences.ide.autocompleteMode=Ativar modo de lista suspensa do preenchimento automático +preferences.ide.autocompleteMode.description=O preenchimento automático é acionado manualmente apenas por Ctrl + Espaço, o modo inteligente aciona com base no contexto. +preferences.ide.autocompleteDocWindow=Ativar janela de documentação do preenchimento automático +preferences.ide.autocompleteDocWindow.description=Exibe a janela de documentação adicional de Java além da janela de lista do preenchimento automático +preferences.ide.lineNumbers=Exibir número de linhas no editor +preferences.ide.errorInfoEnable=Exibir faixa de informações no editor +preferences.ide.errorInfoEnable.description=Exibe linhas de erros, avisos e resultados da pesquisa atual +preferences.gradle.compileOnSave=Compilar o espaço de trabalho quando um elemento do mod é salvo +preferences.gradle.compileOnSave.description=A menos que você saiba por que precisa disso, mantenha isso selecionado ou poderá não ser notificado sobre erros no seu mod. +preferences.gradle.passLangToMinecraft=Passar a configuração de idioma para o cliente de teste do Minecraft +preferences.gradle.passLangToMinecraft.description=Quando ativado, a configuração de idioma da interface do Minecraft será definida para o idioma do MCreator a cada execução. preferences.gradle.Xms=Memória inicial preferences.gradle.Xms.description=A quantidade de RAM que é reservada no início da tarefa. preferences.gradle.Xmx=Memória máxima @@ -1561,14 +1561,14 @@ preferences.themes.select_theme=Selecione o tema para usar preferences.themes.select_theme.description=O tema contém os recursos usados pelo MCreator. dialog.workspace.regenerate_and_build.title=Regenerar código e compilar dialog.workspace.regenerate_and_build.progress.removing_autogenerated_code=Removendo código auto-gerado -dialog.workspace.regenerate_and_build.progress.loading_mod_elements=Pré-carregando elementos de mod +dialog.workspace.regenerate_and_build.progress.loading_mod_elements=Pré-carregando elementos do mod dialog.workspace.regenerate_and_build.progress.regenerating_code=Regenerando código dialog.workspace.regenerate_and_build.error.failed_to_import.message=Falha ao importar o elemento mod {0}

MCreator falhou ao importar um dos elementos definidos no arquivo do área de trabalho de trabalho
como está faltando definição de mods. O MCreator irá pular esse mod.
Sua área de trabalho pode não funcionar corretamente sem alguns elementos de mod.

elementos do Mod ignorados até agora\: {1} -dialog.workspace.regenerate_and_build.error.failed_to_import.title=Erro ao importar -dialog.workspace.regenerate_and_build.error.failed_to_import.option.skip_one=Pular elemento de mod +dialog.workspace.regenerate_and_build.error.failed_to_import.title=Erro de importação +dialog.workspace.regenerate_and_build.error.failed_to_import.option.skip_one=Pular elemento do mod dialog.workspace.regenerate_and_build.error.failed_to_import.option.skip_all=Pular todos dialog.workspace.regenerate_and_build.warning.skipped_import_of.message=MCreator pulou a importação de {0} elementos de mod devido à falta de definições de mods.

A Área de Trabalho pode não funcionar corretamente.
Este erro foi causado por uma área de trabalho corrompida que você usou para importar. -dialog.workspace.regenerate_and_build.warning.skipped_import_of.title=erro ao importar +dialog.workspace.regenerate_and_build.warning.skipped_import_of.title=Erro de importação dialog.workspace.regenerate_and_build.warning.elements_with_locked_code.message=Este espaço de trabalho contém elementos do mod com código travado.

Se a versão do Minecraft tiver sido alterada ou houver outras alterações no código,
seu espaço de trabalho pode não compilar, pois o MCreator não atualizará os elementos do mod com código travado.

Nesse caso, você precisará atualizar e corrigir manualmente os erros para elementos do mod com código travado. dialog.workspace.regenerate_and_build.warning.elements_with_locked_code.title=Aviso importante dialog.workspace.regenerate_and_build.progress.regenerating_workspace_and_resources=Regenerando base do workspace e recursos @@ -1578,11 +1578,11 @@ dialog.workspace.regenerate_and_build.progress.rebuilding_workspace=Reconstruind dialog.workspace.import_from_zip.importing=Importar Workspace de um ZIP dialog.workspace.import_from_zip.extracting=Extraindo workspace dialog.workspace.import_from_zip.failed_message=O arquivo que você está tentando importar não é
um arquivo ZIP válido e compartilhável de um Workspace do MCreator. -dialog.workspace.import_from_zip.failed_title=Workspace inválido -action.workspace.settings=Configurações do workspace -dialog.workspace.settings.workspace_switch.title=Alternar projeto +dialog.workspace.import_from_zip.failed_title=Espaço de trabalho inválido +action.workspace.settings=Configurações do espaço de trabalho... +dialog.workspace.settings.workspace_switch.title=Alternar espaço de trabalho dialog.workspace.settings.workspace_switch.progress.preparing=Preparando o espaço de trabalho para o gerador -dialog.workspace.settings.workspace_switch.progress.switching_version=Alterando versão +dialog.workspace.settings.workspace_switch.progress.switching_version=Alternando versão dialog.workspace.settings.workspace_package_empty=O nome do pacote não pode estar vazio dialog.workspace.settings.workspace_package_startdot=O nome do pacote não pode começar com um ponto dialog.workspace.settings.workspace_package_enddot=O nome do pacote não pode terminar com um ponto @@ -1590,15 +1590,15 @@ dialog.workspace.settings.workspace_package_pattern=Nome do pacote apenas pode c dialog.workspace.settings.workspace_package_avoid_numbers=Evitar usar números em nomes de pacotes dialog.workspace.settings.workspace_nopic_default=Nenhuma imagem / imagem padrão dialog.workspace.settings.workspace_modid=ID do mod -action.gradle.run_gradle_task=Rodar comando gradle +action.gradle.run_gradle_task=Executar tarefa do Gradle... action.gradle.run_gradle_task.dialog.instructions=Coloque o comando Gradle\:
Use essa opção apenas se saber oque está fazendo -dialog.gradle.run_gradle_task.title=Executar uma tarefa do Gradle +dialog.gradle.run_gradle_task.title=Executar tarefa do Gradle action.workspace.edit_creative_tab_order=Editar a ordem dos elementos na janela do criativo... -action.workspace.resources.import_structure=Importar estrutura -action.workspace.resources.import_structure_from_minecraft=Importar estrutura do Minecraft +action.workspace.resources.import_structure=Importar estrutura(s)... +action.workspace.resources.import_structure_from_minecraft=Importar estrutura do Minecraft... dialog.workspace.resources.import_structure_from_minecraft.message=Por favor, selecione a estrutura a ser importada\:
Você precisa criar a estrutura no ambiente de cliente de teste do Minecraft
usando o bloco de estrutura e a estrutura aparecerá nesta lista. dialog.workspace.resources.import_structure_from_minecraft.title=Importar estrutura -action.workspace.resources.import_sound=Importar sons em formato .ogg +action.workspace.resources.import_sound=Importar sons .ogg... action.workspace.resources.import_java_model=Importar modelo 3D .java dialog.workspace.resources.import_java_model.version_notice.message=Modelos Java feitos para o Minecraft >\= 1.15 NÃO funcionará em versões abaixo da 1.15 (ex. 1.14.4)\!

Para definir a versão do modelo no Blockbench, vá em Arquivo -> Projeto -> Exportar versão.
Após definir a nova versão de exportação, re-exporte o modelo em um arquivo Java e importe-o para o MCreator. dialog.workspace.resources.import_java_model.version_notice_new.message=Esse gerador suporta as seguintes versões do modelo Java\:

{0}


Certifique-se que o código do seu modelo Java é feito para essa versão do Minecraft.
Você pode ou não ser capaz de reutilizar esse modelo com outros geradores dependendo
se outros geradores declaram compatibilidade com essa versão modelo do Minecraft. @@ -2079,7 +2079,6 @@ elementgui.item.container_item_damage=Danificar item em vez de criar
Contagem de usos do item / durabilidade (deixe 0 para desativar danos)\:
Se você deseja criar uma ferramenta, crie um elemento ferramenta elementgui.item.is_immune_to_fire=É %1 imune ao fogo? elementgui.item.recipe_remainder=Restante de receita
Certifique-se de habilitar "permanecer na grade de criação". Deixe em branco para usar o item atual. -elementgui.item.damage_vs_entity=Dano contra mob/animal (verifique para ativar)\:
Dano corpo-a-corpo elementgui.item.glowing_effect=O item tem efeito brilhante? elementgui.item.item_3d_model=Modelo de item 3D elementgui.item.bind_gui=Vincular este item à GUI\:
Definir como <NONE> para desativar o inventário @@ -2384,7 +2383,6 @@ elementgui.tool.type=Tipo\: elementgui.tool.harvest_level=Nível de Quebrar\: elementgui.tool.efficiency=Eficiência\: elementgui.tool.attack_speed=Velocidade de ataque\: -elementgui.tool.damage_vs_entity=Dano contra mob/animal (dano corpo a corpo)\: elementgui.tool.usage_count=Número de usos / durabilidade\: elementgui.tool.blocks_affected=Blocos afetados\: elementgui.tool.is_immune_to_fire=A ferramenta é imune ao fogo? @@ -2541,8 +2539,6 @@ dialog.workspace_settings.section.external_apis=Suporte para API externa dialog.workspace_settings.section.external_apis.tooltip=Caixas de seleção para adicionar suporte e dependências para as APIs externas suportadas
AVISO\: Se o seu mod usa APIs externas, ele não irá funcionar quando exportar dialog.workspace_settings.explore_plugins=Explorar plugins dialog.workspace_settings.plugins_tip=Procurando por mais APIs? Verifique os plugins do MCreator. -dialog.workspace_settings.version_check=Checar versão do navegador -dialog.workspace_settings.section.version_check=Desativar a verificação de versão do Minecraft Forge?
Se quiser ter certeza que os usuários usam a versão certa do Minecraft Forge,
desmarque essa opção e habilite a verificação da versão do Minecraft Forge. dialog.workspace_settings.section.advanced=Configurações Avançadas dialog.workspace_settings.server_side_only=Este mod é apenas no lado do servidor? dialog.workspace_settings.lock_base_files_label=Bloquear arquivos de mod base?
Usar APENAS se necessário e você entende Java diff --git a/plugins/mcreator-localization/lang/texts_pt_PT.properties b/plugins/mcreator-localization/lang/texts_pt_PT.properties index 3fd69ca46ed..a97058cf030 100644 --- a/plugins/mcreator-localization/lang/texts_pt_PT.properties +++ b/plugins/mcreator-localization/lang/texts_pt_PT.properties @@ -899,8 +899,6 @@ blockly.block.call_procedure.at=\ em blockly.block.aitasks_container=Lista de tarefas / objetivos IA blockly.block.aitasks_container.tip=Tarefas superiores da lista têm maior prioridade blockly.block.aitasks_container.tooltip=Este é o ponto de inicio da lista de tarefas da IA. -blockly.block.advancement_trigger=Conceder esta conquista ao jogador -blockly.block.advancement_trigger.tooltip=Conecte um bloco de trigger que aciona esta conquista a este bloco blockly.block.set_var=Colocar blockly.block.set_to=para\: blockly.block.get_var=Obter @@ -1499,7 +1497,6 @@ elementgui.item.container_item_damage=Item é danificado ao criar
Contagem de usos do item / durabilidade (deixe 0 para desativar o dano)\:
Se você quiser criar uma ferramenta, crie um ELEMENTO ferramenta elementgui.item.is_immune_to_fire=É %1 imune ao fogo? elementgui.item.recipe_remainder=Restante de receita
Certifique-se de habilitar "permanecer na grade de criação". Deixe em branco para usar o item atual. -elementgui.item.damage_vs_entity=Dano contra mob/animal (verifique para ativar)\:
Dano corpo-a-corpo elementgui.item.item_3d_model=Modelo de item 3D elementgui.item.bind_gui=Vincular este item à GUI\:
Definir como <NONE> para desativar o inventário elementgui.item.inventory_size=Tamanho do inventário (contagem de slot)\:
Defina este valor como a maior ID do slot na GUI + 1 @@ -1713,7 +1710,6 @@ elementgui.tool.type=Tipo\: elementgui.tool.harvest_level=Nível de Quebrar\: elementgui.tool.efficiency=Eficiência\: elementgui.tool.attack_speed=Velocidade de ataque\: -elementgui.tool.damage_vs_entity=Dano contra mob/animal (dano corpo a corpo)\: elementgui.tool.usage_count=Número de usos / durabilidade\: elementgui.tool.blocks_affected=Blocos afetados\: elementgui.tool.is_immune_to_fire=A ferramenta é imune ao fogo? @@ -1827,8 +1823,6 @@ dialog.workspace_settings.section.external_apis=Suporte para API externa dialog.workspace_settings.section.external_apis.tooltip=Caixas de seleção para adicionar suporte e dependências para as APIs externas suportadas
AVISO\: Se o seu mod usa APIs externas, ele não irá funcionar quando exportar dialog.workspace_settings.explore_plugins=Explorar plugins dialog.workspace_settings.plugins_tip=Procurando por mais APIs? Verifique os plugins do MCreator. -dialog.workspace_settings.version_check=Checar versão do navegador -dialog.workspace_settings.section.version_check=Desativar a verificação de versão do Minecraft Forge?
Se quiser ter certeza que os usuários usam a versão certa do Minecraft Forge,
desmarque essa opção e habilite a verificação da versão do Minecraft Forge. dialog.workspace_settings.section.advanced=Configurações Avançadas dialog.workspace_settings.server_side_only=Este mod é apenas no lado do servidor? dialog.workspace_settings.lock_base_files_label=Bloquear arquivos de mod base?
Usar APENAS se necessário e você entende Java diff --git a/plugins/mcreator-localization/lang/texts_ro_RO.properties b/plugins/mcreator-localization/lang/texts_ro_RO.properties index fe3a1d85427..b3f41fb7799 100644 --- a/plugins/mcreator-localization/lang/texts_ro_RO.properties +++ b/plugins/mcreator-localization/lang/texts_ro_RO.properties @@ -1087,8 +1087,6 @@ blockly.block.weighted_list_mutator.input=Intrare blockly.block.aitasks_container=Sarcina AI / lista de obiective blockly.block.aitasks_container.tip=Sarcini mai mari pe listă au o prioritate mai mare blockly.block.aitasks_container.tooltip=Acesta este punctul de plecare al listei de sarcini AI. -blockly.block.advancement_trigger=Acordă acest progres jucătorului -blockly.block.advancement_trigger.tooltip=Conectați un bloc declanșator care declanșează acest progres la acest bloc blockly.block.set_var=Setează blockly.block.set_to=la\: blockly.block.get_var=Obţine @@ -1773,7 +1771,6 @@ elementgui.item.container_item=Obiectul rămâne în grila de meșteșugărie? elementgui.item.container_item_damage=În schimb, deteriorați elementul la fabricare
Asigurați-vă că activați „rămâneți în grila de fabricare” și acel element poate fi deteriorat elementgui.item.number_of_uses=Elementul folosește numărarea / durabilitatea (lăsați 0 pentru a dezactiva dauna)\:
Dacă doriți să faceți un instrument, creați o unealtă în schimb elementgui.item.is_immune_to_fire=Obiectul este imun la foc? -elementgui.item.damage_vs_entity=Daune vs mob/animal (bifează pentru a activa)\:
daune melee elementgui.item.item_3d_model=Model 3D obiect elementgui.item.bind_gui=Asociază acest obiect la IGP-ul\:
Setează la <NONE> pentru a dezactiva inventarul elementgui.item.inventory_size=Dimensiunea inventarului (numărul de sloturi)\:
Setează această valoare la cel mai mare ID slot din IGP + 1 @@ -1927,7 +1924,6 @@ elementgui.tool.event_in_inventory_tick=Cand unealta este în inventar tick elementgui.tool.event_in_hand_tick=Cand unealta este în mână tick elementgui.tool.texture=Textura uneltei elementgui.tool.harvest_level=Nivelul de recoltare\: -elementgui.tool.damage_vs_entity=Daune față de mob/animal (deteriorarea melee)\: elementgui.tool.damaged_on_crafting=În schimb, deteriorați elementul la fabricare
Asigurați-vă că ați activat „stay in crafting grid” și acel element este deteriorat elementgui.tool.needs_a_name=Unelta are nevoie de nume elementgui.villager_trade.level=Nivel\: @@ -1998,7 +1994,6 @@ dialog.workspace_settings.credits.error=Creditele nu pot conține ghilimele dialog.workspace_settings.section.external_apis=Suport API extern dialog.workspace_settings.section.external_apis.tooltip=Bifează casete pentru a adăuga suport și dependențe pentru API-urile externe suportate
ATENȚIE\: Dacă modul folosește API-uri externe, nu va funcționa fără ele odată ce îl exportați dialog.workspace_settings.plugins_tip=Cauți mai multe API-uri? Verifică plugin-urile MCreator. -dialog.workspace_settings.version_check=Verificare versiune forge dialog.workspace_settings.section.advanced=Setări avansate dialog.workspace_settings.server_side_only=Este acest mod doar pentru server? dialog.workspace_settings.lock_base_files_label=Blocare fișiere modului de bază?
Utilizați NUMAI dacă este necesar și înțelegeți Java diff --git a/plugins/mcreator-localization/lang/texts_ru_RU.properties b/plugins/mcreator-localization/lang/texts_ru_RU.properties index e34e2b88a25..7e9001ff9ea 100644 --- a/plugins/mcreator-localization/lang/texts_ru_RU.properties +++ b/plugins/mcreator-localization/lang/texts_ru_RU.properties @@ -766,6 +766,7 @@ blockly.category.villagetasks=Задачи, связанные с деревне blockly.category.blocks=Триггеры, связанные с блоками blockly.category.items=Триггеры, связанные с предметами blockly.category.utility=Служебные триггеры +blockly.category.utility.description=Эти триггеры не рекомендуется совмещать с другими. blockly.category.world=Триггеры, связанные с миром blockly.category.minecraft_components=Компоненты Minecraft blockly.category.custom_variables=Действия с переменными @@ -1413,8 +1414,7 @@ blockly.block.aitasks_container=Список задач/целей ИИ blockly.block.aitasks_container.tip=Задачи выше по списку имеют более высокий приоритет blockly.block.aitasks_container.tooltip=Это начало/отправная точка списка задач ИИ. blockly.block.cmdargs_start=Точка начала команды -blockly.block.advancement_trigger=Завершать это достижение для игрока -blockly.block.advancement_trigger.tooltip=Подключите к этому блоку один триггерный блок, который инициирует это достижение. +blockly.block.advancement_trigger=Завершать, если выполнены условия ниже blockly.block.feature_container=Настроенная особенность blockly.block.feature_container.tooltip=Здесь определяется тип особенности blockly.block.feature_container.with_placement=с размещением @@ -2279,7 +2279,6 @@ elementgui.item.container_item_damage=Наносить урон предм elementgui.item.number_of_uses=Число использований предмета/прочность (оставьте 0, чтобы отключить урон)\:
Инструменты рекомендуется создавать как отдельные элементы мода elementgui.item.is_immune_to_fire=Предмет невосприимчив к огню? elementgui.item.recipe_remainder=Остаток после рецепта
Убедитесь, что предмет "Остаётся в сетке крафта после рецепта". Если не указан, оставаться будет сам предмет. -elementgui.item.damage_vs_entity=Урон по сущности (отметьте для включить)\:
Урон в ближнем бою elementgui.item.glowing_effect=Включить эффект свечения? elementgui.item.item_3d_model=3D-модель предмета elementgui.item.bind_gui=Привязать этот предмет к интерфейсу\:
Укажите <NONE> для отключения инвентаря @@ -2634,7 +2633,6 @@ elementgui.tool.type=Тип\: elementgui.tool.harvest_level=Уровень добычи\: elementgui.tool.efficiency=Эффективность\: elementgui.tool.attack_speed=Скорость атаки\: -elementgui.tool.damage_vs_entity=Урон по мобам/животным (в ближнем бою)\: elementgui.tool.usage_count=Количество применений/прочность\: elementgui.tool.blocks_affected=Эффективен на блоках\: elementgui.tool.is_immune_to_fire=Инструмент невосприимчив к огню? @@ -2800,8 +2798,6 @@ dialog.workspace_settings.section.external_apis=Поддержка внешни dialog.workspace_settings.section.external_apis.tooltip=Флажки для подключения загруженных библиотек
ВНИМАНИЕ\: Если экспортировать мод, использующий внешние библиотеки,
то при загрузке из полученного архива в игру он не сможет без них работать dialog.workspace_settings.explore_plugins=Исследовать плагины dialog.workspace_settings.plugins_tip=Нужны другие библиотеки? Ищите среди плагинов MCreator. -dialog.workspace_settings.version_check=Проверка версии Forge -dialog.workspace_settings.section.version_check=Отключить проверку версии Minecraft Forge?
Если вы хотите убедиться, что пользователи используют правильную версию Minecraft Forge,
снимите этот флажок для включения проверки версии. dialog.workspace_settings.section.advanced=Расширенные настройки dialog.workspace_settings.server_side_only=Это мод для сервера? dialog.workspace_settings.lock_base_files_label=Блокировать базовые файлы мода?
Используйте ТОЛЬКО при необходимости и понимании Вами языка Java @@ -3181,6 +3177,7 @@ blockly.warning.no_side_sync=Блок {0} не всегда синхронизи blockly.warning.no_more_argument=При добавлении дополнительных аргументов после аргумента-сообщения эта ветка команды перестанет работать. blockly.warning.no_item_extension_fuel=Получение мощности топлива из процедуры-условия, вызванной из расширения предмета-топлива, приведет к сбою игры из-за рекурсивного вызова. blockly.warning.state_provider_int_property_warning=Проверка набора данных ВЫДАСТ ОШИБКУ, если блок не имеет данного свойства, или если указано недопустимое значение. +blockly.warning.utility_adv_trigger=Триггер {0} является служебным триггером и не должен использоваться в сочетании с другими триггерами. blockly.warnings.binary_operations=Один из входов блока двойных операций пуст. Используется значение по умолчанию заданного типа. blockly.warnings.boolean=Не найдено значение логического блока, за него принята истина. blockly.warnings.flow_control=Не распознан тип операции над циклом. {0} diff --git a/plugins/mcreator-localization/lang/texts_tr_TR.properties b/plugins/mcreator-localization/lang/texts_tr_TR.properties index 3ff5ee759fd..505662150e8 100644 --- a/plugins/mcreator-localization/lang/texts_tr_TR.properties +++ b/plugins/mcreator-localization/lang/texts_tr_TR.properties @@ -959,8 +959,6 @@ blockly.block.call_procedure=prosedürü gerçekleştir blockly.block.procedure_retval=Prosedürü çağırın ve dönüş değerini alın blockly.block.call_procedure.at=\ de blockly.block.aitasks_container=AI görevi / hedef listesi -blockly.block.advancement_trigger=Oyuncuya bu başarıyı verin -blockly.block.advancement_trigger.tooltip=Bu başarıyı tetiklemek için bir tetik kutusu bağlayın blockly.block.set_var=ayarla blockly.block.set_to=şuna\: blockly.block.get_var=al @@ -1557,7 +1555,6 @@ elementgui.tool.type=Tipi\: elementgui.tool.harvest_level=kazma seviyesi\: elementgui.tool.efficiency=verimlilik\: elementgui.tool.attack_speed=saldırı hızı\: -elementgui.tool.damage_vs_entity=canavara/hayvana hasarı (yakın saldırı hasarı)\: elementgui.tool.usage_count=dayanıklılığı\: elementgui.tool.is_immune_to_fire=Alet ateşe karşı dayanıklı mı? elementgui.tool.stays_in_grid_when_crafting=üretimde kullanıldığında hala üretim yerinde duruyormu? @@ -1657,8 +1654,6 @@ dialog.workspace_settings.section.external_apis=Harici API desteği dialog.workspace_settings.section.external_apis.tooltip=Desteklenen harici API'ler için destek ve bağımlılıklar eklemek için kutuları işaretleyin
DİKKAT\: Modunuz harici API'ler kullanıyorsa, siz onu dışa aktardıktan sonra onlar olmadan çalışmaz dialog.workspace_settings.explore_plugins=Eklentileri keşfet dialog.workspace_settings.plugins_tip=Daha fazla API için mi bakıyorsun? MCreator eklentilerini kontrol et. -dialog.workspace_settings.version_check=Forge versiyonu kontrolü -dialog.workspace_settings.section.version_check=Minecraft Forge versiyonu kontrolü kapatılsın mı?
Eğer kullanıcıların doğru Minecraft Forge versiyonu,
işareti kaldırın ve Minecraft Forge versiyon kontölünü açın. dialog.workspace_settings.section.advanced=Gelişmiş ayarlar dialog.workspace_settings.server_side_only=Bu mod sadece sunucu taraflı mı? dialog.workspace_settings.update_url=Mod güncelleme JSON Linki\: diff --git a/plugins/mcreator-localization/lang/texts_uk_UA.properties b/plugins/mcreator-localization/lang/texts_uk_UA.properties index 1ca40fb8880..789093820db 100644 --- a/plugins/mcreator-localization/lang/texts_uk_UA.properties +++ b/plugins/mcreator-localization/lang/texts_uk_UA.properties @@ -1189,7 +1189,6 @@ blockly.block.weighted_list.entry=запис\: blockly.block.weighted_list_mutator.container=Список записів blockly.block.weighted_list_mutator.input=Запис blockly.block.aitasks_container=Список завдань / цілей ШІ -blockly.block.advancement_trigger.tooltip=Під’єднайте до цього блоку один тригерний блок, який запускає це досягнення blockly.block.set_var=Встановити blockly.block.set_to=на\: blockly.block.get_var=Отримати @@ -2204,8 +2203,6 @@ dialog.workspace_settings.section.external_apis=Підтримка зовніш dialog.workspace_settings.section.external_apis.tooltip=Позначки для додавання підтримки та залежностей для підтримуваних зовнішніх API
УВАГА\: якщо ваш мод використовує зовнішні API, вони не працюватимуть без них після експорту dialog.workspace_settings.explore_plugins=Огляд плагінів dialog.workspace_settings.plugins_tip=Шукаєте більше API? Перевірте серед плагінів MCreator. -dialog.workspace_settings.version_check=Перевірка версії Forge -dialog.workspace_settings.section.version_check=Вимкнути перевірку версії Minecraft Forge?
Якщо ви хочете переконатися, що користувачі використовують правильну версію Minecraft Forge,
зніміть позначку й увімкніть перевірку версії Minecraft Forge. dialog.workspace_settings.section.advanced=Розширені налаштування dialog.workspace_settings.server_side_only=Цей мод лише на стороні сервера? dialog.workspace_settings.lock_base_files_label=Блокувати базові файли моду?
Використовуйте ЛИШЕ за потреби та якщо ви розумієте Java diff --git a/plugins/mcreator-localization/lang/texts_vi_VN.properties b/plugins/mcreator-localization/lang/texts_vi_VN.properties index 143b88d5cbc..71feaee07bc 100644 --- a/plugins/mcreator-localization/lang/texts_vi_VN.properties +++ b/plugins/mcreator-localization/lang/texts_vi_VN.properties @@ -1372,8 +1372,6 @@ blockly.block.aitasks_container=Danh sách nhiệm vụ/mục tiêu AI blockly.block.aitasks_container.tip=Các nhiệm vụ cao hơn trong danh sách có mức độ ưu tiên cao hơn blockly.block.aitasks_container.tooltip=Đây là điểm bắt đầu của danh sách nhiệm vụ AI. blockly.block.cmdargs_start=Điểm nhập lệnh -blockly.block.advancement_trigger=Cấp tiến bộ này cho người chơi -blockly.block.advancement_trigger.tooltip=Kết nối một khối kích hoạt kích hoạt sự tiến bộ này cho khối này blockly.block.feature_container=Tính năng được cấu hình blockly.block.feature_container.tooltip=Đây là một loại tính năng để xác định blockly.block.feature_container.with_placement=với vị trí @@ -2200,7 +2198,6 @@ elementgui.item.container_item_damage=Làm hỏng vật phẩm thay thế elementgui.item.number_of_uses=Lần sử dụng/độ bền vật phẩm (để 0 để vô hiệu hóa thiệt hại)\:
Nếu bạn muốn làm một dụng cụ, hãy tạo một dụng cụ thay thế elementgui.item.is_immune_to_fire=Vật phẩm miễn với lửa? elementgui.item.recipe_remainder=Phần còn lại của công thức
Đảm bảo bật "ở trong khung chế tạo". Để trống để sử dụng vật phẩm hiện tại. -elementgui.item.damage_vs_entity=Sát thương với mob/động vật (chọn để bật)\:
Sát thương cận chiến elementgui.item.item_3d_model=Model vật phẩm 3D elementgui.item.bind_gui=Gắn vật phẩm này vào GUI\:
Đặt thành <NONE> để tắt kho đồ elementgui.item.inventory_size=Kích cỡ kho đồ (số ô)\:
Đặt giá trị này thành ID ô lớn nhất trong GUI + 1 @@ -2488,7 +2485,6 @@ elementgui.tool.type=Loại\: elementgui.tool.harvest_level=Cấp độ thu hoạch\: elementgui.tool.efficiency=Hiệu quả\: elementgui.tool.attack_speed=Tốc độ đánh\: -elementgui.tool.damage_vs_entity=Sát thương với mob/động vật (sát thương cận chiến)\: elementgui.tool.usage_count=Số lần dùng/độ bền\: elementgui.tool.blocks_affected=Khối bị ảnh hưởng\: elementgui.tool.is_immune_to_fire=Công cụ miễn với lửa? @@ -2645,8 +2641,6 @@ dialog.workspace_settings.section.external_apis=Hỗ trợ API ngoài dialog.workspace_settings.section.external_apis.tooltip=Tích ô để thêm hỗ trợ và phần phụ thuộc cho các API bên ngoài được hỗ trợ
CẢNH BÁO\: Nếu mod của bạn sử dụng các API bên ngoài, nó sẽ không hoạt động nếu không có chúng sau khi bạn xuất nó dialog.workspace_settings.explore_plugins=Khám phá các plugin dialog.workspace_settings.plugins_tip=Cần API khác? Hãy xem trang web plugin của MCreator. -dialog.workspace_settings.version_check=Kiểm tra phiên bản Minecraft Forge -dialog.workspace_settings.section.version_check=Tắt tính năng kiểm tra phiên bản Minecraft Forge?
Nếu bạn muốn người dùng đúng phiên bản Forge,
hủy tích ô này và bật kiểm tra phiên bản Minecraft Forge. dialog.workspace_settings.section.advanced=Cài đặt nâng cao dialog.workspace_settings.server_side_only=Mod này chỉ ở phía máy chủ? dialog.workspace_settings.lock_base_files_label=Khóa các tệp mod?
CHỈ sử dụng nếu cần và bạn hiểu Java diff --git a/plugins/mcreator-localization/lang/texts_zh_CN.properties b/plugins/mcreator-localization/lang/texts_zh_CN.properties index 5423752fd4f..b3e5a1104ad 100644 --- a/plugins/mcreator-localization/lang/texts_zh_CN.properties +++ b/plugins/mcreator-localization/lang/texts_zh_CN.properties @@ -766,6 +766,7 @@ blockly.category.villagetasks=村庄相关任务 blockly.category.blocks=方块相关触发器 blockly.category.items=物品相关触发器 blockly.category.utility=实用工具触发器 +blockly.category.utility.description=这些触发器不应与其他触发器一起使用。 blockly.category.world=世界相关触发器 blockly.category.minecraft_components=Minecraft内容 blockly.category.custom_variables=自定义变量 @@ -1413,8 +1414,7 @@ blockly.block.aitasks_container=AI任务/目标列表 blockly.block.aitasks_container.tip=列表中位于高位置的任务具有高优先级 blockly.block.aitasks_container.tooltip=这是AI任务列表的开始点 blockly.block.cmdargs_start=命令入口点 -blockly.block.advancement_trigger=授予玩家该进度 -blockly.block.advancement_trigger.tooltip=连接一个触发该进度的触发器方块 +blockly.block.advancement_trigger=如果达成以下条件则赋予该进度 blockly.block.feature_container=配置地物 blockly.block.feature_container.tooltip=这是要定义的地物类型 blockly.block.feature_container.with_placement=将其放在 @@ -1831,7 +1831,7 @@ elementgui.common.disable_offset=禁用碰撞箱随方块模型而偏移 elementgui.common.subtract=减 elementgui.common.creative_tab=在创造模式物品栏标签页的位置: elementgui.common.enchantability=附魔能力: -elementgui.common.repair_items=修复物品: +elementgui.common.repair_items=用于修复的物品: elementgui.common.enable=勾选以启用 elementgui.common.default_sound_type=原版声音集: elementgui.common.custom_sound_type=自定义声音集: @@ -1845,7 +1845,7 @@ elementgui.common.error_sound_empty_null=自定义声音不能为空 elementgui.common.hardness=硬度: elementgui.common.resistance=抗性: elementgui.common.luminance=亮度: -elementgui.common.light_opacity=光不透明度 +elementgui.common.light_opacity=光不透明度: elementgui.common.page_triggers=触发器 elementgui.common.page_bounding_boxes=碰撞箱 elementgui.common.page_visual=外观 @@ -1870,14 +1870,14 @@ elementgui.common.offset_type=随机模型位移: elementgui.common.restrict_to_biomes=被限制的生物群系:
留空表示没有生物群系被限制 elementgui.common.properties_bonemeal=骨粉属性 elementgui.common.properties_general=通用属性 -elementgui.common.properties_dropping=掉落属性 +elementgui.common.properties_dropping=掉落物属性 elementgui.common.event_right_clicked_air=当右击空气时(实体的位置) elementgui.common.event_right_clicked_block=当右击方块时(方块的位置) elementgui.common.event_on_neighbour_block_changes=当毗邻方块更新时 elementgui.common.event_on_update_tick=当游戏刻更新时 elementgui.common.event_on_crafted=当物品被合成或烧炼时 elementgui.common.event_on_block_placed_by=当方块被谁放置时 -elementgui.common.event_on_random_update=客户端显示随机游戏刻 +elementgui.common.event_on_random_update=当客户端显示随机游戏刻 elementgui.common.event_on_block_hit_by_projectile=当方块被弹射物击中时 elementgui.common.event_is_bonemeal_target=当骨粉可在该方块使用时 elementgui.common.event_bonemeal_success_condition=骨粉使用成功的条件 @@ -1887,22 +1887,22 @@ elementgui.common.include=包含 elementgui.common.exclude=不含 elementgui.common.is_bonemealable=该方块可以被骨粉催熟? elementgui.common.special_information=特殊信息 -elementgui.advancement.name=进度GUI名称: -elementgui.advancement.description=进度描述: -elementgui.advancement.icon=进度图标: +elementgui.advancement.name=进度GUI名称: +elementgui.advancement.description=进度描述: +elementgui.advancement.icon=进度图标: elementgui.advancement.background=进度背景:
仅用于根进度 -elementgui.advancement.type=进度类型: +elementgui.advancement.type=进度类型: elementgui.advancement.parent=进度父项:
根进度显示为选项卡 -elementgui.advancement.show_toast=完成时弹出提示: +elementgui.advancement.show_toast=完成时弹出提示: elementgui.advancement.announce_to_chat=完成后发布聊天通知: -elementgui.advancement.hide_if_not_completed=尚未达成时隐藏: +elementgui.advancement.hide_if_not_completed=尚未完成时隐藏: elementgui.advancement.hide_display=隐藏进度显示:
只用于"逻辑"(logic only)进度,例如函数触发器 elementgui.advancement.reward_xp=奖励所给的经验值:
在玩家完成进度时给予 elementgui.advancement.reward_functions=进度达成后执行的函数:
elementgui.advancement.reward_loot_tables=进度达成后奖励的战利品表:
elementgui.advancement.reward_recipes=进度达成后解锁的配方:
elementgui.advancement.display_paramters=进度显示参数 -elementgui.advancement.logic=进度逻辑: +elementgui.advancement.logic=进度逻辑 elementgui.advancement.cant_be_empty=进度名称不能为空 elementgui.advancement.must_have_description=进度必须有描述 elementgui.advancement.trigger_builder=进度触发器(使用流程处理更高级的使用情况) @@ -1927,14 +1927,14 @@ elementgui.armor.part_leg_left=左腿 elementgui.armor.part_leg_right=右腿 elementgui.armor.part_boot_left=左脚 elementgui.armor.part_boot_right=右脚 -elementgui.armor.texture=盔甲纹理: +elementgui.armor.texture=盔甲纹理: elementgui.armor.helmet_name=游戏内显示的头盔名称: elementgui.armor.chestplate_name=游戏中显示的胸甲名称: elementgui.armor.leggings_name=游戏内显示的护腿名称: elementgui.armor.boots_name=游戏内显示的靴子名称: elementgui.armor.layer_texture=盔甲层纹理:
如果列表为空,您需要先导入或创建盔甲纹理 elementgui.armor.equip_sound=盔甲装备声音: -elementgui.armor.max_damage_absorption=盔甲耐久度基数: +elementgui.armor.max_damage_absorption=盔甲耐久度基数: elementgui.armor.damage_values=已消耗的耐久值(头盔, 胸甲, 护腿, 靴子): elementgui.armor.toughness=盔甲韧性(默认为0.0, 钻石材质为2.0): elementgui.armor.knockback_resistance=击退抗性(默认为0.0, 下界合金材质为0.1): @@ -1955,7 +1955,7 @@ elementgui.biome.generate_strongholds=在该生物群系中生成末地要塞吗 elementgui.biome.generate_mineshafts=在该生物群系中生成废弃矿井吗? elementgui.biome.generate_mineshafts_mesa=在该生物群系中生成恶地矿井吗? elementgui.biome.generate_pillager_outposts=在该生物群系中生成掠夺者前哨站吗? -elementgui.biome.generate_village=生成村庄的类型: +elementgui.biome.generate_village=生成的村庄类型: elementgui.biome.generate_mansions=在该生物群系中生成林地府邸吗? elementgui.biome.generate_jungle_temples=在该生物群系中生成丛林神庙吗? elementgui.biome.generate_desert_pyramids=在该生物群系中生成沙漠神殿吗? @@ -1969,19 +1969,19 @@ elementgui.biome.generate_buried_treasures=在该生物群系中生成埋藏的 elementgui.biome.generate_nether_bridges=在该生物群系中生成下界要塞吗? elementgui.biome.generate_nether_fossils=在该生物群系中生成下界化石吗? elementgui.biome.generate_bastion_remnants=在该生物群系中生成堡垒遗迹吗? -elementgui.biome.generate_ruined_portals=生成废弃传送门,类型: +elementgui.biome.generate_ruined_portals=生成的废弃传送门类型: elementgui.biome.generate_end_cities=在该生物群系中生成末地城吗? -elementgui.biome.generate_overworld=在主世界中生成生物群系吗? -elementgui.biome.generate_overworld_caves=在主世界洞穴中生成生物群系吗? -elementgui.biome.generate_nether=在下界中生成生物群系吗? +elementgui.biome.generate_overworld=在主世界中生成该生物群系吗? +elementgui.biome.generate_overworld_caves=在主世界洞穴中生成该生物群系吗?该 +elementgui.biome.generate_nether=在下界中生成该生物群系吗? elementgui.biome.raining_possibility=气候降雨或雪的可能性(范围从0到1): -elementgui.biome.temperature=气候温度:
确定降雨或雪的类型 -elementgui.biome.trees_per_chunk=每区块内树的数量:
设置为0则禁止生成树 -elementgui.biome.default_features=默认生物群系地物:
+elementgui.biome.temperature=气候温度:
用于决定降雨还是降雪 +elementgui.biome.trees_per_chunk=每区块内树的数量:
设置为0则不会有树生成 +elementgui.biome.default_features=生物群系默认的地物:
elementgui.biome.name=名称: elementgui.biome.ground_block=地面的方块:
它应该被标记在minecraft\:dirt方块标签中 elementgui.biome.undeground_block=地下的方块:
它应该被标记在minecraft\:dirt方块标签中 -elementgui.biome.underwater_block=水下的方块:
留空将使用地下方块作为水下方块。 +elementgui.biome.underwater_block=水下的方块:
留空将使用地下的方块作为水下的方块。 elementgui.biome.air_color=空气颜色: elementgui.biome.tree_shape=树的形状: elementgui.biome.tree_definition=树的定义: @@ -1989,7 +1989,7 @@ elementgui.biome.grass_color=草的颜色: elementgui.biome.foliage_color=树叶的颜色: elementgui.biome.water_color=水的颜色: elementgui.biome.water_fog_color=水雾颜色: -elementgui.biome.minimal_tree_height=树最小的高度: +elementgui.biome.minimal_tree_height=树最低的高度: elementgui.biome.stem_block=茎干: elementgui.biome.branch_block=枝叶: elementgui.biome.vines_block=藤蔓: @@ -1999,11 +1999,11 @@ elementgui.biome.particles=生物群系环境粒子 elementgui.biome.enable_particles=启用粒子效果: elementgui.biome.ambient_sound=环境声音:
该声音将不断在生物群系中播放 elementgui.biome.mood_sound=气氛声音:
在玩家在生物群系中至少延迟一段时间播放 -elementgui.biome.mood_sound_delay=气氛声音延迟(刻): -elementgui.biome.additions_sound=附加声音:
偶尔播放的附加声声音果 -elementgui.biome.music=生物群系的音乐:
在生物群系中随机播放音乐 +elementgui.biome.mood_sound_delay=气氛声音延迟(以刻为单位): +elementgui.biome.additions_sound=生物群系附加声音:
附加声音会偶尔在该生物群系播放 +elementgui.biome.music=生物群系音乐:
音乐会在该生物群系中随机播放 elementgui.biome.particle_type=粒子类型: -elementgui.biome.particle_probability=粒子生成几率(每个刻的几率为百分比): +elementgui.biome.particle_probability=粒子生成概率(每游戏刻概率以百分比为单位): elementgui.biome.vanilla_features=原版地物 elementgui.biome.custom_tree_properties=自定义树地物 elementgui.biome.spawn_entities=要在该生物群系中生成的实体(如果自定义实体已经声明要在该生物群系中生成,则不要在此处再次添加它):
注意:自定义实体的附加生成条件仅在自定义实体本身处定义时才有效,在该定义无效。 @@ -2012,17 +2012,17 @@ elementgui.biome.effects=效果 elementgui.biome.features=地物 elementgui.biome.structures=结构 elementgui.biome.entity_spawning=实体生成 -elementgui.biome.biome_generation=生成器 +elementgui.biome.biome_generation=生成 elementgui.biome.gen_temperature=生物群系生成时的温度范围: elementgui.biome.gen_humidity=生物群系生成时的湿度范围: elementgui.biome.gen_continentalness=生物群系生成时的大陆范围: elementgui.biome.gen_erosion=生物群系生成时的侵蚀范围: elementgui.biome.gen_weirdness=生物群系奇异的噪声范围: -elementgui.biome.coverage_estimate=世界表面覆盖估计:
估计该生物群系将覆盖多少世界表面 +elementgui.biome.coverage_estimate=生物群系覆盖面积估计:
估计该生物群系在主世界将覆盖多少面积 elementgui.biome.needs_name=该生物群系需要一个名称 elementgui.block.enable_energy_storage=勾选以启用能量存储 elementgui.block.enable_fluid_storage=勾选以启用流体存储 -elementgui.block.has_inventory=为该方块启用实体功能。如果您需要以下任何一项,请勾选该框:
-可包含项目的方块,可与漏斗和/或红石比较器交互的方块
-可存储NBT数据标签的块
-具有储液或储能功能的方块 +elementgui.block.has_inventory=为该方块启用实体方块功能。如果您需要以下任何一项,请勾选该框:
-可储存物品的方块、可与漏斗或红石比较器交互的方块
-可储存NBT数据标签的方块
-可储存液体或储存能源功能的方块 elementgui.block.event_on_block_added=当方块被放置时 elementgui.block.event_on_block_destroyed_by_player=当方块被玩家破坏时 elementgui.block.event_on_block_destroyed_by_explosion=当方块被爆炸破坏时 @@ -2046,7 +2046,7 @@ elementgui.block.particle_texture=方块粒子纹理:
方块 elementgui.block.block_textures=方块纹理 elementgui.block.transparency_type=纹理透明度类型: elementgui.block.has_trasparency=如果您的方块含有透明部分,请勾选该选项: -elementgui.block.connected_sides=勾选该项以启用连接边:
只应使用于透明方块。 +elementgui.block.connected_sides=勾选该项以启用连接边:
只能对透明方块使用。 elementgui.block.fluid_overlay=勾选该项以隐藏在流体中时的流体纹理: elementgui.block.model=方块模型:
支持:内置,JSON,OBJ elementgui.block.rotation_mode=方块旋转模式:
选择该方块应如何旋转 @@ -2054,28 +2054,28 @@ elementgui.block.enable_pitch=X轴旋转吗?
仅适用于水 elementgui.block.is_waterloggable=方块是否可含水? :
由非1x1x1形状的方块使用 elementgui.block.block_tint=方块颜色 elementgui.block.is_item_tinted=方块物品是否应用色调?
如果勾选,方块在物品栏中也会应用色调。 -elementgui.block.bounding_block_min_x=最小X坐标: -elementgui.block.bounding_block_max_x=最大X坐标: -elementgui.block.bounding_block_min_y=最小Y坐标: -elementgui.block.bounding_block_max_y=最大Y坐标: -elementgui.block.bounding_block_min_z=最小Z坐标: -elementgui.block.bounding_block_max_z=最大Z坐标: +elementgui.block.bounding_block_min_x=最小X坐标: +elementgui.block.bounding_block_max_x=最大X坐标: +elementgui.block.bounding_block_min_y=最小Y坐标: +elementgui.block.bounding_block_max_y=最大Y坐标: +elementgui.block.bounding_block_min_z=最小Z坐标: +elementgui.block.bounding_block_max_z=最大Z坐标: elementgui.block.render_type=渲染类型和旋转(对于没有基础类型的方块) elementgui.block.transparency=透明度 -elementgui.block.material=材料: +elementgui.block.material=材质: elementgui.block.slipperiness=光滑度:
正常光滑度为0.6 -elementgui.block.speed_factor=速度系数:
正常速度系数是1.0 -elementgui.block.jump_factor=跳跃系数:
正常跳跃系数是1.0 +elementgui.block.speed_factor=在方块上的行走速度:
一般情况下是1.0 +elementgui.block.jump_factor=在方块上的跳跃系数:
一般情况下是1.0 elementgui.block.has_gravity=受重力影响? -elementgui.block.can_walk_through=可以穿过方块吗? +elementgui.block.can_walk_through=可以穿过该方块吗? elementgui.block.harvest_tool=能够破坏它的工具: elementgui.block.harvest_level=需要指定工具的挖掘等级破坏才会掉落物品: elementgui.block.requires_correct_tool=需要正确的工具以掉落物品? elementgui.block.is_unbreakable=该方块是否不可被破坏? -elementgui.block.is_replaceable=是否可以替换? -elementgui.block.tick_randomly=启用随机刻:
随全局随机刻系数进行随机刻 +elementgui.block.is_replaceable=该方块是否可以被替换? +elementgui.block.tick_randomly=启用随机刻:
随全局随机刻的数值进行随机刻 elementgui.block.color_on_map=在地图上的颜色: -elementgui.block.can_plants_grow=植物可在该方块上种植? +elementgui.block.can_plants_grow=可在该方块上种植植物? elementgui.block.beacon_color_modifier=信标颜色修改器: elementgui.block.is_ladder=方块是否像梯子一样?
方块必须不占用空间才能正常工作。 elementgui.block.enchantments_bonus=附魔能量加成: @@ -2251,7 +2251,7 @@ elementgui.gui.editor_options=编辑器选项 elementgui.gui.gui_properties=GUI属性 elementgui.gui.gui_type=GUI类型: elementgui.gui.warning_switch_gui=如果您有任何槽位或物品栏,而要切换到基本的GUI,它们将被移除。
要继续吗? -elementgui.gui.width_height=GUI的宽度x高度: +elementgui.gui.width_height=GUI的宽度x高度: elementgui.gui.inventory_offset=物品栏偏移: elementgui.gui.overlay_properties=叠加层属性 elementgui.gui.overlay_target=叠加层目标: @@ -2279,7 +2279,7 @@ elementgui.item.container_item_damage=在合成时以减少物品耐久代 elementgui.item.number_of_uses=物品使用次数/耐久度(设置0以禁用):
如果您想要制作一个工具,请创建一个工具取代它 elementgui.item.is_immune_to_fire=物品是否防火? elementgui.item.recipe_remainder=合成后剩下的物品
请确保启用"留在合成方格中"。留空则使用本身。 -elementgui.item.damage_vs_entity=对生物造成伤害(勾选以开启):
近战伤害 +elementgui.item.damage_vs_entity=攻击伤害(勾选可启用): elementgui.item.glowing_effect=物品是否有发光效果? elementgui.item.item_3d_model=物品 3D 模型 elementgui.item.bind_gui=绑定该物品到GUI:
设置为<NONE>以禁用物品栏 @@ -2634,7 +2634,7 @@ elementgui.tool.type=类型: elementgui.tool.harvest_level=挖掘等级: elementgui.tool.efficiency=效率: elementgui.tool.attack_speed=攻击速度: -elementgui.tool.damage_vs_entity=对生物/动物伤害(近战伤害): +elementgui.tool.damage_vs_entity=攻击伤害: elementgui.tool.usage_count=使用次数/耐久度: elementgui.tool.blocks_affected=受影响的方块: elementgui.tool.is_immune_to_fire=该工具防火吗? @@ -2692,7 +2692,7 @@ workspace.textures.category.entity=实体纹理: workspace.textures.category.effect=药水效果纹理: workspace.textures.category.particle=粒子纹理: workspace.textures.category.screen=屏幕纹理(进度,GUI,叠加层...): -workspace.textures.category.armor=盔甲纹理: +workspace.textures.category.armor=盔甲纹理: workspace.textures.category.other=其它纹理(画,模组图标...): workspace.3dmodel.description={0}
贴图:{1} workspace.3dmodels.edit_texture_mappings=编辑贴图... @@ -2800,8 +2800,6 @@ dialog.workspace_settings.section.external_apis=外部API支持 dialog.workspace_settings.section.external_apis.tooltip=勾选复选框以添加依赖的外部API
警告:如果您的模组使用外部API, 一旦您导出它,不同时安装API,它将无法正常工作 dialog.workspace_settings.explore_plugins=浏览插件 dialog.workspace_settings.plugins_tip=寻找更多API?去看看MCreator插件。 -dialog.workspace_settings.version_check=Forge版本检查 -dialog.workspace_settings.section.version_check=禁用Minecraft Forge版本检查?
如果您想要确保用户使用正确的Minecraft Forge版本,
取消勾选该项并启用Minecraft Forge版本检查。 dialog.workspace_settings.section.advanced=高级设置 dialog.workspace_settings.server_side_only=模组是否只需要在服务端安装? dialog.workspace_settings.lock_base_files_label=锁定基础模组文件吗?
仅在您需要时, 并且在您懂Java时使用 @@ -3181,6 +3179,7 @@ blockly.warning.no_side_sync=块{0}不会在客户端和服务端间自动同步 blockly.warning.no_more_argument=在消息参数之后添加更多的参数将使该命令无法工作。 blockly.warning.no_item_extension_fuel=从一个被“燃料物品扩展条件”触发的流程中获取燃料值将导致循环,从而使游戏崩溃 blockly.warning.state_provider_int_property_warning=如果方块没有给定的属性,或者给定的值超出限制,数据包将会无法识别。 +blockly.warning.utility_adv_trigger=触发器{0}是一个与进度相关的触发器,不应该与其他触发器一起使用。 blockly.warnings.binary_operations=双输入块的输入中的一个为空。对其使用默认类型值。 blockly.warnings.boolean=无法获取逻辑块值,使用true作为值 blockly.warnings.flow_control=无法获取循环中断类型。{0} diff --git a/plugins/mcreator-localization/lang/texts_zh_TW.properties b/plugins/mcreator-localization/lang/texts_zh_TW.properties index 131a9740aed..d6b6220a2cb 100644 --- a/plugins/mcreator-localization/lang/texts_zh_TW.properties +++ b/plugins/mcreator-localization/lang/texts_zh_TW.properties @@ -766,6 +766,7 @@ blockly.category.villagetasks=村莊相關行為 blockly.category.blocks=方塊相關觸發器 blockly.category.items=物品相關觸發器 blockly.category.utility=實用工具觸發器 +blockly.category.utility.description=這些觸發器無法與其它觸發器共同使用。 blockly.category.world=世界相關觸發器 blockly.category.minecraft_components=Minecraft內容 blockly.category.custom_variables=自訂變數 @@ -1413,8 +1414,7 @@ blockly.block.aitasks_container=AI任務/目標清單 blockly.block.aitasks_container.tip=清單中較高的任務的優先級較高 blockly.block.aitasks_container.tooltip=這是AI任務清單的起始點。 blockly.block.cmdargs_start=指令入口點 -blockly.block.advancement_trigger=將此進度授予玩家 -blockly.block.advancement_trigger.tooltip=連接一個觸發這個進度的觸發器方塊 +blockly.block.advancement_trigger=如果達成以下的進度條件則賦予該成就 blockly.block.feature_container=配置地物 blockly.block.feature_container.tooltip=這是要定義的地物類型 blockly.block.feature_container.with_placement=將其放在 @@ -1783,6 +1783,7 @@ dialog.workspace.is_not_valid_message=工作空間開啟失敗!該工作空間使用不支援的生成器類型\:{0}
為該工作空間選擇一個支援的生成器。 dialog.workspace.unknown_generator_title=不支援的生成器 +dialog.workspace.missing_plugins_message=此工作空間看起來需要您沒有安裝過或已不支援的外掛程式。
請確保您已經安裝了外掛程式並且支援所選的生成器或MCreator版本。

以下是外掛程式中的缺少的組件:

{0} dialog.workspace.missing_plugins_title=缺少外掛程式 action.check_for_updates=檢查更新 action.check_for_plugin_updates=檢查外掛程式更新 @@ -2250,7 +2251,7 @@ elementgui.gui.editor_options=編輯器選項 elementgui.gui.gui_properties=介面屬性 elementgui.gui.gui_type=介面類型\: elementgui.gui.warning_switch_gui=如果你有任何存儲槽或物品欄,而要切換到基本介面,則會將其刪除。
你要繼續嗎? -elementgui.gui.width_height=介面的寬X高\: +elementgui.gui.width_height=介面的寬X高: elementgui.gui.inventory_offset=物品欄偏移\: elementgui.gui.overlay_properties=疊加層屬性 elementgui.gui.overlay_target=疊加層目標\: @@ -2278,7 +2279,7 @@ elementgui.item.container_item_damage=合成時以減少物品耐久代替 elementgui.item.number_of_uses=物品使用次數/耐久性(設定為0以禁止損壞)\:
如果要製作工具,請建立工具 elementgui.item.is_immune_to_fire=該物品能防火嗎? elementgui.item.recipe_remainder=合成配方剩餘物
確保啟用保留在合成方格中。留空以使用當前物品。 -elementgui.item.damage_vs_entity=對生物/動物的傷害(選中以啟用)\:
近戰傷害 +elementgui.item.damage_vs_entity=攻擊造成的傷害(勾選以啟用): elementgui.item.glowing_effect=物品有發光效果嗎 elementgui.item.item_3d_model=物品 3D 模型 elementgui.item.bind_gui=將此物品綁定到介面\:
設定為<NONE>以停用物品欄。 @@ -2373,7 +2374,7 @@ elementgui.living_entity.drop_health_xp_amount=掉落物數量(可選)、生 elementgui.living_entity.model_layers=模型圖層清單 elementgui.living_entity.follow_range_tracking_range=跟隨範圍,追蹤範圍\: elementgui.living_entity.attack_strenght_armor_value_knockback=攻擊力,盔甲保護能力,攻擊擊退距離,擊退抗性\: -elementgui.living_entity.movement_speed_step_height=移動速度,可行走高度\: +elementgui.living_entity.movement_speed_step_height=移動速度,可行走高度: elementgui.living_entity.equipment=裝備(可選\:主手、副手、頭盔、胸甲、護腿、靴子)\:
僅適用於兩足動物和殭屍模型 elementgui.living_entity.is_immune_to=實體對以下傷害免疫\: elementgui.living_entity.ridable=勾選以使玩家可騎上該實體
你也可以選擇啟用对該實體的控制 @@ -2633,7 +2634,7 @@ elementgui.tool.type=類型\: elementgui.tool.harvest_level=收集等級\: elementgui.tool.efficiency=效率\: elementgui.tool.attack_speed=攻擊速度\: -elementgui.tool.damage_vs_entity=對生物/動物的傷害(近戰傷害)\: +elementgui.tool.damage_vs_entity=攻擊造成的傷害: elementgui.tool.usage_count=使用次數/耐久度\: elementgui.tool.blocks_affected=受影響的方塊\: elementgui.tool.is_immune_to_fire=該工具不受火的影響嗎? @@ -2799,8 +2800,6 @@ dialog.workspace_settings.section.external_apis=外部 API 支援 dialog.workspace_settings.section.external_apis.tooltip=勾選此核取方塊以添加對所支援的第三方 API 的支援和依賴項
警告\: 如果你的模組使用了第三方 API,一旦你匯出它,沒有它們就無法執行。 dialog.workspace_settings.explore_plugins=探索外掛程式 dialog.workspace_settings.plugins_tip=尋找更多 API?請看看 MCreator 外掛程式。 -dialog.workspace_settings.version_check=Forge 版本檢查 -dialog.workspace_settings.section.version_check=是否停用 Minecraft Forge 版本檢查?
如果要確保用戶使用正確的 Minecraft Forge 版本,請
取消勾選並啟用 Minecraft Forge 版本檢查。 dialog.workspace_settings.section.advanced=進階設定 dialog.workspace_settings.server_side_only=此模組只能在伺服端執行嗎? dialog.workspace_settings.lock_base_files_label=鎖定基礎模組檔案嗎?
僅在你需要時, 並且在你懂Java時使用 @@ -3180,6 +3179,7 @@ blockly.warning.no_side_sync=塊 {0} 不會在客戶端和伺服器之間自動 blockly.warning.no_more_argument=在消息引數之後添加更多的引數將使該指令無法工作。 blockly.warning.no_item_extension_fuel=從一個被燃料物品擴展條件觸發的函式中取得燃料值將導致循環,從而使遊戲崩潰 blockly.warning.state_provider_int_property_warning=如果方塊沒有給定的屬性,或者給定的值超出限制,資料包將會無法識別。 +blockly.warning.utility_adv_trigger=觸發器 {0} 無法與其它觸發器共同使用,因為它是進度觸發器。 blockly.warnings.binary_operations=雙輸入塊的輸入中的一個為空。對其使用預設類型值。 blockly.warnings.boolean=取得邏輯塊值失敗,使用 true 作為值。 blockly.warnings.flow_control=無法取得迴圈中斷類型。 {0} diff --git a/plugins/mcreator-themes/themes/default_dark/images/16px/neoforge.png b/plugins/mcreator-themes/themes/default_dark/images/16px/neoforge.png index d37de36c288..08386287322 100644 Binary files a/plugins/mcreator-themes/themes/default_dark/images/16px/neoforge.png and b/plugins/mcreator-themes/themes/default_dark/images/16px/neoforge.png differ diff --git a/plugins/mcreator-themes/themes/default_dark/images/mod_preview_bases/tag.png b/plugins/mcreator-themes/themes/default_dark/images/mod_preview_bases/tag.png deleted file mode 100644 index 854ba405c3b..00000000000 Binary files a/plugins/mcreator-themes/themes/default_dark/images/mod_preview_bases/tag.png and /dev/null differ diff --git a/plugins/mcreator-themes/themes/default_dark/images/mod_types/tag.png b/plugins/mcreator-themes/themes/default_dark/images/mod_types/tag.png deleted file mode 100644 index ca0c3139611..00000000000 Binary files a/plugins/mcreator-themes/themes/default_dark/images/mod_types/tag.png and /dev/null differ diff --git a/plugins/mcreator-themes/themes/default_light/images/16px/neoforge.png b/plugins/mcreator-themes/themes/default_light/images/16px/neoforge.png index ae989d11387..fd31b69ae71 100644 Binary files a/plugins/mcreator-themes/themes/default_light/images/16px/neoforge.png and b/plugins/mcreator-themes/themes/default_light/images/16px/neoforge.png differ diff --git a/plugins/mcreator-themes/themes/default_light/images/mod_preview_bases/tag.png b/plugins/mcreator-themes/themes/default_light/images/mod_preview_bases/tag.png deleted file mode 100644 index 9a9db77998d..00000000000 Binary files a/plugins/mcreator-themes/themes/default_light/images/mod_preview_bases/tag.png and /dev/null differ diff --git a/plugins/mcreator-themes/themes/default_light/images/mod_types/tag.png b/plugins/mcreator-themes/themes/default_light/images/mod_types/tag.png deleted file mode 100644 index 8d48b3b0a63..00000000000 Binary files a/plugins/mcreator-themes/themes/default_light/images/mod_types/tag.png and /dev/null differ diff --git a/plugins/mcreator-themes/themes/matrix/images/16px/neoforge.png b/plugins/mcreator-themes/themes/matrix/images/16px/neoforge.png index 02c5707fab3..f2446bb901d 100644 Binary files a/plugins/mcreator-themes/themes/matrix/images/16px/neoforge.png and b/plugins/mcreator-themes/themes/matrix/images/16px/neoforge.png differ diff --git a/plugins/mcreator-themes/themes/matrix/images/mod_preview_bases/tag.png b/plugins/mcreator-themes/themes/matrix/images/mod_preview_bases/tag.png deleted file mode 100644 index 2ac45f74ac5..00000000000 Binary files a/plugins/mcreator-themes/themes/matrix/images/mod_preview_bases/tag.png and /dev/null differ diff --git a/plugins/mcreator-themes/themes/matrix/images/mod_types/tag.png b/plugins/mcreator-themes/themes/matrix/images/mod_types/tag.png deleted file mode 100644 index d8a483f4d64..00000000000 Binary files a/plugins/mcreator-themes/themes/matrix/images/mod_types/tag.png and /dev/null differ diff --git a/src/main/java/net/mcreator/element/GeneratableElement.java b/src/main/java/net/mcreator/element/GeneratableElement.java index d98de237dc0..10b00f912fc 100644 --- a/src/main/java/net/mcreator/element/GeneratableElement.java +++ b/src/main/java/net/mcreator/element/GeneratableElement.java @@ -42,7 +42,7 @@ public abstract class GeneratableElement { - public static final int formatVersion = 59; + public static final int formatVersion = 60; private static final Logger LOG = LogManager.getLogger("Generatable Element"); diff --git a/src/main/java/net/mcreator/element/ModElementType.java b/src/main/java/net/mcreator/element/ModElementType.java index 8598bb2f391..74421730df2 100644 --- a/src/main/java/net/mcreator/element/ModElementType.java +++ b/src/main/java/net/mcreator/element/ModElementType.java @@ -137,7 +137,6 @@ public interface ModElementGUIProvider { public static ModElementType RECIPE; public static ModElementType STRUCTURE; public static ModElementType TAB; - public static ModElementType TAG; public static ModElementType TOOL; public static ModElementType VILLAGERPROFESSION; public static ModElementType VILLAGERTRADE; diff --git a/src/main/java/net/mcreator/element/ModElementTypeLoader.java b/src/main/java/net/mcreator/element/ModElementTypeLoader.java index 06387084ff3..37563a08d43 100644 --- a/src/main/java/net/mcreator/element/ModElementTypeLoader.java +++ b/src/main/java/net/mcreator/element/ModElementTypeLoader.java @@ -26,7 +26,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; public class ModElementTypeLoader { @@ -65,7 +64,6 @@ public static void loadModElements() { ModElementType.RECIPE = register(new ModElementType<>("recipe", 'r', RecipeGUI::new, Recipe.class)); ModElementType.STRUCTURE = register(new ModElementType<>("structure", 's', StructureGUI::new, Structure.class)); ModElementType.TAB = register(new ModElementType<>("tab", 'w', TabGUI::new, Tab.class)); - ModElementType.TAG = register(new ModElementType<>("tag", 'j', TagGUI::new, Tag.class)); ModElementType.TOOL = register(new ModElementType<>("tool", 't', ToolGUI::new, Tool.class)); ModElementType.VILLAGERPROFESSION = register(new ModElementType<>("villagerprofession", null, VillagerProfessionGUI::new, VillagerProfession.class)); ModElementType.VILLAGERTRADE = register(new ModElementType<>("villagertrade", null, VillagerTradeGUI::new, VillagerTrade.class)); diff --git a/src/main/java/net/mcreator/element/converter/ConverterRegistry.java b/src/main/java/net/mcreator/element/converter/ConverterRegistry.java index 2ebcb72768a..3103afa6359 100644 --- a/src/main/java/net/mcreator/element/converter/ConverterRegistry.java +++ b/src/main/java/net/mcreator/element/converter/ConverterRegistry.java @@ -23,7 +23,6 @@ import net.mcreator.element.converter.v2019_5.RecipeTypeConverter; import net.mcreator.element.converter.v2020_1.AchievementFixer; import net.mcreator.element.converter.v2020_2.GUIBindingInverter; -import net.mcreator.element.converter.v2021_1.LegacyDimensionProcedureRemover; import net.mcreator.element.converter.v2020_3.OpenGUIProcedureDepFixer; import net.mcreator.element.converter.v2020_3.ProcedureEntityDepFixer; import net.mcreator.element.converter.v2020_4.BiomeSpawnListConverter; @@ -49,6 +48,7 @@ import net.mcreator.element.converter.v2023_4.*; import net.mcreator.element.converter.v2024_1.AdvancementTriggerInverter; import net.mcreator.element.converter.v2024_1.ProcedureCustomDamageRemover; +import net.mcreator.element.converter.v2024_1.TagModElementConverter; import java.util.HashMap; import java.util.List; @@ -166,7 +166,6 @@ public class ConverterRegistry { put(ModElementType.ITEM, List.of( new ItemDispenseBehaviorToItemExtensionConverter(), new SpecialInformationConverter(), - new ItemDispenseBehaviorToItemExtensionConverter(), new ItemHasGlowConverter() )); put(ModElementType.FEATURE, List.of( @@ -193,6 +192,7 @@ public class ConverterRegistry { put("food", new FoodToItemConverter()); put("fuel", new FuelToItemExtensionConverter()); put("rangeditem", new RangedItemToProjectileAndItemConverter()); + put("tag", new TagModElementConverter()); }}; public static List getConvertersForModElementType(ModElementType modElementType) { diff --git a/src/main/java/net/mcreator/element/converter/ConverterUtils.java b/src/main/java/net/mcreator/element/converter/ConverterUtils.java index 3a95b9c7ddf..0b50591945c 100644 --- a/src/main/java/net/mcreator/element/converter/ConverterUtils.java +++ b/src/main/java/net/mcreator/element/converter/ConverterUtils.java @@ -46,7 +46,8 @@ public static void convertElementToDifferentType(IConverter converter, ModElemen .filter(source.getWorkspace().getFolderManager()::isFileInWorkspace).forEach(File::delete); source.getWorkspace().removeModElement(source); - result.getModElement().setParentFolder(FolderElement.dummyFromPath(source.getFolderPath())); + result.getModElement() + .setParentFolder(FolderElement.findFolderByPath(source.getWorkspace(), source.getFolderPath())); source.getWorkspace().getModElementManager().storeModElementPicture(result); source.getWorkspace().addModElement(result.getModElement()); source.getWorkspace().getGenerator().generateElement(result); diff --git a/src/main/java/net/mcreator/element/converter/v2021_2/PotionToEffectConverter.java b/src/main/java/net/mcreator/element/converter/v2021_2/PotionToEffectConverter.java index 214592d6b43..ae4af180b9d 100644 --- a/src/main/java/net/mcreator/element/converter/v2021_2/PotionToEffectConverter.java +++ b/src/main/java/net/mcreator/element/converter/v2021_2/PotionToEffectConverter.java @@ -97,8 +97,9 @@ public GeneratableElement convert(Workspace workspace, GeneratableElement input, ConverterUtils.findSuitableModElementName(workspace, originalName + "PotionEffect"), ModElementType.POTIONEFFECT)); - potionEffect.getModElement() - .setParentFolder(FolderElement.dummyFromPath(input.getModElement().getFolderPath())); + potionEffect.getModElement().setParentFolder( + FolderElement.findFolderByPath(input.getModElement().getWorkspace(), + input.getModElement().getFolderPath())); // for backwards game saves compatibility potionEffect.getModElement().setRegistryName(input.getModElement().getRegistryName()); diff --git a/src/main/java/net/mcreator/element/converter/v2022_2/ItemDispenseBehaviorToItemExtensionConverter.java b/src/main/java/net/mcreator/element/converter/v2022_2/ItemDispenseBehaviorToItemExtensionConverter.java index 1fb585ff280..20606517cb4 100644 --- a/src/main/java/net/mcreator/element/converter/v2022_2/ItemDispenseBehaviorToItemExtensionConverter.java +++ b/src/main/java/net/mcreator/element/converter/v2022_2/ItemDispenseBehaviorToItemExtensionConverter.java @@ -76,8 +76,9 @@ public GeneratableElement convert(Workspace workspace, GeneratableElement input, itemExtension.dispenseResultItemstack = new Procedure( item.get("dispenseResultItemstack").getAsJsonObject().get("name").getAsString()); - itemExtension.getModElement() - .setParentFolder(FolderElement.dummyFromPath(input.getModElement().getFolderPath())); + itemExtension.getModElement().setParentFolder( + FolderElement.findFolderByPath(input.getModElement().getWorkspace(), + input.getModElement().getFolderPath())); workspace.getModElementManager().storeModElementPicture(itemExtension); workspace.addModElement(itemExtension.getModElement()); workspace.getGenerator().generateElement(itemExtension); diff --git a/src/main/java/net/mcreator/element/converter/v2023_1/FluidGenToFeatureConverter.java b/src/main/java/net/mcreator/element/converter/v2023_1/FluidGenToFeatureConverter.java index 1450c48ad66..3ed51d4424f 100644 --- a/src/main/java/net/mcreator/element/converter/v2023_1/FluidGenToFeatureConverter.java +++ b/src/main/java/net/mcreator/element/converter/v2023_1/FluidGenToFeatureConverter.java @@ -114,8 +114,9 @@ public GeneratableElement convert(Workspace workspace, GeneratableElement input, """.formatted( modElementName, rarity); - feature.getModElement() - .setParentFolder(FolderElement.dummyFromPath(input.getModElement().getFolderPath())); + feature.getModElement().setParentFolder( + FolderElement.findFolderByPath(input.getModElement().getWorkspace(), + input.getModElement().getFolderPath())); workspace.getModElementManager().storeModElementPicture(feature); workspace.addModElement(feature.getModElement()); workspace.getGenerator().generateElement(feature); diff --git a/src/main/java/net/mcreator/element/converter/v2023_4/BlockGenerationConditionRemover.java b/src/main/java/net/mcreator/element/converter/v2023_4/BlockGenerationConditionRemover.java index 7093056ffa1..02c1b2427f9 100644 --- a/src/main/java/net/mcreator/element/converter/v2023_4/BlockGenerationConditionRemover.java +++ b/src/main/java/net/mcreator/element/converter/v2023_4/BlockGenerationConditionRemover.java @@ -113,8 +113,9 @@ public GeneratableElement convert(Workspace workspace, GeneratableElement input, %s """.formatted(oreXML, placementXML); - feature.getModElement() - .setParentFolder(FolderElement.dummyFromPath(input.getModElement().getFolderPath())); + feature.getModElement().setParentFolder( + FolderElement.findFolderByPath(input.getModElement().getWorkspace(), + input.getModElement().getFolderPath())); workspace.getModElementManager().storeModElementPicture(feature); workspace.addModElement(feature.getModElement()); workspace.getGenerator().generateElement(feature); diff --git a/src/main/java/net/mcreator/element/converter/v2023_4/PlantGenerationConditionRemover.java b/src/main/java/net/mcreator/element/converter/v2023_4/PlantGenerationConditionRemover.java index 11cb720e272..6565ae8d70f 100644 --- a/src/main/java/net/mcreator/element/converter/v2023_4/PlantGenerationConditionRemover.java +++ b/src/main/java/net/mcreator/element/converter/v2023_4/PlantGenerationConditionRemover.java @@ -105,8 +105,9 @@ public GeneratableElement convert(Workspace workspace, GeneratableElement input, %s """.formatted(patchXML, placementXML); - feature.getModElement() - .setParentFolder(FolderElement.dummyFromPath(input.getModElement().getFolderPath())); + feature.getModElement().setParentFolder( + FolderElement.findFolderByPath(input.getModElement().getWorkspace(), + input.getModElement().getFolderPath())); workspace.getModElementManager().storeModElementPicture(feature); workspace.addModElement(feature.getModElement()); workspace.getGenerator().generateElement(feature); diff --git a/src/main/java/net/mcreator/element/converter/v2023_4/RangedItemToProjectileAndItemConverter.java b/src/main/java/net/mcreator/element/converter/v2023_4/RangedItemToProjectileAndItemConverter.java index 9bb9de823f1..0d08582989d 100644 --- a/src/main/java/net/mcreator/element/converter/v2023_4/RangedItemToProjectileAndItemConverter.java +++ b/src/main/java/net/mcreator/element/converter/v2023_4/RangedItemToProjectileAndItemConverter.java @@ -107,8 +107,9 @@ else if (rangedItem.get("ammoItem") != null && !rangedItem.get("ammoItem").getAs projectile.onFlyingTick = new Procedure( rangedItem.get("onBulletFlyingTick").getAsJsonObject().get("name").getAsString()); - projectile.getModElement() - .setParentFolder(FolderElement.dummyFromPath(input.getModElement().getFolderPath())); + projectile.getModElement().setParentFolder( + FolderElement.findFolderByPath(input.getModElement().getWorkspace(), + input.getModElement().getFolderPath())); workspace.getModElementManager().storeModElementPicture(projectile); workspace.addModElement(projectile.getModElement()); workspace.getGenerator().generateElement(projectile); diff --git a/src/main/java/net/mcreator/element/converter/v2024_1/ProcedureCustomDamageRemover.java b/src/main/java/net/mcreator/element/converter/v2024_1/ProcedureCustomDamageRemover.java index 5ace1f62655..0b9eda72595 100644 --- a/src/main/java/net/mcreator/element/converter/v2024_1/ProcedureCustomDamageRemover.java +++ b/src/main/java/net/mcreator/element/converter/v2024_1/ProcedureCustomDamageRemover.java @@ -54,13 +54,14 @@ public class ProcedureCustomDamageRemover extends ProcedureConverter { // Rename "damage_number" value to "amount" and remove "localization_text" value for (Element value : XMLUtil.getChildrenWithName(element, "value")) { switch (value.getAttribute("name")) { - case "damage_number" -> value.setAttribute("name", "amount"); - case "localization_text" -> element.removeChild(value); + case "damage_number" -> value.setAttribute("name", "amount"); + case "localization_text" -> element.removeChild(value); } } // Add a damage source of type GENERIC, as there's no reliable way to fix the procedure with damage type ME - Element damageSource = bh.createBlock("damagesource_from_type", bh.createField("damagetype", "GENERIC")); + Element damageSource = bh.createBlock("damagesource_from_type", + bh.createField("damagetype", "GENERIC")); element.appendChild(bh.createValue("damagesource", damageSource)); // Finally, replace the block with the standard "Deal damage" procedure diff --git a/src/main/java/net/mcreator/element/converter/v2024_1/TagModElementConverter.java b/src/main/java/net/mcreator/element/converter/v2024_1/TagModElementConverter.java new file mode 100644 index 00000000000..fc7de7c812b --- /dev/null +++ b/src/main/java/net/mcreator/element/converter/v2024_1/TagModElementConverter.java @@ -0,0 +1,90 @@ +/* + * MCreator (https://mcreator.net/) + * Copyright (C) 2012-2020, Pylo + * Copyright (C) 2020-2024, Pylo, opensource contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.mcreator.element.converter.v2024_1; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.mcreator.element.GeneratableElement; +import net.mcreator.element.converter.IConverter; +import net.mcreator.minecraft.TagType; +import net.mcreator.workspace.Workspace; +import net.mcreator.workspace.elements.TagElement; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class TagModElementConverter implements IConverter { + + private static final Logger LOG = LogManager.getLogger(TagModElementConverter.class); + + @Override + public GeneratableElement convert(Workspace workspace, GeneratableElement input, JsonElement jsonElementInput) { + try { + JsonObject definition = jsonElementInput.getAsJsonObject().getAsJsonObject("definition"); + + TagType type = fromLegacyName(definition.get("type").getAsString()); + + if (type != null) { + String name = definition.get("name").getAsString(); + String namespace = definition.get("namespace").getAsString(); + + TagElement tagElement = new TagElement(type, namespace + ":" + name); + if (!workspace.getTagElements().containsKey(tagElement)) { + workspace.addTagElement(tagElement); + } + + for (JsonElement value : switch (type) { + case ITEMS -> definition.getAsJsonArray("items"); + case BLOCKS -> definition.getAsJsonArray("blocks"); + case ENTITIES -> definition.getAsJsonArray("entities"); + case FUNCTIONS -> definition.getAsJsonArray("functions"); + case BIOMES -> definition.getAsJsonArray("biomes"); + case DAMAGE_TYPES -> definition.getAsJsonArray("damageTypes"); + }) { + workspace.getTagElements().get(tagElement).add(type == TagType.FUNCTIONS ? + value.getAsString() : + value.getAsJsonObject().get("value").getAsString()); + } + } else { + throw new NullPointerException("Tag type is null / unknown tag type"); + } + } catch (Exception e) { + LOG.warn("Failed to convert tag mod element to tag element", e); + } + + return null; // Mod element was converted to non-mod element form + } + + @Override public int getVersionConvertingTo() { + return 60; + } + + private TagType fromLegacyName(String readableName) { + return switch (readableName) { + case "Items" -> TagType.ITEMS; + case "Blocks" -> TagType.BLOCKS; + case "Entities" -> TagType.ENTITIES; + case "Functions" -> TagType.FUNCTIONS; + case "Biomes" -> TagType.BIOMES; + case "Damage types" -> TagType.DAMAGE_TYPES; + default -> null; + }; + } + +} diff --git a/src/main/java/net/mcreator/element/types/Biome.java b/src/main/java/net/mcreator/element/types/Biome.java index b36c7ec6d12..e14432f0679 100644 --- a/src/main/java/net/mcreator/element/types/Biome.java +++ b/src/main/java/net/mcreator/element/types/Biome.java @@ -31,7 +31,6 @@ import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; -import java.util.Locale; @SuppressWarnings("unused") public class Biome extends GeneratableElement { @@ -143,43 +142,6 @@ public boolean hasVines() { return hasTrees() && treeType == TREES_CUSTOM && treeVines != null && !treeVines.isEmpty(); } - public boolean hasStructure(String structureType) { - return switch (structureType.toLowerCase(Locale.ENGLISH)) { - case "mineshaft" -> spawnMineshaft; - case "igloo" -> spawnIgloo; - case "stronghold" -> spawnStronghold; - case "mineshaft_mesa" -> spawnMineshaftMesa; - case "pillager_outpost" -> spawnPillagerOutpost; - case "woodland_mansion" -> spawnWoodlandMansion; - case "jungle_temple" -> spawnJungleTemple; - case "desert_pyramid" -> spawnDesertPyramid; - case "swamp_hut" -> spawnSwampHut; - case "ocean_monument" -> spawnOceanMonument; - case "shipwreck" -> spawnShipwreck; - case "shipwreck_beached" -> spawnShipwreckBeached; - case "buried_treasure" -> spawnBuriedTreasure; - case "nether_fortress" -> spawnNetherBridge; - case "nether_fossil" -> spawnNetherFossil; - case "bastion_remnant" -> spawnBastionRemnant; - case "end_city" -> spawnEndCity; - case "village_desert" -> villageType.equals("desert"); - case "village_plains" -> villageType.equals("plains"); - case "village_savanna" -> villageType.equals("savanna"); - case "village_snowy" -> villageType.equals("snowy"); - case "village_taiga" -> villageType.equals("taiga"); - case "ocean_ruin_cold" -> oceanRuinType.equals("COLD"); - case "ocean_ruin_warm" -> oceanRuinType.equals("WARM"); - case "ruined_portal_standard" -> spawnRuinedPortal.equals("STANDARD"); - case "ruined_portal_desert" -> spawnRuinedPortal.equals("DESERT"); - case "ruined_portal_jungle" -> spawnRuinedPortal.equals("JUNGLE"); - case "ruined_portal_swamp" -> spawnRuinedPortal.equals("SWAMP"); - case "ruined_portal_mountain" -> spawnRuinedPortal.equals("MOUNTAIN"); - case "ruined_portal_ocean" -> spawnRuinedPortal.equals("OCEAN"); - case "ruined_portal_nether" -> spawnRuinedPortal.equals("NETHER"); - default -> false; - }; - } - public MItemBlock getUnderwaterBlock() { if (underwaterBlock == null || underwaterBlock.isEmpty()) return undergroundBlock; diff --git a/src/main/java/net/mcreator/element/types/Dimension.java b/src/main/java/net/mcreator/element/types/Dimension.java index 55965e48e0c..0e92b29db07 100644 --- a/src/main/java/net/mcreator/element/types/Dimension.java +++ b/src/main/java/net/mcreator/element/types/Dimension.java @@ -39,10 +39,8 @@ import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.List; +import java.util.*; @SuppressWarnings("unused") public class Dimension extends GeneratableElement implements ICommonType, ITabContainedElement, IMCItemProvider, IPOIProvider { @@ -101,6 +99,25 @@ public boolean hasIgniter() { return enablePortal && enableIgniter; } + public Set getWorldgenBlocks() { + Set retval = new HashSet<>(); + retval.add(mainFillerBlock.getUnmappedValue()); + for (BiomeEntry biomeEntry : biomesInDimension) { + if (biomeEntry.getUnmappedValue().startsWith("CUSTOM:")) { + ModElement biomeElement = getModElement().getWorkspace() + .getModElementByName(biomeEntry.getUnmappedValue().replace("CUSTOM:", "")); + if (biomeElement != null) { + GeneratableElement generatableElement = biomeElement.getGeneratableElement(); + if (generatableElement instanceof Biome biome) { + retval.add(biome.groundBlock.getUnmappedValue()); + retval.add(biome.undergroundBlock.getUnmappedValue()); + } + } + } + } + return retval; + } + @Override public BufferedImage generateModElementPicture() { return this.enablePortal ? MinecraftImageGenerator.Preview.generateDimensionPreviewPicture(getModElement().getWorkspace(), diff --git a/src/main/java/net/mcreator/element/types/Tag.java b/src/main/java/net/mcreator/element/types/Tag.java deleted file mode 100644 index 2856fea731e..00000000000 --- a/src/main/java/net/mcreator/element/types/Tag.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * MCreator (https://mcreator.net/) - * Copyright (C) 2012-2020, Pylo - * Copyright (C) 2020-2023, Pylo, opensource contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.mcreator.element.types; - -import net.mcreator.element.NamespacedGeneratableElement; -import net.mcreator.element.parts.BiomeEntry; -import net.mcreator.element.parts.DamageTypeEntry; -import net.mcreator.element.parts.EntityEntry; -import net.mcreator.element.parts.MItemBlock; -import net.mcreator.minecraft.MinecraftImageGenerator; -import net.mcreator.minecraft.TagType; -import net.mcreator.workspace.elements.ModElement; -import net.mcreator.workspace.references.ModElementReference; - -import javax.annotation.Nonnull; -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.List; - -@SuppressWarnings({ "unused", "NotNullFieldNotInitialized" }) public class Tag extends NamespacedGeneratableElement { - - @Nonnull public String type; - - @ModElementReference public List items; - @ModElementReference public List blocks; - @ModElementReference public List functions; - @ModElementReference public List entities; - @ModElementReference public List biomes; - @ModElementReference public List damageTypes; - - private Tag() { - this(null); - } - - public Tag(ModElement element) { - super(element); - - items = new ArrayList<>(); - blocks = new ArrayList<>(); - functions = new ArrayList<>(); - entities = new ArrayList<>(); - biomes = new ArrayList<>(); - damageTypes = new ArrayList<>(); - } - - public String tagType() { - return TagType.fromLegacyName(type).getFolder(); - } - - @Override public BufferedImage generateModElementPicture() { - return MinecraftImageGenerator.Preview.generateTagPreviewPicture(type); - } - -} diff --git a/src/main/java/net/mcreator/element/types/interfaces/IMCItemProvider.java b/src/main/java/net/mcreator/element/types/interfaces/IMCItemProvider.java index 9dfde23bc7e..e901d30ac4e 100644 --- a/src/main/java/net/mcreator/element/types/interfaces/IMCItemProvider.java +++ b/src/main/java/net/mcreator/element/types/interfaces/IMCItemProvider.java @@ -28,6 +28,10 @@ public interface IMCItemProvider { /** * This method determines what MCItems are provided by this generatable element + *

+ * WARNING: Calls to this method are generally not thread safe. + * Implementations can call MCItem.Custom::new that calls getBlockIconBasedOnName + * which calls ModElement#getGeneratableElement that is not thread safe * * @return A list of MCItems provided by this generatable element */ diff --git a/src/main/java/net/mcreator/element/types/interfaces/ITabContainedElement.java b/src/main/java/net/mcreator/element/types/interfaces/ITabContainedElement.java index a9d6bc37b8e..d1b4247a796 100644 --- a/src/main/java/net/mcreator/element/types/interfaces/ITabContainedElement.java +++ b/src/main/java/net/mcreator/element/types/interfaces/ITabContainedElement.java @@ -29,6 +29,14 @@ public interface ITabContainedElement { @Nullable TabEntry getCreativeTab(); + /** + * WARNING: Calls to this method are generally not thread safe. + * Implementations can call MCItem.Custom::new that calls + * getBlockIconBasedOnName that calls ModElement#getGeneratableElement + * which is not thread safe + * + * @return list of items in the creative tab of this element + */ List getCreativeTabItems(); } diff --git a/src/main/java/net/mcreator/generator/Generator.java b/src/main/java/net/mcreator/generator/Generator.java index 4dba138ff6f..4f1d01b7174 100644 --- a/src/main/java/net/mcreator/generator/Generator.java +++ b/src/main/java/net/mcreator/generator/Generator.java @@ -167,6 +167,9 @@ public boolean generateBase(boolean formatAndOrganiseImports) { // generate lang files LocalizationUtils.generateLanguageFiles(this, workspace, generatorConfiguration.getLanguageFileSpecification()); + // generate tags files + TagsUtils.generateTagsFiles(this, workspace, generatorConfiguration.getTagsSpecification()); + return success.get(); } @@ -256,8 +259,12 @@ public List generateElement(GeneratableElement element, boolean f element.getModElement().putMetadata("files", generatorFiles.stream().map(GeneratorFile::getFile) .map(e -> getFolderManager().getPathInWorkspace(e).replace(File.separator, "/")).toList()); + // add lang keys to the workspace LocalizationUtils.generateLocalizationKeys(this, element, (List) map.get("localizationkeys")); + // add tag elements to the workspace + TagsUtils.processDefinitionToTags(this, element, (List) map.get("tags"), false); + // do additional tasks if mod element has them element.finalizeModElementGeneration(); } @@ -296,8 +303,11 @@ public void removeElementFilesAndLangKeys(GeneratableElement generatableElement) template.getFile().delete(); } - // delete localization keys associated with the mod element + // delete localization keys associated with the mod element from the workspace LocalizationUtils.deleteLocalizationKeys(this, generatableElement, (List) map.get("localizationkeys")); + + // delete tag elements associated with the mod element from the workspace + TagsUtils.processDefinitionToTags(this, generatableElement, (List) map.get("tags"), true); } @Nonnull public List getModBaseGeneratorTemplatesList(boolean performFSTasks) { diff --git a/src/main/java/net/mcreator/generator/GeneratorConfiguration.java b/src/main/java/net/mcreator/generator/GeneratorConfiguration.java index aa864af86a5..a1dc81b5b71 100644 --- a/src/main/java/net/mcreator/generator/GeneratorConfiguration.java +++ b/src/main/java/net/mcreator/generator/GeneratorConfiguration.java @@ -173,6 +173,10 @@ public String getSpecificRoot(String root) { new HashMap<>(); } + public Map getTagsSpecification() { + return generatorConfig.get("tags") != null ? (Map) generatorConfig.get("tags") : new HashMap<>(); + } + public List getBaseTemplates() { return (generatorConfig.get("base_templates") != null) ? (List) generatorConfig.get("base_templates") : diff --git a/src/main/java/net/mcreator/generator/GeneratorStats.java b/src/main/java/net/mcreator/generator/GeneratorStats.java index 8eb58c69dd2..f51d97bb733 100644 --- a/src/main/java/net/mcreator/generator/GeneratorStats.java +++ b/src/main/java/net/mcreator/generator/GeneratorStats.java @@ -140,6 +140,9 @@ public class GeneratorStats { CoverageStatus.NONE : CoverageStatus.FULL); + baseCoverageInfo.put("tags", + generatorConfiguration.getTagsSpecification().isEmpty() ? CoverageStatus.NONE : CoverageStatus.FULL); + baseCoverageInfo.put("sounds", generatorConfiguration.getSpecificRoot("sounds_dir") == null ? CoverageStatus.NONE : CoverageStatus.FULL); diff --git a/src/main/java/net/mcreator/generator/TagsUtils.java b/src/main/java/net/mcreator/generator/TagsUtils.java new file mode 100644 index 00000000000..e7b56af7298 --- /dev/null +++ b/src/main/java/net/mcreator/generator/TagsUtils.java @@ -0,0 +1,133 @@ +/* + * MCreator (https://mcreator.net/) + * Copyright (C) 2012-2020, Pylo + * Copyright (C) 2020-2023, Pylo, opensource contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.mcreator.generator; + +import net.mcreator.element.GeneratableElement; +import net.mcreator.generator.template.TemplateExpressionParser; +import net.mcreator.generator.template.TemplateGeneratorException; +import net.mcreator.io.writer.JSONWriter; +import net.mcreator.workspace.Workspace; +import net.mcreator.workspace.elements.TagElement; + +import javax.annotation.Nullable; +import java.io.File; +import java.util.*; + +public class TagsUtils { + + public static void generateTagsFiles(Generator generator, Workspace workspace, Map tagsSpecification) { + workspace.getTagElements().entrySet().parallelStream().forEach(tag -> { + File tagFile = getTagFileFor(workspace, tag.getKey()); + if (tagFile != null) { + try { + Map datamodel = new HashMap<>(); + datamodel.put("tag", tag.getKey()); + datamodel.put("type", tag.getKey().type().name().toLowerCase(Locale.ENGLISH)); + datamodel.put("elements", tag.getValue().stream() + .map(e -> tag.getKey().type().getMappableElementProvider() + .apply(workspace, TagElement.getEntryName(e))).toList()); + String json = generator.getTemplateGeneratorFromName("templates") + .generateFromTemplate(tagsSpecification.get("template").toString(), datamodel); + JSONWriter.writeJSONToFile(json, tagFile); + } catch (TemplateGeneratorException e) { + generator.getLogger().error("Failed to generate code for tag: " + tag.getKey(), e); + } + } + }); + } + + @Nullable public static File getTagFileFor(Workspace workspace, TagElement tagElement) { + String rawName = (String) workspace.getGeneratorConfiguration().getTagsSpecification().get("name"); + + String name = GeneratorTokens.replaceTokens(workspace, + rawName.replace("@namespace", tagElement.getNamespace()).replace("@name", tagElement.getName()) + .replace("@folder", tagElement.type().getFolder())); + + File tagFile = new File(name); + if (workspace.getFolderManager().isFileInWorkspace(tagFile)) { + return tagFile; + } else { + return null; + } + } + + public static void processDefinitionToTags(Generator generator, GeneratableElement element, @Nullable List tags, + boolean deleteMode) { + if (tags != null) { + for (Object template : tags) { + Map map = (Map) template; + TagElement tag = TagElement.fromString((String) map.get("tag")); + + boolean shouldSkip = TemplateExpressionParser.shouldSkipTemplateBasedOnCondition(generator, map, + element); + + if (map.containsKey("entryprovider")) { + @SuppressWarnings("unchecked") Collection entryprovider = (Collection) TemplateExpressionParser.processFTLExpression( + generator, (String) map.get("entryprovider"), element); + if (entryprovider != null) { + for (String entry : entryprovider) { + handleTagEntryEntry(generator, tag, entry, deleteMode || shouldSkip); + } + } + } else if (map.containsKey("entry")) { + String entry = GeneratorTokens.replaceTokens(generator.getWorkspace(), ((String) map.get("entry")) + //@formatter:off + .replace("@modid", generator.getWorkspace().getWorkspaceSettings().getModID()) + .replace("@registryname", element.getModElement().getRegistryName()) + //@formatter:on + ); + + handleTagEntryEntry(generator, tag, entry, deleteMode || shouldSkip); + } else { + handleTagEntryEntry(generator, tag, "CUSTOM:" + element.getModElement().getName(), + deleteMode || shouldSkip); + } + } + } + } + + private static void handleTagEntryEntry(Generator generator, TagElement tag, String entry, boolean delete) { + String entryManaged = TagElement.makeEntryManaged(entry); + + List entries = generator.getWorkspace().getTagElements().get(tag); + + if (delete) { + // only delete the entry if it is present in the list as managed + if (entries != null && entries.contains(entryManaged)) { + if (entries.size() == 1) { // only current/our entry is present, delete the tag itself + generator.getWorkspace().removeTagElement(tag); + } else { + generator.getWorkspace().getTagElements().get(tag).remove(entryManaged); + } + } + } else { + if (entries == null) { // tag does not exist yet, create it + generator.getWorkspace().addTagElement(tag); + generator.getWorkspace().getTagElements().get(tag).add(entryManaged); + } + // only add this entry if it does not already exist in managed or unmanaged form + else if (!entries.contains(entryManaged) && !entries.contains(entry)) { + // We add managed entries to the beginning of the list + generator.getWorkspace().getTagElements().get(tag).add(0, entryManaged); + } + } + } + +} diff --git a/src/main/java/net/mcreator/generator/mapping/MappableElement.java b/src/main/java/net/mcreator/generator/mapping/MappableElement.java index 6963e991b59..6dc384d8129 100644 --- a/src/main/java/net/mcreator/generator/mapping/MappableElement.java +++ b/src/main/java/net/mcreator/generator/mapping/MappableElement.java @@ -37,6 +37,8 @@ public abstract class MappableElement implements IWorkspaceDependent { protected transient final NameMapper mapper; + private transient boolean managed; + public MappableElement(NameMapper mapper) { this.mapper = mapper; this.value = null; @@ -90,6 +92,24 @@ public Optional getDataListEntry() { return Optional.empty(); } + /** + * Call this to mark the current mappable element as managed - meaning it was not generated by a direct user input. + * Can be used to filter out elements that were not generated by the user in UI components, for example. + * + * @param managed true if the element is managed + */ + public void setManaged(boolean managed) { + this.managed = managed; + } + + /** + * @return true if the element was marked as managed + * @see #setManaged(boolean) + */ + public boolean isManaged() { + return managed; + } + @Override public void setWorkspace(@Nullable Workspace workspace) { mapper.setWorkspace(workspace); } diff --git a/src/main/java/net/mcreator/generator/template/TemplateGeneratorConfiguration.java b/src/main/java/net/mcreator/generator/template/TemplateGeneratorConfiguration.java index 60029223308..1fb3d203765 100644 --- a/src/main/java/net/mcreator/generator/template/TemplateGeneratorConfiguration.java +++ b/src/main/java/net/mcreator/generator/template/TemplateGeneratorConfiguration.java @@ -21,9 +21,6 @@ import freemarker.cache.ClassTemplateLoader; import freemarker.cache.MultiTemplateLoader; import freemarker.cache.TemplateLoader; -import freemarker.ext.beans.BeansWrapper; -import freemarker.template.Configuration; -import freemarker.template.ObjectWrapper; import net.mcreator.generator.GeneratorConfiguration; import net.mcreator.generator.template.base.DefaultFreemarkerConfiguration; import net.mcreator.plugin.PluginLoader; diff --git a/src/main/java/net/mcreator/minecraft/MinecraftImageGenerator.java b/src/main/java/net/mcreator/minecraft/MinecraftImageGenerator.java index 87b3d498e56..f9f40aaf993 100644 --- a/src/main/java/net/mcreator/minecraft/MinecraftImageGenerator.java +++ b/src/main/java/net/mcreator/minecraft/MinecraftImageGenerator.java @@ -1449,18 +1449,6 @@ public static BufferedImage generateParticlePreviewPicture(File texture, boolean return icon; } - /** - * This method generates tag images. - * - * @param type Tag type string. - * @return Returns generated image of the appropriate colour. - */ - public static BufferedImage generateTagPreviewPicture(String type) { - return ImageUtils.toBufferedImage( - ImageUtils.colorize(UIRES.get("mod_preview_bases.tag"), TagType.fromLegacyName(type).getColor(), - false).getImage()); - } - /** * This method generates game rule images. * diff --git a/src/main/java/net/mcreator/minecraft/TagType.java b/src/main/java/net/mcreator/minecraft/TagType.java index 241f2283821..4eb5f7af955 100644 --- a/src/main/java/net/mcreator/minecraft/TagType.java +++ b/src/main/java/net/mcreator/minecraft/TagType.java @@ -20,28 +20,42 @@ package net.mcreator.minecraft; import net.mcreator.blockly.data.Dependency; +import net.mcreator.element.parts.BiomeEntry; +import net.mcreator.element.parts.DamageTypeEntry; +import net.mcreator.element.parts.EntityEntry; +import net.mcreator.element.parts.MItemBlock; +import net.mcreator.generator.mapping.MappableElement; +import net.mcreator.generator.mapping.NonMappableElement; import net.mcreator.ui.init.L10N; +import net.mcreator.workspace.Workspace; import java.awt.*; import java.util.Locale; +import java.util.function.BiFunction; public enum TagType { //@formatter:off - ITEMS("items", Dependency.getColor("itemstack")), - BLOCKS("blocks", Dependency.getColor("blockstate")), - ENTITIES("entity_types", Dependency.getColor("entity")), - FUNCTIONS("functions", Dependency.getColor("string")), - BIOMES("worldgen/biome", Dependency.getColor("world")), - DAMAGE_TYPES("damage_type", Dependency.getColor("damagesource")); + ITEMS("items", Dependency.getColor("itemstack"), MItemBlock::new), + BLOCKS("blocks", Dependency.getColor("blockstate"), MItemBlock::new), + ENTITIES("entity_types", Dependency.getColor("entity"), EntityEntry::new), + FUNCTIONS("functions", Dependency.getColor("string"), (w, e) -> new NonMappableElement(e)), + BIOMES("worldgen/biome", Dependency.getColor("world"), BiomeEntry::new), + DAMAGE_TYPES("damage_type", Dependency.getColor("damagesource"), DamageTypeEntry::new); //@formatter:on private final String folder; private final Color color; + private final BiFunction mappableElementProvider; - TagType(String folder, Color color) { + TagType(String folder, Color color, BiFunction mappableElementProvider) { this.folder = folder; this.color = color; + this.mappableElementProvider = mappableElementProvider; + } + + public BiFunction getMappableElementProvider() { + return mappableElementProvider; } public String getFolder() { @@ -56,16 +70,4 @@ public Color getColor() { return L10N.t("tag.type." + name().toLowerCase(Locale.ENGLISH)); } - public static TagType fromLegacyName(String readableName) { - return switch (readableName) { - case "Items" -> ITEMS; - case "Blocks" -> BLOCKS; - case "Entities" -> ENTITIES; - case "Functions" -> FUNCTIONS; - case "Biomes" -> BIOMES; - case "Damage types" -> DAMAGE_TYPES; - default -> null; - }; - } - } diff --git a/src/main/java/net/mcreator/preferences/data/GradleSection.java b/src/main/java/net/mcreator/preferences/data/GradleSection.java index f6a670b4a05..ef7b6279695 100644 --- a/src/main/java/net/mcreator/preferences/data/GradleSection.java +++ b/src/main/java/net/mcreator/preferences/data/GradleSection.java @@ -32,7 +32,7 @@ public class GradleSection extends PreferencesSection { (int) (((OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getTotalMemorySize() / 1048576) - 1024; - public BooleanEntry compileOnSave; + public BooleanEntry buildOnSave; public BooleanEntry passLangToMinecraft; public IntegerEntry xms; public IntegerEntry xmx; @@ -41,7 +41,7 @@ public class GradleSection extends PreferencesSection { GradleSection(String preferencesIdentifier) { super(preferencesIdentifier); - compileOnSave = addEntry(new BooleanEntry("compileOnSave", true)); + buildOnSave = addEntry(new BooleanEntry("buildOnSave", false)); passLangToMinecraft = addEntry(new BooleanEntry("passLangToMinecraft", true)); xms = addEntry(new IntegerEntry("Xms", Math.min(1024, MAX_RAM), 128, MAX_RAM)); xmx = addEntry(new IntegerEntry("Xmx", Math.min(3072, MAX_RAM), 128, MAX_RAM)); diff --git a/src/main/java/net/mcreator/ui/MCreatorApplication.java b/src/main/java/net/mcreator/ui/MCreatorApplication.java index b47f96a8ba1..78b22d6d290 100644 --- a/src/main/java/net/mcreator/ui/MCreatorApplication.java +++ b/src/main/java/net/mcreator/ui/MCreatorApplication.java @@ -43,10 +43,7 @@ import net.mcreator.ui.dialogs.preferences.PreferencesDialog; import net.mcreator.ui.help.HelpLoader; import net.mcreator.ui.init.*; -import net.mcreator.ui.laf.LafUtil; -import net.mcreator.ui.laf.MCreatorTheme; -import net.mcreator.ui.laf.themes.Theme; -import net.mcreator.ui.laf.themes.ThemeLoader; +import net.mcreator.ui.laf.themes.ThemeManager; import net.mcreator.ui.notifications.StartupNotifications; import net.mcreator.ui.workspace.selector.RecentWorkspaceEntry; import net.mcreator.ui.workspace.selector.WorkspaceSelector; @@ -60,7 +57,6 @@ import org.apache.logging.log4j.Logger; import javax.swing.*; -import javax.swing.plaf.metal.MetalLookAndFeel; import java.awt.*; import java.io.File; import java.io.IOException; @@ -103,17 +99,8 @@ private MCreatorApplication(List launchArguments) { splashScreen.setProgress(10, "Loading UI Themes"); - // We load UI themes now as theme plugins are loaded at this point - ThemeLoader.initUIThemes(); - MetalLookAndFeel.setCurrentTheme(new MCreatorTheme(Theme.current())); - - try { - UIManager.setLookAndFeel(new MetalLookAndFeel()); - LafUtil.applyDefaultHTMLStyles(); - LafUtil.fixMacOSActions(); - } catch (UnsupportedLookAndFeelException e) { - LOG.error("Failed to set look and feel: " + e.getMessage()); - } + // We load UI theme now as theme plugins are loaded at this point + ThemeManager.init(); splashScreen.setProgress(15, "Loading UI core"); diff --git a/src/main/java/net/mcreator/ui/MainMenuBar.java b/src/main/java/net/mcreator/ui/MainMenuBar.java index a2291d58d99..cf1b40b4620 100644 --- a/src/main/java/net/mcreator/ui/MainMenuBar.java +++ b/src/main/java/net/mcreator/ui/MainMenuBar.java @@ -152,7 +152,6 @@ public MainMenuBar(MCreator mcreator) { workspace.setMnemonic('S'); workspace.addSeparator(); workspace.add(mcreator.actionRegistry.setCreativeTabItemOrder); - workspace.add(mcreator.actionRegistry.injectDefaultTags); workspace.addSeparator(); workspace.add(mcreator.actionRegistry.openWorkspaceFolder); workspace.addSeparator(); diff --git a/src/main/java/net/mcreator/ui/MainToolBar.java b/src/main/java/net/mcreator/ui/MainToolBar.java index f70c9b25c05..ed0bf629711 100644 --- a/src/main/java/net/mcreator/ui/MainToolBar.java +++ b/src/main/java/net/mcreator/ui/MainToolBar.java @@ -77,7 +77,6 @@ public class MainToolBar extends JToolBar { addSeparator(new Dimension(10, 4)); add(mcreator.actionRegistry.setCreativeTabItemOrder); - add(mcreator.actionRegistry.injectDefaultTags); addSeparator(new Dimension(10, 4)); diff --git a/src/main/java/net/mcreator/ui/SplashScreen.java b/src/main/java/net/mcreator/ui/SplashScreen.java index ae87df2f70d..a934917c67a 100644 --- a/src/main/java/net/mcreator/ui/SplashScreen.java +++ b/src/main/java/net/mcreator/ui/SplashScreen.java @@ -22,7 +22,6 @@ import net.mcreator.ui.component.ProgressBar; import net.mcreator.ui.component.SplashScreenPanel; import net.mcreator.ui.init.UIRES; -import net.mcreator.util.image.ImageUtils; import javax.swing.*; import java.awt.*; @@ -46,7 +45,7 @@ public SplashScreen() { imagePanel.setLayout(null); - JLabel pylo = new JLabel(new ImageIcon(ImageUtils.resize(UIRES.getBuiltIn("pylo").getImage(), 90, 24))); + JLabel pylo = new JLabel(UIRES.getBuiltIn("pylo")); pylo.setBounds(shadowPadding + 540 - 15 - 10, shadowPadding + 348 - 15 - 10, 90, 24); imagePanel.add(pylo); diff --git a/src/main/java/net/mcreator/ui/action/ActionRegistry.java b/src/main/java/net/mcreator/ui/action/ActionRegistry.java index e147ab312bb..dbe7b45a083 100644 --- a/src/main/java/net/mcreator/ui/action/ActionRegistry.java +++ b/src/main/java/net/mcreator/ui/action/ActionRegistry.java @@ -94,7 +94,6 @@ public class ActionRegistry { public final BasicAction exportWorkspaceToZIPWithRunDir; public final BasicAction openWorkspaceFolder; public final BasicAction setCreativeTabItemOrder; - public final BasicAction injectDefaultTags; // IDE actions public final BasicAction openFile; @@ -303,7 +302,6 @@ public ActionRegistry(MCreator mcreator) { this.knowledgeBase = new VisitURIAction(this, L10N.t("action.knowledge_base"), MCreatorApplication.SERVER_DOMAIN + "/support/knowledgebase"); this.setCreativeTabItemOrder = new EditTabOrderAction(this); - this.injectDefaultTags = InjectTagsTool.getAction(this); this.donate = new VisitURIAction(this, L10N.t("action.donate"), MCreatorApplication.SERVER_DOMAIN + "/donate").setIcon(UIRES.get("donate")); this.openJavaEditionFolder = new MinecraftFolderActions.OpenJavaEditionFolder(this); diff --git a/src/main/java/net/mcreator/ui/action/impl/gradle/ReloadGradleProjectAction.java b/src/main/java/net/mcreator/ui/action/impl/gradle/ReloadGradleProjectAction.java index 3266ce7ad76..fe1215235dd 100644 --- a/src/main/java/net/mcreator/ui/action/impl/gradle/ReloadGradleProjectAction.java +++ b/src/main/java/net/mcreator/ui/action/impl/gradle/ReloadGradleProjectAction.java @@ -33,20 +33,26 @@ public ReloadGradleProjectAction(ActionRegistry actionRegistry) { L10N.t("dialog.setup_workspace.progress.reloading_gradle_dependencies")); progressDialog.addProgressUnit(p1); - actionRegistry.getMCreator().getGradleConsole().exec("dependencies", finished -> { + String task = actionRegistry.getMCreator().getGeneratorConfiguration().getGradleTaskFor("setup_task"); + if (task == null) + task = "clean"; + + actionRegistry.getMCreator().mcreatorTabs.showTab(actionRegistry.getMCreator().consoleTab); + + actionRegistry.getMCreator().getGradleConsole().exec(task + " --refresh-dependencies", finished -> { p1.markStateOk(); - ProgressDialog.ProgressUnit p3 = new ProgressDialog.ProgressUnit( + ProgressDialog.ProgressUnit p2 = new ProgressDialog.ProgressUnit( L10N.t("dialog.setup_workspace.progress.reloading_gradle_project")); - progressDialog.addProgressUnit(p3); + progressDialog.addProgressUnit(p2); new Thread(() -> { try { actionRegistry.getMCreator().getGenerator().reloadGradleCaches(); - p3.markStateOk(); + p2.markStateOk(); progressDialog.hideDialog(); } catch (Exception e) { - p3.markStateError(); + p2.markStateError(); progressDialog.hideDialog(); } }, "GradleProjectCacheReload").start(); diff --git a/src/main/java/net/mcreator/ui/action/impl/gradle/RunServerAction.java b/src/main/java/net/mcreator/ui/action/impl/gradle/RunServerAction.java index 9586b925873..656de43b477 100644 --- a/src/main/java/net/mcreator/ui/action/impl/gradle/RunServerAction.java +++ b/src/main/java/net/mcreator/ui/action/impl/gradle/RunServerAction.java @@ -48,7 +48,7 @@ public RunServerAction(ActionRegistry actionRegistry) { JOptionPane.showMessageDialog(actionRegistry.getMCreator(), L10N.t("dialog.run_server_and_client.eula_intro")); - DesktopUtils.browseSafe("https://account.mojang.com/documents/minecraft_eula"); + DesktopUtils.browseSafe("https://www.minecraft.net/en-us/eula"); Object[] options = { L10N.t("dialog.run_server_and_client.agree"), L10N.t("dialog.run_server_and_client.disagree") }; diff --git a/src/main/java/net/mcreator/ui/action/impl/workspace/RegenerateCodeAction.java b/src/main/java/net/mcreator/ui/action/impl/workspace/RegenerateCodeAction.java index b7d9ba53a24..a00fdfad331 100644 --- a/src/main/java/net/mcreator/ui/action/impl/workspace/RegenerateCodeAction.java +++ b/src/main/java/net/mcreator/ui/action/impl/workspace/RegenerateCodeAction.java @@ -33,6 +33,7 @@ import net.mcreator.ui.init.L10N; import net.mcreator.ui.init.UIRES; import net.mcreator.workspace.elements.ModElement; +import net.mcreator.workspace.elements.TagElement; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -109,6 +110,13 @@ public static void regenerateCode(MCreator mcreator, boolean warnLockedCode, boo a.delete(); } + // Delete all managed tag entries + for (Map.Entry> tag : mcreator.getWorkspace().getTagElements().entrySet()) { + tag.getValue().removeIf(TagElement::isEntryManaged); + } + // Delete tags that have no entries + mcreator.getWorkspace().getTagElements().entrySet().removeIf(entry -> entry.getValue().isEmpty()); + p0.markStateOk(); ProgressDialog.ProgressUnit p10 = new ProgressDialog.ProgressUnit( diff --git a/src/main/java/net/mcreator/ui/component/JItemListField.java b/src/main/java/net/mcreator/ui/component/JItemListField.java index 47f734dece9..93e251e0cf1 100644 --- a/src/main/java/net/mcreator/ui/component/JItemListField.java +++ b/src/main/java/net/mcreator/ui/component/JItemListField.java @@ -46,6 +46,7 @@ import java.awt.event.MouseWheelEvent; import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -69,6 +70,12 @@ public abstract class JItemListField extends JPanel implements IValidable { private final List listeners = new ArrayList<>(); + private final JScrollPane pane; + + private final JComponent buttons; + + private boolean warnOnRemoveAll = false; + protected JItemListField(MCreator mcreator) { this(mcreator, false); } @@ -119,17 +126,22 @@ protected JItemListField(MCreator mcreator, boolean excludeButton, boolean allow remove.addActionListener(e -> { List elements = elementsList.getSelectedValuesList(); - for (var element : elements) { - if (element != null) { - elementsListModel.removeElement(element); - this.listeners.forEach(l -> l.stateChanged(new ChangeEvent(e.getSource()))); - } - } + deleteElements(elements); }); removeall.addActionListener(e -> { - elementsListModel.removeAllElements(); - this.listeners.forEach(l -> l.stateChanged(new ChangeEvent(e.getSource()))); + List elements = Collections.list(elementsListModel.elements()); + + if (warnOnRemoveAll && !elements.isEmpty()) { + int result = JOptionPane.showConfirmDialog(mcreator, L10N.t("dialog.itemlistfield.deleteall"), + L10N.t("dialog.itemlistfield.deleteall.title"), JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + if (result != JOptionPane.YES_OPTION) { + return; // if user does not agree to deletion, abort the action + } + } + + deleteElements(elements); }); addtag.addActionListener(e -> { @@ -145,8 +157,7 @@ protected JItemListField(MCreator mcreator, boolean excludeButton, boolean allow if (e.getButton() == MouseEvent.BUTTON2) { int index = elementsList.locationToIndex(e.getPoint()); if (index >= 0) - elementsList.setSelectedIndex(index); - remove.doClick(); + deleteElements(Collections.singletonList(elementsListModel.get(index))); } else if (e.getClickCount() == 2) { int index = elementsList.locationToIndex(e.getPoint()); if (index >= 0) { @@ -173,7 +184,7 @@ protected JItemListField(MCreator mcreator, boolean excludeButton, boolean allow include.addActionListener(e -> this.listeners.forEach(l -> l.stateChanged(new ChangeEvent(e.getSource())))); exclude.addActionListener(e -> this.listeners.forEach(l -> l.stateChanged(new ChangeEvent(e.getSource())))); - JScrollPane pane = new JScrollPane(PanelUtils.totalCenterInPanel(elementsList)); + pane = new JScrollPane(PanelUtils.totalCenterInPanel(elementsList)); pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); pane.setWheelScrollingEnabled(false); @@ -208,7 +219,7 @@ protected JItemListField(MCreator mcreator, boolean excludeButton, boolean allow buttonsPanel.add(remove); buttonsPanel.add(removeall); - JComponent buttons = PanelUtils.totalCenterInPanel(buttonsPanel); + buttons = PanelUtils.totalCenterInPanel(buttonsPanel); buttons.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Theme.current().getInterfaceAccentColor())); buttons.setOpaque(true); buttons.setBackground(Theme.current().getSecondAltBackgroundColor()); @@ -232,6 +243,56 @@ protected JItemListField(MCreator mcreator, boolean excludeButton, boolean allow add(buttons, BorderLayout.EAST); } + public void setWarnOnRemoveAll(boolean warnOnDeleteAll) { + this.warnOnRemoveAll = warnOnDeleteAll; + } + + private void deleteElements(List elements) { + boolean anyRemoved = false; + + boolean deleteManaged = false; + boolean containsManaged = elements.stream() + .anyMatch(e -> e instanceof MappableElement mappableElement && mappableElement.isManaged()); + + if (containsManaged) { + int result = JOptionPane.showConfirmDialog(mcreator, L10N.t("dialog.itemlistfield.deletemanaged"), + L10N.t("dialog.itemlistfield.deletemanaged.title"), JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + if (result == JOptionPane.YES_OPTION) { + deleteManaged = true; + } else if (result != JOptionPane.NO_OPTION) { + return; // if action is not yes or no, cancel deletion + } + } + + for (var element : elements) { + if (element != null) { + if (!deleteManaged && element instanceof MappableElement mappableElement && mappableElement.isManaged()) + continue; // Managed elements are only delete if deleteManaged is true + + elementsListModel.removeElement(element); + anyRemoved = true; + } + } + + if (anyRemoved) { + this.listeners.forEach(l -> l.stateChanged(new ChangeEvent(this))); + } + } + + public void hideButtons() { + buttons.setVisible(false); + } + + public void disableItemCentering() { + Box verticalBox = Box.createVerticalBox(); + verticalBox.add(Box.createVerticalGlue()); + verticalBox.add(elementsList); + verticalBox.add(Box.createVerticalGlue()); + elementsList.setAlignmentX(JComponent.LEFT_ALIGNMENT); + pane.setViewportView(verticalBox); + } + protected abstract List getElementsToAdd(); protected List getTagsToAdd() { @@ -328,18 +389,30 @@ class CustomListCellRenderer extends JLabel implements ListCellRenderer { public Component getListCellRendererComponent(JList list, T value, int index, boolean isSelected, boolean cellHasFocus) { setOpaque(true); - setBackground(isSelected ? Theme.current().getForegroundColor() : Theme.current().getAltBackgroundColor()); + setBackground(isSelected ? Theme.current().getForegroundColor() : Theme.current().getBackgroundColor()); setForeground( isSelected ? Theme.current().getSecondAltBackgroundColor() : Theme.current().getForegroundColor()); - setBorder(BorderFactory.createCompoundBorder( - BorderFactory.createMatteBorder(0, 4, 0, 0, Theme.current().getBackgroundColor()), - BorderFactory.createEmptyBorder(2, 5, 2, 5))); + if (isSelected) { + setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createMatteBorder(0, 4, 0, 0, Theme.current().getBackgroundColor()), + BorderFactory.createEmptyBorder(2, 5, 2, 5))); + } else { + setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createMatteBorder(0, 4, 0, 0, Theme.current().getBackgroundColor()), + BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(Theme.current().getAltBackgroundColor(), 1), + BorderFactory.createEmptyBorder(1, 4, 1, 4)))); + } setHorizontalAlignment(SwingConstants.CENTER); setVerticalAlignment(SwingConstants.CENTER); setIcon(null); if (value instanceof MappableElement mappableElement) { + if (!isSelected && mappableElement.isManaged()) { + setBackground(Theme.current().getAltBackgroundColor()); + } + Optional dataListEntryOpt = mappableElement.getDataListEntry(); if (dataListEntryOpt.isPresent()) { DataListEntry dataListEntry = dataListEntryOpt.get(); diff --git a/src/main/java/net/mcreator/ui/dialogs/AddCommonTagsDialog.java b/src/main/java/net/mcreator/ui/dialogs/AddCommonTagsDialog.java new file mode 100644 index 00000000000..2cd7def26bb --- /dev/null +++ b/src/main/java/net/mcreator/ui/dialogs/AddCommonTagsDialog.java @@ -0,0 +1,156 @@ +/* + * MCreator (https://mcreator.net/) + * Copyright (C) 2012-2020, Pylo + * Copyright (C) 2020-2023, Pylo, opensource contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.mcreator.ui.dialogs; + +import net.mcreator.minecraft.TagType; +import net.mcreator.ui.MCreator; +import net.mcreator.ui.component.util.PanelUtils; +import net.mcreator.ui.init.L10N; +import net.mcreator.ui.init.UIRES; +import net.mcreator.workspace.elements.TagElement; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.function.Consumer; + +public class AddCommonTagsDialog { + + public static void open(MCreator mcreator) { + MCreatorDialog dialog = new MCreatorDialog(mcreator, L10N.t("dialog.tools.inject_tags.title"), true); + dialog.setLayout(new BorderLayout(10, 10)); + dialog.setIconImage(UIRES.get("16px.injecttags").getImage()); + + dialog.add("North", PanelUtils.join(FlowLayout.LEFT, L10N.label("dialog.tools.inject_tags.text_top"))); + + JPanel props = new JPanel(new GridLayout(0, 1, 2, 2)); + + JScrollPane scrollPane = new JScrollPane(props); + scrollPane.getVerticalScrollBar().setUnitIncrement(10); + + dialog.add("Center", scrollPane); + + JButton ok = L10N.button("dialog.tools.inject_tags.confirm"); + JButton cancel = new JButton(UIManager.getString("OptionPane.cancelButtonText")); + cancel.addActionListener(e -> dialog.setVisible(false)); + dialog.add("South", PanelUtils.join(ok, cancel)); + + List> callables = new ArrayList<>(); + + callables.add(addTag(mcreator, props, "dirt", "minecraft", TagType.BLOCKS, true)); + callables.add(addTag(mcreator, props, "logs", "minecraft", TagType.BLOCKS, true)); + callables.add(addTag(mcreator, props, "fences", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "wooden_fences", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "walls", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "small_flowers", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "tall_flowers", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "bee_growables", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "valid_spawn", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "impermeable", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "beacon_base_blocks", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "leaves", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "climbable", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "fire", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "dragon_immune", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "wither_immune", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "animals_spawnable_on", "minecraft", TagType.BLOCKS, false)); + callables.add(addTag(mcreator, props, "prevent_mob_spawning_inside", "minecraft", TagType.BLOCKS, false)); + + callables.add(addTag(mcreator, props, "arrows", "minecraft", TagType.ITEMS, false)); + callables.add(addTag(mcreator, props, "planks", "minecraft", TagType.ITEMS, false)); + callables.add(addTag(mcreator, props, "flowers", "minecraft", TagType.ITEMS, false)); + callables.add(addTag(mcreator, props, "small_flowers", "minecraft", TagType.ITEMS, false)); + + callables.add(addTag(mcreator, props, "arrows", "minecraft", TagType.ENTITIES, false)); + callables.add(addTag(mcreator, props, "impact_projectiles", "minecraft", TagType.ENTITIES, false)); + callables.add(addTag(mcreator, props, "beehive_inhabitors", "minecraft", TagType.ENTITIES, false)); + callables.add(addTag(mcreator, props, "raiders", "minecraft", TagType.ENTITIES, false)); + callables.add(addTag(mcreator, props, "skeletons", "minecraft", TagType.ENTITIES, false)); + + callables.add(addTag(mcreator, props, "is_overworld", "minecraft", TagType.BIOMES, true)); + callables.add(addTag(mcreator, props, "is_nether", "minecraft", TagType.BIOMES, false)); + callables.add(addTag(mcreator, props, "is_end", "minecraft", TagType.BIOMES, false)); + callables.add(addTag(mcreator, props, "is_ocean", "minecraft", TagType.BIOMES, false)); + callables.add(addTag(mcreator, props, "is_mountain", "minecraft", TagType.BIOMES, false)); + callables.add(addTag(mcreator, props, "is_river", "minecraft", TagType.BIOMES, false)); + callables.add(addTag(mcreator, props, "is_hill", "minecraft", TagType.BIOMES, false)); + callables.add(addTag(mcreator, props, "is_forest", "minecraft", TagType.BIOMES, false)); + callables.add(addTag(mcreator, props, "is_savanna", "minecraft", TagType.BIOMES, false)); + + callables.add(addTag(mcreator, props, "tick", "minecraft", TagType.FUNCTIONS, false)); + callables.add(addTag(mcreator, props, "load", "minecraft", TagType.FUNCTIONS, false)); + + callables.add(addTag(mcreator, props, "is_drowning", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "is_explosion", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "is_fall", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "is_fire", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "is_freezing", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "is_projectile", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "bypasses_armor", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "bypasses_cooldown", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "bypasses_effects", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "bypasses_enchantments", "minecraft", TagType.DAMAGE_TYPES, false)); + callables.add(addTag(mcreator, props, "bypasses_shield", "minecraft", TagType.DAMAGE_TYPES, false)); + + ok.addActionListener(e -> { + dialog.setCursor(new Cursor(Cursor.WAIT_CURSOR)); + callables.forEach(c -> c.accept(false)); + mcreator.mv.reloadElementsInCurrentTab(); + dialog.setCursor(Cursor.getDefaultCursor()); + dialog.setVisible(false); + }); + + dialog.getRootPane().setDefaultButton(ok); + dialog.setSize(740, 420); + dialog.setLocationRelativeTo(mcreator); + dialog.setVisible(true); + } + + private static Consumer addTag(MCreator mcreator, JPanel panel, String name, String namespace, + TagType type, boolean checked) { + TagElement tagElement = new TagElement(type, namespace + ":" + name); + + boolean existing = mcreator.getWorkspace().getTagElements().containsKey(tagElement); + + JCheckBox box = new JCheckBox("" + namespace + ":" + name + "
" + L10N.t( + "dialog.tools.inject_tags.tag." + type.name().toLowerCase(Locale.ENGLISH) + "." + namespace + "." + + name)); + box.setSelected(checked); + + JPanel wrap = new JPanel(new GridLayout()); + wrap.add(box); + wrap.setBorder(BorderFactory.createMatteBorder(0, 8, 0, 0, type.getColor())); + panel.add(wrap); + + if (existing) + box.setEnabled(false); + + return altcondition -> { + if (box.isSelected() || altcondition) { + if (!mcreator.getWorkspace().getTagElements().containsKey(tagElement)) { + mcreator.getWorkspace().addTagElement(tagElement); + } + } + }; + } + +} diff --git a/src/main/java/net/mcreator/ui/dialogs/AddTagDialog.java b/src/main/java/net/mcreator/ui/dialogs/AddTagDialog.java index 3723537f57c..a9b9a26e51e 100644 --- a/src/main/java/net/mcreator/ui/dialogs/AddTagDialog.java +++ b/src/main/java/net/mcreator/ui/dialogs/AddTagDialog.java @@ -19,9 +19,6 @@ package net.mcreator.ui.dialogs; -import net.mcreator.element.GeneratableElement; -import net.mcreator.element.ModElementType; -import net.mcreator.element.types.Tag; import net.mcreator.minecraft.TagType; import net.mcreator.ui.MCreator; import net.mcreator.ui.component.util.ComponentUtils; @@ -30,7 +27,7 @@ import net.mcreator.ui.validation.Validator; import net.mcreator.ui.validation.component.VComboBox; import net.mcreator.ui.validation.validators.ResourceLocationValidator; -import net.mcreator.workspace.elements.ModElement; +import net.mcreator.workspace.elements.TagElement; import javax.swing.*; import java.awt.*; @@ -45,13 +42,9 @@ public static String openAddTagDialog(Window parent, MCreator mcreator, TagType wrap.setBorder(BorderFactory.createMatteBorder(0, 5, 0, 0, tagType.getColor())); tagName.setValidator(new ResourceLocationValidator<>(L10N.t("modelement.tag"), tagName, true)); - for (ModElement modElement : mcreator.getWorkspace().getModElements()) { - if (modElement.getType() == ModElementType.TAG) { - GeneratableElement ge = modElement.getGeneratableElement(); - if (ge instanceof Tag tag) { - if (TagType.fromLegacyName(tag.type).equals(tagType)) - tagName.addItem(tag.getResourceLocation()); - } + for (TagElement tagElement : mcreator.getWorkspace().getTagElements().keySet()) { + if (tagElement.type() == tagType) { + tagName.addItem(tagElement.resourcePath()); } } diff --git a/src/main/java/net/mcreator/ui/dialogs/NewTagDialog.java b/src/main/java/net/mcreator/ui/dialogs/NewTagDialog.java new file mode 100644 index 00000000000..8e6c8b81204 --- /dev/null +++ b/src/main/java/net/mcreator/ui/dialogs/NewTagDialog.java @@ -0,0 +1,101 @@ +/* + * MCreator (https://mcreator.net/) + * Copyright (C) 2012-2020, Pylo + * Copyright (C) 2020-2023, Pylo, opensource contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.mcreator.ui.dialogs; + +import net.mcreator.minecraft.TagType; +import net.mcreator.ui.MCreator; +import net.mcreator.ui.init.L10N; +import net.mcreator.ui.validation.ValidationGroup; +import net.mcreator.ui.validation.component.VComboBox; +import net.mcreator.ui.validation.validators.NamespaceValidator; +import net.mcreator.ui.validation.validators.ResourceLocationValidator; +import net.mcreator.workspace.elements.TagElement; + +import javax.swing.*; +import java.awt.*; +import java.util.Objects; + +public class NewTagDialog { + + public static TagElement showNewTagDialog(MCreator mcreator) { + JPanel panel = new JPanel(new GridLayout(3, 2, 10, 2)); + + JComboBox type = new JComboBox<>(TagType.values()); + VComboBox namespace = new VComboBox<>(new String[] { "minecraft", "mod", "forge", "c" }); + VComboBox name = new VComboBox<>(); + + type.setPreferredSize(new Dimension(250, 38)); + + name.setValidator(new ResourceLocationValidator<>(L10N.t("dialog.tags.tag"), name, false)); + name.enableRealtimeValidation(); + name.addItem("tag"); + name.addItem("category/tag"); + name.addItem("tick"); + name.addItem("load"); + name.addItem("logs"); + name.addItem("beacon_base_blocks"); + name.setEditable(true); + name.setOpaque(false); + + namespace.setValidator(new NamespaceValidator<>(namespace)); + namespace.enableRealtimeValidation(); + namespace.setEditable(true); + + name.addActionListener(e -> { + if (Objects.equals(name.getSelectedItem(), "tick") || Objects.equals(name.getSelectedItem(), "load")) { + namespace.setSelectedItem("minecraft"); + type.setSelectedItem(TagType.FUNCTIONS); + } + }); + + panel.add(L10N.label("dialog.tags.tag_type")); + panel.add(type); + panel.add(L10N.label("dialog.tags.tag_namespace")); + panel.add(namespace); + panel.add(L10N.label("dialog.tags.tag_name")); + panel.add(name); + + ValidationGroup group = new ValidationGroup(); + group.addValidationElement(name); + group.addValidationElement(namespace); + + int option = JOptionPane.showConfirmDialog(mcreator, panel, L10N.t("dialog.tags.new_title"), + JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null); + if (option == JOptionPane.OK_OPTION) { + if (group.validateIsErrorFree()) { + TagElement retval = new TagElement((TagType) type.getSelectedItem(), + namespace.getEditor().getItem().toString() + ":" + name.getEditor().getItem().toString()); + if (mcreator.getWorkspace().getTagElements().containsKey(retval)) { + JOptionPane.showMessageDialog(mcreator, L10N.t("dialog.tags.tag_exists"), + L10N.t("dialog.tags.new_title"), JOptionPane.ERROR_MESSAGE); + } else { + return retval; + } + } else { + JOptionPane.showMessageDialog(mcreator, + "" + String.join("
- ", group.getValidationProblemMessages()), + L10N.t("dialog.tags.new_title"), JOptionPane.ERROR_MESSAGE); + } + } + + return null; + } + +} diff --git a/src/main/java/net/mcreator/ui/dialogs/preferences/ThemesPanel.java b/src/main/java/net/mcreator/ui/dialogs/preferences/ThemesPanel.java index abafa1f6b83..7949745b55e 100644 --- a/src/main/java/net/mcreator/ui/dialogs/preferences/ThemesPanel.java +++ b/src/main/java/net/mcreator/ui/dialogs/preferences/ThemesPanel.java @@ -24,7 +24,7 @@ import net.mcreator.ui.component.util.PanelUtils; import net.mcreator.ui.init.L10N; import net.mcreator.ui.laf.themes.Theme; -import net.mcreator.ui.laf.themes.ThemeLoader; +import net.mcreator.ui.laf.themes.ThemeManager; import javax.swing.*; import java.awt.*; @@ -50,7 +50,8 @@ public ThemesPanel(PreferencesDialog dialog) { String themeDescription = L10N.t("preferences.themes.select_theme.description"); top.add("West", L10N.label("dialog.preferences.entry_description", themeName, themeDescription)); - JComboBox themeIDs = new JComboBox<>(ThemeLoader.getThemeIDList().toArray(new String[0])); + JComboBox themeIDs = new JComboBox<>( + ThemeManager.getThemes().stream().map(Theme::getID).toArray(String[]::new)); themeIDs.setPreferredSize(new Dimension(250, 0)); themeIDs.setSelectedItem(PreferencesManager.PREFERENCES.hidden.uiTheme.get()); themeIDs.addActionListener(e -> dialog.markChanged()); @@ -73,7 +74,7 @@ public ThemesPanel(PreferencesDialog dialog) { private void reloadThemesList() { tmodel.removeAllElements(); - ThemeLoader.getThemes().stream().sorted(Comparator.comparing(Theme::getID)).forEach(tmodel::addElement); + ThemeManager.getThemes().stream().sorted(Comparator.comparing(Theme::getID)).forEach(tmodel::addElement); } static class ThemesListCellRenderer extends JLabel implements ListCellRenderer { diff --git a/src/main/java/net/mcreator/ui/dialogs/tools/InjectTagsTool.java b/src/main/java/net/mcreator/ui/dialogs/tools/InjectTagsTool.java deleted file mode 100644 index 21e56a2f0f3..00000000000 --- a/src/main/java/net/mcreator/ui/dialogs/tools/InjectTagsTool.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * MCreator (https://mcreator.net/) - * Copyright (C) 2020 Pylo and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.mcreator.ui.dialogs.tools; - -import com.google.common.base.CaseFormat; -import net.mcreator.element.ModElementType; -import net.mcreator.element.types.Tag; -import net.mcreator.generator.GeneratorConfiguration; -import net.mcreator.generator.GeneratorStats; -import net.mcreator.ui.MCreator; -import net.mcreator.ui.action.ActionRegistry; -import net.mcreator.ui.action.BasicAction; -import net.mcreator.ui.component.util.PanelUtils; -import net.mcreator.ui.dialogs.MCreatorDialog; -import net.mcreator.ui.init.L10N; -import net.mcreator.ui.init.UIRES; -import net.mcreator.util.image.ImageUtils; -import net.mcreator.workspace.Workspace; -import net.mcreator.workspace.elements.ModElement; - -import javax.swing.*; -import java.awt.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.function.Consumer; - -public class InjectTagsTool { - - private static void open(MCreator mcreator) { - MCreatorDialog dialog = new MCreatorDialog(mcreator, L10N.t("dialog.tools.inject_tags.title"), true); - dialog.setLayout(new BorderLayout(10, 10)); - dialog.setIconImage(UIRES.get("16px.injecttags").getImage()); - - dialog.add("North", PanelUtils.join(FlowLayout.LEFT, L10N.label("dialog.tools.inject_tags.text_top"))); - - JPanel props = new JPanel(new GridLayout(0, 1, 2, 2)); - - JScrollPane scrollPane = new JScrollPane(props); - scrollPane.getVerticalScrollBar().setUnitIncrement(10); - - dialog.add("Center", scrollPane); - - JButton ok = L10N.button("dialog.tools.inject_tags.confirm"); - JButton cancel = new JButton(UIManager.getString("OptionPane.cancelButtonText")); - cancel.addActionListener(e -> dialog.setVisible(false)); - dialog.add("South", PanelUtils.join(ok, cancel)); - - List> callables = new ArrayList<>(); - - callables.add(addTag(mcreator, props, "dirt", "minecraft", "Blocks", true)); - callables.add(addTag(mcreator, props, "logs", "minecraft", "Blocks", true)); - callables.add(addTag(mcreator, props, "fences", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "wooden_fences", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "walls", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "small_flowers", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "tall_flowers", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "bee_growables", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "valid_spawn", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "impermeable", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "beacon_base_blocks", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "leaves", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "climbable", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "fire", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "dragon_immune", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "wither_immune", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "animals_spawnable_on", "minecraft", "Blocks", false)); - callables.add(addTag(mcreator, props, "prevent_mob_spawning_inside", "minecraft", "Blocks", false)); - - callables.add(addTag(mcreator, props, "arrows", "minecraft", "Items", false)); - callables.add(addTag(mcreator, props, "planks", "minecraft", "Items", false)); - callables.add(addTag(mcreator, props, "flowers", "minecraft", "Items", false)); - callables.add(addTag(mcreator, props, "small_flowers", "minecraft", "Items", false)); - - callables.add(addTag(mcreator, props, "arrows", "minecraft", "Entities", false)); - callables.add(addTag(mcreator, props, "impact_projectiles", "minecraft", "Entities", false)); - callables.add(addTag(mcreator, props, "beehive_inhabitors", "minecraft", "Entities", false)); - callables.add(addTag(mcreator, props, "raiders", "minecraft", "Entities", false)); - callables.add(addTag(mcreator, props, "skeletons", "minecraft", "Entities", false)); - - callables.add(addTag(mcreator, props, "is_overworld", "minecraft", "Biomes", true)); - callables.add(addTag(mcreator, props, "is_nether", "minecraft", "Biomes", false)); - callables.add(addTag(mcreator, props, "is_end", "minecraft", "Biomes", false)); - callables.add(addTag(mcreator, props, "is_ocean", "minecraft", "Biomes", false)); - callables.add(addTag(mcreator, props, "is_mountain", "minecraft", "Biomes", false)); - callables.add(addTag(mcreator, props, "is_river", "minecraft", "Biomes", false)); - callables.add(addTag(mcreator, props, "is_hill", "minecraft", "Biomes", false)); - callables.add(addTag(mcreator, props, "is_forest", "minecraft", "Biomes", false)); - callables.add(addTag(mcreator, props, "is_savanna", "minecraft", "Biomes", false)); - - callables.add(addTag(mcreator, props, "tick", "minecraft", "Functions", false)); - callables.add(addTag(mcreator, props, "load", "minecraft", "Functions", false)); - - callables.add(addTag(mcreator, props, "is_drowning", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "is_explosion", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "is_fall", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "is_fire", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "is_freezing", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "is_projectile", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "bypasses_armor", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "bypasses_cooldown", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "bypasses_effects", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "bypasses_enchantments", "minecraft", "Damage types", false)); - callables.add(addTag(mcreator, props, "bypasses_shield", "minecraft", "Damage types", false)); - - ok.addActionListener(e -> { - dialog.setCursor(new Cursor(Cursor.WAIT_CURSOR)); - callables.forEach(c -> c.accept(false)); - mcreator.mv.reloadElementsInCurrentTab(); - dialog.setCursor(Cursor.getDefaultCursor()); - dialog.setVisible(false); - }); - - dialog.getRootPane().setDefaultButton(ok); - dialog.setSize(740, 420); - dialog.setLocationRelativeTo(mcreator); - dialog.setVisible(true); - } - - private static Consumer addTag(MCreator mcreator, JPanel panel, String name, String namespace, String type, - boolean checked) { - boolean existing = mcreator.getWorkspace().containsModElement(getNameForTag(name, type)); - - JCheckBox box = new JCheckBox( - "" + namespace + ":" + name + (existing ? (" -> " + getNameForTag(name, type)) : "") - + "
" + L10N.t( - "dialog.tools.inject_tags.tag." + type.toLowerCase(Locale.ENGLISH).replace(' ', '_') + "." - + namespace + "." + name)); - box.setSelected(checked); - - JLabel icon = new JLabel(); - switch (type) { - case "Blocks" -> - icon.setIcon(new ImageIcon(ImageUtils.resizeAA(ModElementType.BLOCK.getIcon().getImage(), 32))); - case "Items" -> icon.setIcon(new ImageIcon(ImageUtils.resizeAA(ModElementType.ITEM.getIcon().getImage(), 32))); - case "Functions" -> - icon.setIcon(new ImageIcon(ImageUtils.resizeAA(ModElementType.FUNCTION.getIcon().getImage(), 32))); - case "Entities" -> - icon.setIcon(new ImageIcon(ImageUtils.resizeAA(ModElementType.LIVINGENTITY.getIcon().getImage(), 32))); - case "Biomes" -> - icon.setIcon(new ImageIcon(ImageUtils.resizeAA(ModElementType.BIOME.getIcon().getImage(), 32))); - case "Damage types" -> - icon.setIcon(new ImageIcon(ImageUtils.resizeAA(ModElementType.DAMAGETYPE.getIcon().getImage(), 32))); - } - - panel.add(PanelUtils.centerAndEastElement(box, icon)); - - if (existing) - box.setEnabled(false); - - return altcondition -> { - if (box.isSelected() || altcondition) - injectTagToWorkspace(mcreator, name, namespace, type); - }; - } - - private static String getNameForTag(String name, String type) { - if (name.endsWith("s")) - name = name.substring(0, name.length() - 1); - - return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name.replace("_blocks", "")) - + ("Damage types".equals(type) ? "DamageTypes" : type); - } - - private static void injectTagToWorkspace(MCreator mcreator, String name, String namespace, String type) { - String modElementName = getNameForTag(name, type); - Workspace workspace = mcreator.getWorkspace(); - - if (!workspace.containsModElement(modElementName)) { - Tag tag = new Tag(new ModElement(workspace, modElementName, ModElementType.TAG)); - tag.name = name; - tag.namespace = namespace; - tag.type = type; - - tag.blocks = Collections.emptyList(); - tag.items = Collections.emptyList(); - tag.functions = Collections.emptyList(); - tag.entities = Collections.emptyList(); - tag.biomes = Collections.emptyList(); - tag.damageTypes = Collections.emptyList(); - - workspace.getModElementManager().storeModElementPicture(tag); - workspace.addModElement(tag.getModElement()); - workspace.getGenerator().generateElement(tag); - workspace.getModElementManager().storeModElement(tag); - } - } - - public static BasicAction getAction(ActionRegistry actionRegistry) { - return new BasicAction(actionRegistry, L10N.t("action.pack_tools.tag"), - e -> open(actionRegistry.getMCreator())) { - @Override public boolean isEnabled() { - GeneratorConfiguration gc = actionRegistry.getMCreator().getGeneratorConfiguration(); - return gc.getGeneratorStats().getModElementTypeCoverageInfo().get(ModElementType.TAG) - != GeneratorStats.CoverageStatus.NONE; - } - }.setIcon(UIRES.get("16px.injecttags")); - } - -} diff --git a/src/main/java/net/mcreator/ui/dialogs/workspace/GeneratorSelector.java b/src/main/java/net/mcreator/ui/dialogs/workspace/GeneratorSelector.java index abbc23adaba..53c565edf73 100644 --- a/src/main/java/net/mcreator/ui/dialogs/workspace/GeneratorSelector.java +++ b/src/main/java/net/mcreator/ui/dialogs/workspace/GeneratorSelector.java @@ -95,6 +95,7 @@ public static GeneratorConfiguration getGeneratorSelector(Window parent, @Nullab addStatusLabel(L10N.t(covpfx + "structures"), stats.getBaseCoverageInfo().get("structures"), baseCoverageInfo); addStatusLabel(L10N.t(covpfx + "translations"), stats.getBaseCoverageInfo().get("i18n"), baseCoverageInfo); + addStatusLabel(L10N.t(covpfx + "tags"), stats.getBaseCoverageInfo().get("tags"), baseCoverageInfo); if (generatorConfiguration.getGeneratorFlavor().getBaseLanguage() == GeneratorFlavor.BaseLanguage.JAVA) addStatusLabel(L10N.t(covpfx + "variables"), stats.getBaseCoverageInfo().get("variables"), diff --git a/src/main/java/net/mcreator/ui/laf/themes/Theme.java b/src/main/java/net/mcreator/ui/laf/themes/Theme.java index 47747b0baf3..18ab380ddc0 100644 --- a/src/main/java/net/mcreator/ui/laf/themes/Theme.java +++ b/src/main/java/net/mcreator/ui/laf/themes/Theme.java @@ -40,7 +40,7 @@ private static final Logger LOG = LogManager.getLogger(Theme.class); public static Theme current() { - return ThemeLoader.CURRENT_THEME; + return ThemeManager.CURRENT_THEME; } protected String id; @@ -179,7 +179,7 @@ public ColorScheme getColorScheme() { if (colorScheme != null) return colorScheme; else - return ThemeLoader.getTheme("default_dark").getColorScheme(); + return ThemeManager.getTheme("default_dark").getColorScheme(); } /** diff --git a/src/main/java/net/mcreator/ui/laf/themes/ThemeLoader.java b/src/main/java/net/mcreator/ui/laf/themes/ThemeManager.java similarity index 81% rename from src/main/java/net/mcreator/ui/laf/themes/ThemeLoader.java rename to src/main/java/net/mcreator/ui/laf/themes/ThemeManager.java index 08106619a7b..da64df55428 100644 --- a/src/main/java/net/mcreator/ui/laf/themes/ThemeLoader.java +++ b/src/main/java/net/mcreator/ui/laf/themes/ThemeManager.java @@ -24,22 +24,23 @@ import net.mcreator.plugin.PluginLoader; import net.mcreator.preferences.PreferencesManager; import net.mcreator.ui.init.UIRES; +import net.mcreator.ui.laf.LafUtil; +import net.mcreator.ui.laf.MCreatorTheme; import net.mcreator.util.image.ImageUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.swing.*; +import javax.swing.plaf.metal.MetalLookAndFeel; import java.io.File; import java.util.LinkedHashSet; -import java.util.List; import java.util.Set; import java.util.regex.Pattern; -import java.util.stream.Collectors; /** *

This class detects and then tries to load all {@link Theme}s.

*/ -public class ThemeLoader { +public class ThemeManager { private static final Logger LOG = LogManager.getLogger("Theme Loader"); @@ -49,10 +50,27 @@ public class ThemeLoader { protected static Theme CURRENT_THEME; + /** + * This method loads all {@link Theme}s and sets the current theme to the one selected by the user. + */ + public static void init() { + loadThemes(); + + MetalLookAndFeel.setCurrentTheme(new MCreatorTheme(Theme.current())); + + try { + UIManager.setLookAndFeel(new MetalLookAndFeel()); + LafUtil.applyDefaultHTMLStyles(); + LafUtil.fixMacOSActions(); + } catch (UnsupportedLookAndFeelException e) { + LOG.error("Failed to set MCreator UI theme", e); + } + } + /** *

This method loads the {@link Theme} of all plugins loaded into the current {@link net.mcreator.plugin.PluginLoader} instance.

*/ - public static void initUIThemes() { + private static void loadThemes() { LOG.debug("Loading UI themes"); // Load all themes @@ -79,15 +97,6 @@ public static LinkedHashSet getThemes() { return THEMES; } - /** - *

This method gets the ID of each loaded {@link Theme}.

- * - * @return Returns a {@link java.util.List} of all loaded theme IDs - */ - public static List getThemeIDList() { - return THEMES.stream().map(Theme::getID).collect(Collectors.toList()); - } - /** *

This method checks in all loaded themes to get the theme matching the ID.

* diff --git a/src/main/java/net/mcreator/ui/minecraft/MCItemListField.java b/src/main/java/net/mcreator/ui/minecraft/MCItemListField.java index 6637b47fa52..24eeb656cac 100644 --- a/src/main/java/net/mcreator/ui/minecraft/MCItemListField.java +++ b/src/main/java/net/mcreator/ui/minecraft/MCItemListField.java @@ -77,9 +77,9 @@ class CustomListCellRenderer extends JLabel implements ListCellRenderer list, MItemBlock value, int index, boolean isSelected, boolean cellHasFocus) { - setOpaque(isSelected); + setOpaque(true); - setBackground(isSelected ? Theme.current().getForegroundColor() : Theme.current().getAltBackgroundColor()); + setBackground(isSelected ? Theme.current().getForegroundColor() : Theme.current().getBackgroundColor()); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createMatteBorder(0, 2, 0, 2, Theme.current().getBackgroundColor()), @@ -93,6 +93,10 @@ public Component getListCellRendererComponent(JList list, setIcon(new ImageIcon(ImageUtils.resizeAA( MCItem.getBlockIconBasedOnName(mcreator.getWorkspace(), value.getUnmappedValue()).getImage(), 25))); + if (!isSelected && value.isManaged()) { + setBackground(Theme.current().getAltBackgroundColor()); + } + return this; } } diff --git a/src/main/java/net/mcreator/ui/modgui/ModElementGUI.java b/src/main/java/net/mcreator/ui/modgui/ModElementGUI.java index 04a678f455e..efc84498938 100644 --- a/src/main/java/net/mcreator/ui/modgui/ModElementGUI.java +++ b/src/main/java/net/mcreator/ui/modgui/ModElementGUI.java @@ -18,6 +18,7 @@ package net.mcreator.ui.modgui; +import net.mcreator.Launcher; import net.mcreator.element.GeneratableElement; import net.mcreator.io.net.analytics.AnalyticsConstants; import net.mcreator.minecraft.MCItem; @@ -560,8 +561,8 @@ private void finishModCreation(boolean closeTab) { afterGeneratableElementGenerated(); // build if selected and needed - if (PreferencesManager.PREFERENCES.gradle.compileOnSave.get() && mcreator.getModElementManager() - .requiresElementGradleBuild(element)) { + if ((Launcher.version.isDevelopment() || PreferencesManager.PREFERENCES.gradle.buildOnSave.get()) + && mcreator.getModElementManager().requiresElementGradleBuild(element)) { mcreator.actionRegistry.buildWorkspace.doAction(); } diff --git a/src/main/java/net/mcreator/ui/modgui/TagGUI.java b/src/main/java/net/mcreator/ui/modgui/TagGUI.java deleted file mode 100644 index 5875da48c29..00000000000 --- a/src/main/java/net/mcreator/ui/modgui/TagGUI.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * MCreator (https://mcreator.net/) - * Copyright (C) 2020 Pylo and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.mcreator.ui.modgui; - -import net.mcreator.element.ModElementType; -import net.mcreator.element.types.Tag; -import net.mcreator.generator.mapping.NonMappableElement; -import net.mcreator.minecraft.ElementUtil; -import net.mcreator.minecraft.RegistryNameFixer; -import net.mcreator.ui.MCreator; -import net.mcreator.ui.MCreatorApplication; -import net.mcreator.ui.component.util.PanelUtils; -import net.mcreator.ui.help.HelpUtils; -import net.mcreator.ui.init.L10N; -import net.mcreator.ui.minecraft.*; -import net.mcreator.ui.validation.AggregatedValidationResult; -import net.mcreator.ui.validation.component.VComboBox; -import net.mcreator.ui.validation.validators.NamespaceValidator; -import net.mcreator.ui.validation.validators.ResourceLocationValidator; -import net.mcreator.workspace.elements.ModElement; - -import javax.annotation.Nullable; -import javax.swing.*; -import java.awt.*; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Objects; -import java.util.stream.Collectors; - -public class TagGUI extends ModElementGUI { - - private final VComboBox namespace = new VComboBox<>(new String[] { "minecraft", "mod", "forge", "c" }); - private final JComboBox type = new JComboBox<>( - new String[] { "Items", "Blocks", "Entities", "Biomes", "Functions", "Damage types" }); - - private MCItemListField items; - private MCItemListField blocks; - private SpawnableEntityListField entities; - private BiomeListField biomes; - private ModElementListField functions; - private DamageTypeListField damageTypes; - - private final VComboBox name = new VComboBox<>(); - - public TagGUI(MCreator mcreator, ModElement modElement, boolean editingMode) { - super(mcreator, modElement, editingMode); - this.initGUI(); - super.finalizeGUI(); - } - - @Override protected void initGUI() { - JPanel pane3 = new JPanel(new BorderLayout()); - pane3.setOpaque(false); - - items = new MCItemListField(mcreator, ElementUtil::loadBlocksAndItems, false, true); - blocks = new MCItemListField(mcreator, ElementUtil::loadBlocks, false, true); - entities = new SpawnableEntityListField(mcreator, true); - biomes = new BiomeListField(mcreator, true); - functions = new ModElementListField(mcreator, ModElementType.FUNCTION); - damageTypes = new DamageTypeListField(mcreator, true); - - name.setValidator(new ResourceLocationValidator<>(L10N.t("modelement.tag"), name, false)); - name.enableRealtimeValidation(); - - namespace.setValidator(new NamespaceValidator<>(namespace)); - namespace.enableRealtimeValidation(); - - name.addItem("tag"); - name.addItem("category/tag"); - name.addItem("tick"); - name.addItem("load"); - name.addItem("logs"); - name.addItem("beacon_base_blocks"); - - name.setEditable(true); - name.setOpaque(false); - - namespace.setEditable(true); - - CardLayout valuesLayout = new CardLayout(); - JPanel valuesPan = new JPanel(valuesLayout); - - valuesPan.add(items, "Items"); - valuesPan.add(blocks, "Blocks"); - valuesPan.add(functions, "Functions"); - valuesPan.add(entities, "Entities"); - valuesPan.add(biomes, "Biomes"); - valuesPan.add(damageTypes, "Damage types"); - - if (isEditingMode()) { - type.setEnabled(false); - name.setEnabled(false); - namespace.setEnabled(false); - } else { - name.getEditor().setItem(RegistryNameFixer.fromCamelCase(modElement.getName())); - - name.addActionListener(e -> { - if (Objects.equals(name.getSelectedItem(), "tick") || Objects.equals(name.getSelectedItem(), "load")) { - namespace.setSelectedItem("minecraft"); - type.setSelectedItem("Functions"); - } - }); - } - - JPanel main = new JPanel(new GridLayout(4, 2, 10, 2)); - main.setOpaque(false); - - main.add(HelpUtils.wrapWithHelpButton(this.withEntry("tag/registry_name"), - L10N.label("elementgui.tag.registry_name"))); - main.add(name); - - main.add(HelpUtils.wrapWithHelpButton(this.withEntry("tag/namespace"), L10N.label("elementgui.tag.namespace"))); - main.add(namespace); - - main.add(HelpUtils.wrapWithHelpButton(this.withEntry("tag/type"), L10N.label("elementgui.tag.type"))); - main.add(type); - - main.add(HelpUtils.wrapWithHelpButton(this.withEntry("tag/tag_elements"), - L10N.label("elementgui.tag.elements"))); - main.add(valuesPan); - - type.addActionListener(e -> valuesLayout.show(valuesPan, (String) type.getSelectedItem())); - - pane3.add(PanelUtils.totalCenterInPanel(main)); - - addPage(pane3); - } - - @Override protected AggregatedValidationResult validatePage(int page) { - return new AggregatedValidationResult(name, namespace); - } - - @Override public void openInEditingMode(Tag tag) { - type.setSelectedItem(tag.type); - namespace.getEditor().setItem(tag.namespace); - name.getEditor().setItem(tag.name); - - items.setListElements(tag.items); - blocks.setListElements(tag.blocks); - functions.setListElements(tag.functions.stream().map(NonMappableElement::new).toList()); - entities.setListElements(tag.entities); - biomes.setListElements(tag.biomes); - damageTypes.setListElements(tag.damageTypes); - } - - @Override public Tag getElementFromGUI() { - Tag tag = new Tag(modElement); - tag.namespace = namespace.getEditor().getItem().toString(); - tag.type = (String) type.getSelectedItem(); - - tag.items = items.getListElements(); - tag.blocks = blocks.getListElements(); - tag.functions = functions.getListElements().stream().map(NonMappableElement::getUnmappedValue) - .collect(Collectors.toList()); - tag.entities = entities.getListElements(); - tag.biomes = biomes.getListElements(); - tag.damageTypes = damageTypes.getListElements(); - - tag.name = name.getEditor().getItem().toString(); - return tag; - } - - @Override public @Nullable URI contextURL() throws URISyntaxException { - return new URI(MCreatorApplication.SERVER_DOMAIN + "/wiki/how-make-tag"); - } - -} diff --git a/src/main/java/net/mcreator/ui/modgui/ToolGUI.java b/src/main/java/net/mcreator/ui/modgui/ToolGUI.java index 50413d38b97..f6773f6fbb0 100644 --- a/src/main/java/net/mcreator/ui/modgui/ToolGUI.java +++ b/src/main/java/net/mcreator/ui/modgui/ToolGUI.java @@ -229,14 +229,14 @@ public ToolGUI(MCreator mcreator, ModElement modElement, boolean editingMode) { L10N.label("elementgui.common.enchantability"))); selp.add(enchantability); - selp.add(HelpUtils.wrapWithHelpButton(this.withEntry("tool/attack_speed"), - L10N.label("elementgui.tool.attack_speed"))); - selp.add(attackSpeed); - selp.add(HelpUtils.wrapWithHelpButton(this.withEntry("item/damage_vs_entity"), L10N.label("elementgui.tool.damage_vs_entity"))); selp.add(damageVsEntity); + selp.add(HelpUtils.wrapWithHelpButton(this.withEntry("tool/attack_speed"), + L10N.label("elementgui.tool.attack_speed"))); + selp.add(attackSpeed); + selp.add(HelpUtils.wrapWithHelpButton(this.withEntry("item/number_of_uses"), L10N.label("elementgui.tool.usage_count"))); selp.add(usageCount); diff --git a/src/main/java/net/mcreator/ui/modgui/codeviewer/ModElementCodeViewer.java b/src/main/java/net/mcreator/ui/modgui/codeviewer/ModElementCodeViewer.java index fc15ee845b9..8c890073ad2 100644 --- a/src/main/java/net/mcreator/ui/modgui/codeviewer/ModElementCodeViewer.java +++ b/src/main/java/net/mcreator/ui/modgui/codeviewer/ModElementCodeViewer.java @@ -23,7 +23,10 @@ import net.mcreator.generator.GeneratorFile; import net.mcreator.generator.GeneratorTemplatesList; import net.mcreator.generator.ListTemplate; +import net.mcreator.ui.component.util.ComponentUtils; +import net.mcreator.ui.component.util.PanelUtils; import net.mcreator.ui.component.util.ThreadUtil; +import net.mcreator.ui.init.L10N; import net.mcreator.ui.init.UIRES; import net.mcreator.ui.laf.FileIcons; import net.mcreator.ui.laf.themes.Theme; @@ -178,13 +181,20 @@ private synchronized void reload() { }); // this likely selects first file from cache if currently selected tab is disabled - if (!isEnabledAt(getSelectedIndex()) && !cache.isEmpty()) + int selectedTab = getSelectedIndex(); + if (selectedTab >= 0 && !isEnabledAt(selectedTab) && !cache.isEmpty()) setSelectedIndex(IntStream.range(0, getTabCount()).filter(this::isEnabledAt).min().orElse(0)); setBackground(Theme.current().getAltBackgroundColor()); } catch (Exception ignored) { setBackground(new Color(0x8D5C5C)); } + + if (getTabCount() == 0) + addTab(L10N.t("mod_element_code_viewer.no_files"), PanelUtils.totalCenterInPanel( + ComponentUtils.setForeground(L10N.label("mod_element_code_viewer.no_files.desc"), + Theme.current().getAltForegroundColor()))); + updateRunning = false; }, "CodePreviewReloader").start(); } diff --git a/src/main/java/net/mcreator/ui/workspace/WorkspacePanel.java b/src/main/java/net/mcreator/ui/workspace/WorkspacePanel.java index 4a8b5d99d8b..8cc80f2ef05 100644 --- a/src/main/java/net/mcreator/ui/workspace/WorkspacePanel.java +++ b/src/main/java/net/mcreator/ui/workspace/WorkspacePanel.java @@ -767,6 +767,7 @@ else if (element instanceof FolderElement fe) addVerticalTab("mods", L10N.t("workspace.category.mod_elements"), new WorkspacePanelMods(PanelUtils.westAndCenterElement(toolp, modElementsPanel))); addVerticalTab("resources", L10N.t("workspace.category.resources"), resourcesPan); + addVerticalTab("tags", L10N.t("workspace.category.tags"), new WorkspacePanelTags(this)); addVerticalTab("variables", L10N.t("workspace.category.variables"), new WorkspacePanelVariables(this)); addVerticalTab("localization", L10N.t("workspace.category.localization"), new WorkspacePanelLocalizations(this)); @@ -1071,28 +1072,14 @@ private void searchModElementsUsages() { mcreator.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); Set references = new HashSet<>(); - boolean tagsSelected = false, nonTagsSelected = false; for (IElement el : list.getSelectedValuesList()) { if (el instanceof ModElement mod) { - // We don't look for tag references since those are "weak" references also affected by other mods - if (mod.getType() == ModElementType.TAG) { - tagsSelected = true; - } else { - nonTagsSelected = true; - references.addAll(ReferencesFinder.searchModElementUsages(mcreator.getWorkspace(), mod)); - } + references.addAll(ReferencesFinder.searchModElementUsages(mcreator.getWorkspace(), mod)); } } mcreator.setCursor(Cursor.getDefaultCursor()); - if (tagsSelected) { - JOptionPane.showMessageDialog(mcreator, L10N.t("workspace.elements.list.edit.usages.tags"), - L10N.t("workspace.elements.list.edit.usages.tags.title"), JOptionPane.WARNING_MESSAGE); - } - if (nonTagsSelected) { - SearchUsagesDialog.showUsagesDialog(mcreator, L10N.t("dialog.search_usages.type.mod_element"), - references); - } + SearchUsagesDialog.showUsagesDialog(mcreator, L10N.t("dialog.search_usages.type.mod_element"), references); } } diff --git a/src/main/java/net/mcreator/ui/workspace/WorkspacePanelTags.java b/src/main/java/net/mcreator/ui/workspace/WorkspacePanelTags.java new file mode 100644 index 00000000000..efd910dc637 --- /dev/null +++ b/src/main/java/net/mcreator/ui/workspace/WorkspacePanelTags.java @@ -0,0 +1,422 @@ +/* + * MCreator (https://mcreator.net/) + * Copyright (C) 2012-2020, Pylo + * Copyright (C) 2020-2023, Pylo, opensource contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.mcreator.ui.workspace; + +import net.mcreator.element.ModElementType; +import net.mcreator.element.parts.BiomeEntry; +import net.mcreator.element.parts.DamageTypeEntry; +import net.mcreator.element.parts.EntityEntry; +import net.mcreator.element.parts.MItemBlock; +import net.mcreator.generator.GeneratorStats; +import net.mcreator.generator.mapping.MappableElement; +import net.mcreator.generator.mapping.NonMappableElement; +import net.mcreator.minecraft.ElementUtil; +import net.mcreator.minecraft.TagType; +import net.mcreator.ui.MCreator; +import net.mcreator.ui.component.JEmptyBox; +import net.mcreator.ui.component.JItemListField; +import net.mcreator.ui.component.TransparentToolBar; +import net.mcreator.ui.component.util.ComponentUtils; +import net.mcreator.ui.dialogs.AddCommonTagsDialog; +import net.mcreator.ui.dialogs.NewTagDialog; +import net.mcreator.ui.init.L10N; +import net.mcreator.ui.init.UIRES; +import net.mcreator.ui.laf.SlickDarkScrollBarUI; +import net.mcreator.ui.laf.themes.Theme; +import net.mcreator.ui.minecraft.*; +import net.mcreator.workspace.elements.TagElement; + +import javax.swing.*; +import javax.swing.table.*; +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class WorkspacePanelTags extends AbstractWorkspacePanel { + + private final TableRowSorter sorter; + private final JTable elements; + + // Cache of list fields (so cell renderer just sets the value instead of making a new object) + private final MCItemListField listFieldBlocksItems = new MCItemListField(workspacePanel.getMCreator(), + ElementUtil::loadBlocksAndItems, false, true); + private final SpawnableEntityListField listFieldEntities = new SpawnableEntityListField( + workspacePanel.getMCreator(), true); + private final BiomeListField listFieldBiomes = new BiomeListField(workspacePanel.getMCreator(), true); + private final ModElementListField listFieldFunctions = new ModElementListField(workspacePanel.getMCreator(), + ModElementType.FUNCTION); + private final DamageTypeListField listFieldDamageTypes = new DamageTypeListField(workspacePanel.getMCreator(), + true); + + private final JEmptyBox DUMMY_FIELD = new JEmptyBox(); + + // Cache of list editor + private ItemListFieldCellEditor lastEditor = null; + + public WorkspacePanelTags(WorkspacePanel workspacePanel) { + super(workspacePanel); + setLayout(new BorderLayout(0, 5)); + + listFieldBlocksItems.disableItemCentering(); + listFieldEntities.disableItemCentering(); + listFieldBiomes.disableItemCentering(); + listFieldFunctions.disableItemCentering(); + listFieldDamageTypes.disableItemCentering(); + + listFieldBlocksItems.hideButtons(); + listFieldEntities.hideButtons(); + listFieldBiomes.hideButtons(); + listFieldFunctions.hideButtons(); + listFieldDamageTypes.hideButtons(); + + listFieldBlocksItems.setEnabled(false); + listFieldEntities.setEnabled(false); + listFieldBiomes.setEnabled(false); + listFieldFunctions.setEnabled(false); + listFieldDamageTypes.setEnabled(false); + + elements = new JTable(new DefaultTableModel( + new Object[] { L10N.t("workspace.tags.tag_type"), L10N.t("workspace.tags.tag_namespace"), + L10N.t("workspace.tags.tag_name"), L10N.t("workspace.tags.tag_elements") }, 0) { + @Override public boolean isCellEditable(int row, int column) { + return column == 3; + } + }) { + @Override public TableCellEditor getCellEditor(int row, int column) { + if (column == 3) { + TagElement tagElement = tagElementForRow(row); + if (lastEditor != null && lastEditor.getTagElement().equals(tagElement)) { + return lastEditor; + } else { + if (lastEditor != null) + lastEditor.cancelTimer(); + return lastEditor = new ItemListFieldCellEditor(tagElement); + } + } + return super.getCellEditor(row, column); + } + + @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { + if (column == 3) { + // Calculate how many elements can fit in the cell (assuming 31px per element which is true for ITEMS and BLOCKS) + int visibleCount = (int) Math.ceil(elements.getColumnModel().getColumn(3).getWidth() / 31.0); + TagElement tagElement = tagElementForRow(row); + Stream entries = workspacePanel.getMCreator().getWorkspace().getTagElements() + .get(tagElement).stream().limit(visibleCount); + switch (tagElement.type()) { + case ITEMS, BLOCKS -> { + listFieldBlocksItems.setListElements(entries.map( + e -> (MItemBlock) TagElement.entryToMappableElement( + workspacePanel.getMCreator().getWorkspace(), tagElement.type(), e)).toList()); + return listFieldBlocksItems; + } + case ENTITIES -> { + listFieldEntities.setListElements(entries.map( + e -> (EntityEntry) TagElement.entryToMappableElement( + workspacePanel.getMCreator().getWorkspace(), tagElement.type(), e)).toList()); + return listFieldEntities; + } + case BIOMES -> { + listFieldBiomes.setListElements(entries.map(e -> (BiomeEntry) TagElement.entryToMappableElement( + workspacePanel.getMCreator().getWorkspace(), tagElement.type(), e)).toList()); + return listFieldBiomes; + } + case FUNCTIONS -> { + listFieldFunctions.setListElements(entries.map( + e -> (NonMappableElement) TagElement.entryToMappableElement( + workspacePanel.getMCreator().getWorkspace(), tagElement.type(), e)).toList()); + return listFieldFunctions; + } + case DAMAGE_TYPES -> { + listFieldDamageTypes.setListElements(entries.map( + e -> (DamageTypeEntry) TagElement.entryToMappableElement( + workspacePanel.getMCreator().getWorkspace(), tagElement.type(), e)).toList()); + return listFieldDamageTypes; + } + } + } + + try { + Component retval = super.prepareRenderer(renderer, row, column); + if (column == 0) { + TagType tagType = (TagType) elements.getValueAt(row, 0); + retval.setForeground(tagType.getColor().brighter()); + } else { + retval.setForeground(Theme.current().getForegroundColor()); + } + return retval; + } catch (Exception ignored) { + return DUMMY_FIELD; + } + } + }; + + sorter = new TableRowSorter<>(elements.getModel()); + sorter.toggleSortOrder(2); + sorter.addRowSorterListener(e -> clearEditor()); + elements.setRowSorter(sorter); + + elements.setBackground(Theme.current().getBackgroundColor()); + elements.setSelectionBackground(Theme.current().getAltBackgroundColor()); + elements.setForeground(Theme.current().getForegroundColor()); + elements.setSelectionForeground(Theme.current().getForegroundColor()); + elements.setBorder(BorderFactory.createEmptyBorder()); + elements.setGridColor(Theme.current().getAltBackgroundColor()); + elements.setRowHeight(32); + elements.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); + elements.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + ComponentUtils.deriveFont(elements, 13); + + JTableHeader header = elements.getTableHeader(); + header.setBackground(Theme.current().getInterfaceAccentColor()); + header.setForeground(Theme.current().getBackgroundColor()); + + header.getColumnModel().getColumn(0).setWidth(240); + header.getColumnModel().getColumn(1).setWidth(240); + header.getColumnModel().getColumn(2).setWidth(380); + header.setResizingColumn(header.getColumnModel().getColumn(3)); + + JScrollPane sp = new JScrollPane(elements); + sp.setBackground(Theme.current().getBackgroundColor()); + sp.getViewport().setOpaque(false); + sp.getVerticalScrollBar().setUI(new SlickDarkScrollBarUI(Theme.current().getBackgroundColor(), + Theme.current().getAltBackgroundColor(), sp.getVerticalScrollBar())); + sp.getVerticalScrollBar().setPreferredSize(new Dimension(8, 0)); + + sp.setColumnHeaderView(null); + + JPanel holder = new JPanel(new BorderLayout()); + holder.setOpaque(false); + holder.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); + holder.add(sp); + + add("Center", holder); + + TransparentToolBar bar = new TransparentToolBar(); + bar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 0)); + + bar.add(createToolBarButton("workspace.tags.add_new", UIRES.get("16px.add.gif"), e -> { + TagElement tag = NewTagDialog.showNewTagDialog(workspacePanel.getMCreator()); + if (tag != null) { + workspacePanel.getMCreator().getWorkspace().addTagElement(tag); + reloadElements(); + } + })); + + bar.add(createToolBarButton("workspace.tags.add_common", UIRES.get("16px.injecttags"), e -> { + AddCommonTagsDialog.open(workspacePanel.getMCreator()); + reloadElements(); + })); + + bar.add(createToolBarButton("common.delete_selected", UIRES.get("16px.delete.gif"), + e -> deleteCurrentlySelected())); + + add("North", bar); + + elements.addKeyListener(new KeyAdapter() { + @Override public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_DELETE) { + deleteCurrentlySelected(); + } + } + }); + + elements.getSelectionModel().addListSelectionListener(e -> { + if (!e.getValueIsAdjusting()) { + int selectedRow = elements.getSelectedRow(); + int selectedColumn = elements.getSelectedColumn(); + if (selectedRow >= 0 && selectedColumn == 3) { + elements.editCellAt(selectedRow, 3); + } + } + }); + } + + private TagElement tagElementForRow(int row) { + return new TagElement((TagType) elements.getValueAt(row, 0), + elements.getValueAt(row, 1).toString() + ":" + elements.getValueAt(row, 2).toString()); + } + + @Override public boolean isSupportedInWorkspace() { + return workspacePanel.getMCreator().getGeneratorStats().getBaseCoverageInfo().get("tags") + != GeneratorStats.CoverageStatus.NONE; + } + + private void deleteCurrentlySelected() { + if (elements.getSelectedRow() == -1) + return; + + TagElement tagElement = tagElementForRow(elements.getSelectedRow()); + + if (workspacePanel.getMCreator().getWorkspace().getTagElements().get(tagElement).stream() + .anyMatch(TagElement::isEntryManaged)) { + JOptionPane.showMessageDialog(workspacePanel.getMCreator(), + L10N.t("workspace.tags.remove_tags_managed_error"), L10N.t("common.warning"), + JOptionPane.ERROR_MESSAGE); + return; + } + + int n = JOptionPane.showConfirmDialog(workspacePanel.getMCreator(), + L10N.t("workspace.tags.remove_tags_confirmation"), L10N.t("common.confirmation"), + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (n == JOptionPane.YES_OPTION) { + workspacePanel.getMCreator().getWorkspace().removeTagElement(tagElement); + reloadElements(); + } + } + + private void clearEditor() { + if (elements.isEditing()) + elements.getCellEditor().stopCellEditing(); + lastEditor = null; + } + + @Override public void reloadElements() { + int row = elements.getSelectedRow(); + + // Clear lastEditor when reloading elements, so we don't keep potentially outdated entries list in it + clearEditor(); + + DefaultTableModel model = (DefaultTableModel) elements.getModel(); + model.setRowCount(0); + + for (Map.Entry> tag : workspacePanel.getMCreator().getWorkspace().getTagElements() + .entrySet()) { + model.addRow(new Object[] { tag.getKey().type(), tag.getKey().getNamespace(), tag.getKey().getName(), + tag.getValue() }); + } + refilterElements(); + + try { + elements.setRowSelectionInterval(row, row); + } catch (Exception ignored) { + } + } + + @Override public void refilterElements() { + try { + sorter.setRowFilter(RowFilter.regexFilter(workspacePanel.search.getText())); + } catch (Exception ignored) { + } + } + + private class ItemListFieldCellEditor extends AbstractCellEditor implements TableCellEditor { + + private final JItemListField listField; + + private final TagElement tagElement; + + private Timer timer; + + public ItemListFieldCellEditor(TagElement tagElement) { + this.tagElement = tagElement; + + this.listField = itemListFieldForRow(workspacePanel.getMCreator()); + if (this.listField != null) { + this.listField.disableItemCentering(); + this.listField.setWarnOnRemoveAll(true); + this.listField.setEnabled(false); + // Slight delay before enabling so initial click on the row doesn't trigger button actions + timer = new Timer(250, e -> listField.setEnabled(true)); + timer.start(); + } + } + + public void cancelTimer() { + if (timer != null) + timer.stop(); + } + + public TagElement getTagElement() { + return tagElement; + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, + int column) { + return listField; + } + + @Override public Object getCellEditorValue() { + return listField.getListElements().stream().map(TagElement::entryFromMappableElement) + .collect(Collectors.toCollection(ArrayList::new)); + } + + @SuppressWarnings("unchecked") @Override public boolean stopCellEditing() { + ArrayList newValue = (ArrayList) getCellEditorValue(); + if (newValue != null) { + workspacePanel.getMCreator().getWorkspace().getTagElements().put(tagElement, newValue); + workspacePanel.getMCreator().getWorkspace().markDirty(); + } + + return super.stopCellEditing(); + } + + private JItemListField itemListFieldForRow(MCreator mcreator) { + switch (tagElement.type()) { + case ITEMS, BLOCKS -> { + MCItemListField retval = new MCItemListField(mcreator, + tagElement.type() == TagType.ITEMS ? ElementUtil::loadBlocksAndItems : ElementUtil::loadBlocks, + false, true); + retval.setListElements(mcreator.getWorkspace().getTagElements().get(tagElement).stream() + .map(e -> (MItemBlock) TagElement.entryToMappableElement(mcreator.getWorkspace(), + tagElement.type(), e)).toList()); + return retval; + } + case ENTITIES -> { + SpawnableEntityListField retval = new SpawnableEntityListField(mcreator, true); + retval.setListElements(mcreator.getWorkspace().getTagElements().get(tagElement).stream() + .map(e -> (EntityEntry) TagElement.entryToMappableElement(mcreator.getWorkspace(), + tagElement.type(), e)).toList()); + return retval; + } + case BIOMES -> { + BiomeListField retval = new BiomeListField(mcreator, true); + retval.setListElements(mcreator.getWorkspace().getTagElements().get(tagElement).stream() + .map(e -> (BiomeEntry) TagElement.entryToMappableElement(mcreator.getWorkspace(), + tagElement.type(), e)).toList()); + return retval; + } + case FUNCTIONS -> { + ModElementListField retval = new ModElementListField(mcreator, ModElementType.FUNCTION); + retval.setListElements(mcreator.getWorkspace().getTagElements().get(tagElement).stream() + .map(e -> (NonMappableElement) TagElement.entryToMappableElement(mcreator.getWorkspace(), + tagElement.type(), e)).toList()); + return retval; + } + case DAMAGE_TYPES -> { + DamageTypeListField retval = new DamageTypeListField(mcreator, true); + retval.setListElements(mcreator.getWorkspace().getTagElements().get(tagElement).stream() + .map(e -> (DamageTypeEntry) TagElement.entryToMappableElement(mcreator.getWorkspace(), + tagElement.type(), e)).toList()); + return retval; + } + } + + return null; + } + + } + +} diff --git a/src/main/java/net/mcreator/ui/workspace/WorkspacePanelVariables.java b/src/main/java/net/mcreator/ui/workspace/WorkspacePanelVariables.java index dd3d55f4e86..0694e9f6e0f 100644 --- a/src/main/java/net/mcreator/ui/workspace/WorkspacePanelVariables.java +++ b/src/main/java/net/mcreator/ui/workspace/WorkspacePanelVariables.java @@ -169,7 +169,7 @@ class WorkspacePanelVariables extends AbstractWorkspacePanel { elements.setBackground(Theme.current().getBackgroundColor()); elements.setSelectionBackground(Theme.current().getAltBackgroundColor()); elements.setForeground(Theme.current().getForegroundColor()); - elements.setSelectionForeground(Theme.current().getBackgroundColor()); + elements.setSelectionForeground(Theme.current().getForegroundColor()); elements.setBorder(BorderFactory.createEmptyBorder()); elements.setGridColor(Theme.current().getAltBackgroundColor()); elements.setRowHeight(28); diff --git a/src/main/java/net/mcreator/ui/wysiwyg/WYSIWYGEditor.java b/src/main/java/net/mcreator/ui/wysiwyg/WYSIWYGEditor.java index 3a106abac46..895611d0795 100644 --- a/src/main/java/net/mcreator/ui/wysiwyg/WYSIWYGEditor.java +++ b/src/main/java/net/mcreator/ui/wysiwyg/WYSIWYGEditor.java @@ -362,8 +362,7 @@ public WYSIWYGEditor(final MCreator mcreator, boolean isNotOverlayType) { }); adds2.add(PanelUtils.join(FlowLayout.LEFT, pon)); - adds2.add(PanelUtils.join(FlowLayout.LEFT, L10N.label("elementgui.gui.width_height"), spa1, new JLabel("x"), - spa2)); + adds2.add(PanelUtils.join(FlowLayout.LEFT, L10N.label("elementgui.gui.width_height"), spa1, spa2)); adds2.add(PanelUtils.join(FlowLayout.LEFT, L10N.label("elementgui.gui.inventory_offset"), invOffX, invOffY)); adds2.add(PanelUtils.join(FlowLayout.LEFT, renderBgLayer)); adds2.add(PanelUtils.join(FlowLayout.LEFT, doesPauseGame)); diff --git a/src/main/java/net/mcreator/util/TerribleModuleHacks.java b/src/main/java/net/mcreator/util/TerribleModuleHacks.java index d8312597275..05a060d9938 100644 --- a/src/main/java/net/mcreator/util/TerribleModuleHacks.java +++ b/src/main/java/net/mcreator/util/TerribleModuleHacks.java @@ -30,8 +30,8 @@ public class TerribleModuleHacks { private static final Logger LOG = LogManager.getLogger("Terrible module hacks"); public static void openAllFor(Module moduleToOpenFor) { - ModuleLayer.boot().modules().forEach(module -> module.getPackages() - .forEach(pn -> addOpens(module, pn, moduleToOpenFor))); + ModuleLayer.boot().modules() + .forEach(module -> module.getPackages().forEach(pn -> addOpens(module, pn, moduleToOpenFor))); } public static void openMCreatorRequirements() { diff --git a/src/main/java/net/mcreator/workspace/Workspace.java b/src/main/java/net/mcreator/workspace/Workspace.java index bae6453a9a5..a1c194ea653 100644 --- a/src/main/java/net/mcreator/workspace/Workspace.java +++ b/src/main/java/net/mcreator/workspace/Workspace.java @@ -21,10 +21,7 @@ import com.google.common.annotations.VisibleForTesting; import net.mcreator.Launcher; import net.mcreator.element.ModElementType; -import net.mcreator.generator.Generator; -import net.mcreator.generator.GeneratorConfiguration; -import net.mcreator.generator.GeneratorFlavor; -import net.mcreator.generator.IGeneratorProvider; +import net.mcreator.generator.*; import net.mcreator.generator.setup.WorkspaceGeneratorSetup; import net.mcreator.gradle.GradleCacheImportFailedException; import net.mcreator.io.FileIO; @@ -57,6 +54,7 @@ public class Workspace implements Closeable, IGeneratorProvider { private Set mod_elements = Collections.synchronizedSet(new LinkedHashSet<>(0)); private Set variable_elements = Collections.synchronizedSet(new LinkedHashSet<>(0)); private Set sound_elements = Collections.synchronizedSet(new LinkedHashSet<>(0)); + private ConcurrentHashMap> tag_elements = new ConcurrentHashMap<>(); private ConcurrentHashMap> language_map = new ConcurrentHashMap<>() {{ put("en_us", new ConcurrentHashMap<>()); }}; @@ -115,6 +113,10 @@ public Collection getSoundElements() { return Collections.unmodifiableSet(sound_elements); } + public Map> getTagElements() { + return tag_elements; + } + public Map> getLanguageMap() { return language_map; } @@ -201,6 +203,15 @@ public void addVariableElement(VariableElement element) { } } + public void addTagElement(TagElement element) { + if (!tag_elements.containsKey(element)) { + tag_elements.put(element, new ArrayList<>()); + markDirty(); + } else { + LOG.warn("Trying to add existing tag element: " + element.getName()); + } + } + public void addSoundElement(SoundElement element) { if (!sound_elements.contains(element)) { sound_elements.add(element); @@ -227,6 +238,17 @@ public void removeVariableElement(VariableElement element) { markDirty(); } + public void removeTagElement(TagElement element) { + tag_elements.remove(element); + + File tagFile = TagsUtils.getTagFileFor(this, element); + if (tagFile != null) { + tagFile.delete(); + } + + markDirty(); + } + public void removeSoundElement(SoundElement element) { element.getFiles() .forEach(file -> new File(fileManager.getFolderManager().getSoundsDir(), file + ".ogg").delete()); @@ -511,6 +533,7 @@ public boolean isRegenerateRequired() { this.mod_elements = other.mod_elements; this.variable_elements = other.variable_elements; this.sound_elements = other.sound_elements; + this.tag_elements = other.tag_elements; this.language_map = other.language_map; this.foldersRoot = other.foldersRoot; this.mcreatorVersion = other.mcreatorVersion; diff --git a/src/main/java/net/mcreator/workspace/WorkspaceFileManager.java b/src/main/java/net/mcreator/workspace/WorkspaceFileManager.java index 985c9ac2524..87a1dc590d6 100644 --- a/src/main/java/net/mcreator/workspace/WorkspaceFileManager.java +++ b/src/main/java/net/mcreator/workspace/WorkspaceFileManager.java @@ -27,6 +27,7 @@ import net.mcreator.workspace.elements.ModElement; import net.mcreator.workspace.elements.ModElementManager; import net.mcreator.workspace.elements.SoundElement; +import net.mcreator.workspace.elements.TagElement; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -49,6 +50,7 @@ public class WorkspaceFileManager implements Closeable { public static final Gson gson = new GsonBuilder().setLenient().setPrettyPrinting() .registerTypeAdapter(SoundElement.class, new SoundElement.SoundElementDeserializer()) + .registerTypeAdapter(TagElement.class, new TagElement.TagElementDeserializer()) .registerTypeAdapter(ModElement.class, new ModElement.ModElementDeserializer()).create(); private DataSavedListener dataSavedListener; diff --git a/src/main/java/net/mcreator/workspace/elements/FolderElement.java b/src/main/java/net/mcreator/workspace/elements/FolderElement.java index 09ae733cd13..a2e7ff8ae23 100644 --- a/src/main/java/net/mcreator/workspace/elements/FolderElement.java +++ b/src/main/java/net/mcreator/workspace/elements/FolderElement.java @@ -20,6 +20,7 @@ import net.mcreator.workspace.Workspace; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -178,12 +179,9 @@ private List buildPath(List storage) { return getPath().hashCode(); } - public static FolderElement dummyFromPath(String path) { - return new FolderElement("", null) { - @Override public String getPath() { - return path; - } - }; + @Nullable public static FolderElement findFolderByPath(Workspace workspace, String path) { + return workspace.getFoldersRoot().getRecursiveFolderChildren().stream() + .filter(folder -> folder.getPath().equals(path)).findFirst().orElse(null); } } diff --git a/src/main/java/net/mcreator/workspace/elements/TagElement.java b/src/main/java/net/mcreator/workspace/elements/TagElement.java new file mode 100644 index 00000000000..c9b8c084a09 --- /dev/null +++ b/src/main/java/net/mcreator/workspace/elements/TagElement.java @@ -0,0 +1,131 @@ +/* + * MCreator (https://mcreator.net/) + * Copyright (C) 2012-2020, Pylo + * Copyright (C) 2020-2023, Pylo, opensource contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.mcreator.workspace.elements; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import net.mcreator.generator.mapping.MappableElement; +import net.mcreator.minecraft.TagType; +import net.mcreator.workspace.Workspace; + +public record TagElement(TagType type, String resourcePath) implements IElement { + + @Override public String getName() { + if (resourcePath.contains(":")) { + return resourcePath.split(":")[1]; + } else { + return resourcePath; + } + } + + public String getNamespace() { + if (resourcePath.contains(":")) { + return resourcePath.split(":")[0]; + } else { + return "minecraft"; + } + } + + public int hashCode() { + return (type + ":" + resourcePath).hashCode(); + } + + public boolean equals(Object obj) { + if (obj instanceof TagElement other) + return other.type.equals(type) && other.resourcePath.equals(resourcePath); + return false; + } + + // This method is used to serialize TagElement to JSON string for map keys + @Override public String toString() { + return type.name() + ":" + resourcePath; + } + + // Helper functions for tag entries below + + private static final String MANAGED_PREFIX = "~"; + + public static String entryFromMappableElement(MappableElement element) { + return (element.isManaged() ? MANAGED_PREFIX : "") + element.getUnmappedValue(); + } + + public static MappableElement entryToMappableElement(Workspace workspace, TagType type, String entry) { + MappableElement retval = type.getMappableElementProvider().apply(workspace, getEntryName(entry)); + retval.setManaged(TagElement.isEntryManaged(entry)); + return retval; + } + + public static boolean isEntryManaged(String rawData) { + return rawData.startsWith(MANAGED_PREFIX); + } + + public static String makeEntryManaged(String rawData) { + return MANAGED_PREFIX + rawData; + } + + public static String getEntryName(String rawData) { + return rawData.replace(MANAGED_PREFIX, ""); + } + + public static TagElement fromString(String raw) { + String[] parts = raw.split(":", 2); + if (parts.length == 2) { + return new TagElement(TagType.valueOf(parts[0]), parts[1]); + } else { + throw new IllegalArgumentException("Invalid JSON format for TagElement: " + raw); + } + } + + public static class TagElementDeserializer implements JsonDeserializer { + + @Override + public TagElement deserialize(JsonElement json, java.lang.reflect.Type typeOfT, + JsonDeserializationContext context) throws JsonParseException { + return fromString(json.getAsJsonPrimitive().getAsString()); + } + + } + + /** + * Utility method for normalizing tag name. If input does not start with # or TAG: prefix, + * normalization is not performed as it is assumed input is not a tag. + *

+ * When input with TAG: (legacy use) prefix is provided, prefix is changed to #. + *

+ * In all cases, if no namespace is provided in the input, minecraft: namespace is added. + * + * @param input Tag name to normalize + * @return Normalized tag name + */ + public static String normalizeTag(String input) { + if (input.startsWith("#") || input.startsWith("TAG:")) { + input = input.replaceFirst("#", "").replaceFirst("TAG:", ""); + if (input.contains(":")) { + return "#" + input; + } else { + return "#minecraft:" + input; + } + } + return input; + } + +} diff --git a/src/main/java/net/mcreator/workspace/misc/WorkspaceInfo.java b/src/main/java/net/mcreator/workspace/misc/WorkspaceInfo.java index d052775d48d..ca6f2c02914 100644 --- a/src/main/java/net/mcreator/workspace/misc/WorkspaceInfo.java +++ b/src/main/java/net/mcreator/workspace/misc/WorkspaceInfo.java @@ -33,6 +33,7 @@ import net.mcreator.minecraft.MCItem; import net.mcreator.workspace.Workspace; import net.mcreator.workspace.elements.ModElement; +import net.mcreator.workspace.elements.TagElement; import net.mcreator.workspace.elements.VariableType; import net.mcreator.workspace.resources.Model; import org.apache.logging.log4j.LogManager; @@ -40,8 +41,6 @@ import java.nio.charset.StandardCharsets; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; @SuppressWarnings("unused") public record WorkspaceInfo(Workspace workspace) { @@ -136,9 +135,12 @@ public Map> getCreativeTabMap() { List elementsList = workspace.getModElements().stream() .sorted(Comparator.comparing(ModElement::getSortID)).map(ModElement::getGeneratableElement).toList(); - Map> tabMap = new ConcurrentHashMap<>(); + Map> tabMap = new HashMap<>(); - elementsList.parallelStream().forEach(element -> { + // Can't use parallelStream here because getCreativeTabItems + // call MCItem.Custom::new that calls getBlockIconBasedOnName which calls + // ModElement#getGeneratableElement that is not thread safe + for (GeneratableElement element : elementsList) { if (element instanceof ITabContainedElement tabElement) { TabEntry tabEntry = tabElement.getCreativeTab(); List tabItems = tabElement.getCreativeTabItems(); @@ -154,7 +156,7 @@ public Map> getCreativeTabMap() { } } } - }); + } return tabMap; } @@ -181,28 +183,23 @@ public Set filterBrokenReferences(C return retval; } + /** + * Returns a set of mappable elements that do not trigger circular dependency to tag + * + * @param tag Tag name with namespace to check. A plain name without # or TAG: prefix is required. + * @param mappingTable Mapping table to use for getting mapped values of the elements + * @param elements Collection of elements to normalize/filter + * @param Type of elements + * @return Set of elements that do not trigger circular dependency to tag + */ public Set normalizeTagElements(String tag, int mappingTable, Collection elements) { - tag = "#" + tag; - - final Function normalizeTag = input -> { - if (input.startsWith("#") || input.startsWith("TAG:")) { - input = input.replaceFirst("#", "").replaceFirst("TAG:", ""); - if (input.contains(":")) { - return "#" + input; - } else { - return "#minecraft:" + input; - } - } - return input; - }; - - tag = normalizeTag.apply(tag); + tag = TagElement.normalizeTag("#" + tag); Set filtered = filterBrokenReferences(elements); Set retval = new LinkedHashSet<>(); for (MappableElement element : filtered) { - if (!tag.equals(normalizeTag.apply(element.getMappedValue(mappingTable)))) { + if (!tag.equals(TagElement.normalizeTag(element.getMappedValue(mappingTable)))) { retval.add(element); } } diff --git a/src/main/resources/net/mcreator/ui/res/pylo.png b/src/main/resources/net/mcreator/ui/res/pylo.png index a7e4526e9e7..41b97aeb448 100644 Binary files a/src/main/resources/net/mcreator/ui/res/pylo.png and b/src/main/resources/net/mcreator/ui/res/pylo.png differ diff --git a/src/test/java/net/mcreator/integration/IntegrationTestSetup.java b/src/test/java/net/mcreator/integration/IntegrationTestSetup.java index 852bd4cd30d..0df10d76a70 100644 --- a/src/test/java/net/mcreator/integration/IntegrationTestSetup.java +++ b/src/test/java/net/mcreator/integration/IntegrationTestSetup.java @@ -37,10 +37,7 @@ import net.mcreator.ui.component.util.ThreadUtil; import net.mcreator.ui.help.HelpLoader; import net.mcreator.ui.init.*; -import net.mcreator.ui.laf.LafUtil; -import net.mcreator.ui.laf.MCreatorTheme; -import net.mcreator.ui.laf.themes.Theme; -import net.mcreator.ui.laf.themes.ThemeLoader; +import net.mcreator.ui.laf.themes.ThemeManager; import net.mcreator.util.MCreatorVersionNumber; import net.mcreator.util.TerribleModuleHacks; import net.mcreator.util.UTF8Forcer; @@ -50,8 +47,6 @@ import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.ExtensionContext; -import javax.swing.*; -import javax.swing.plaf.metal.MetalLookAndFeel; import java.util.Properties; import java.util.Set; import java.util.regex.Pattern; @@ -126,13 +121,8 @@ public void setup() throws Exception { // We begin by loading plugins, so every image can be changed PluginLoader.initInstance(); - // We load UI themes now as theme plugins are loaded at this point - ThemeLoader.initUIThemes(); - MetalLookAndFeel.setCurrentTheme(new MCreatorTheme(Theme.current())); - - UIManager.setLookAndFeel(new MetalLookAndFeel()); - LafUtil.applyDefaultHTMLStyles(); - LafUtil.fixMacOSActions(); + // We load UI theme now as theme plugins are loaded at this point + ThemeManager.init(); DataListLoader.preloadCache(); diff --git a/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java b/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java index 7900cd641db..b35287d7148 100644 --- a/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java +++ b/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java @@ -38,10 +38,7 @@ import net.mcreator.element.types.interfaces.IBlockWithBoundingBox; import net.mcreator.generator.GeneratorStats; import net.mcreator.io.FileIO; -import net.mcreator.minecraft.DataListEntry; -import net.mcreator.minecraft.DataListLoader; -import net.mcreator.minecraft.ElementUtil; -import net.mcreator.minecraft.MCItem; +import net.mcreator.minecraft.*; import net.mcreator.ui.dialogs.wysiwyg.AbstractWYSIWYGDialog; import net.mcreator.ui.minecraft.states.PropertyData; import net.mcreator.ui.minecraft.states.PropertyDataWithValue; @@ -131,6 +128,33 @@ public static void fillWorkspaceWithTestData(Workspace workspace) { } } + if (workspace.getGeneratorStats().getBaseCoverageInfo().get("tags") == GeneratorStats.CoverageStatus.FULL) { + TagElement tag = new TagElement(TagType.ITEMS, "minecraft:test"); + workspace.addTagElement(tag); + workspace.getTagElements().get(tag).add("minecraft:stone"); + workspace.getTagElements().get(tag).add("~minecraft:grass"); + + tag = new TagElement(TagType.BLOCKS, "minecraft:test"); + workspace.addTagElement(tag); + workspace.getTagElements().get(tag).add("minecraft:stone"); + workspace.getTagElements().get(tag).add("~minecraft:grass"); + + tag = new TagElement(TagType.ENTITIES, "minecraft:test"); + workspace.addTagElement(tag); + workspace.getTagElements().get(tag).add("minecraft:creeper"); + workspace.getTagElements().get(tag).add("~minecraft:zombie"); + + tag = new TagElement(TagType.BIOMES, "minecraft:test"); + workspace.addTagElement(tag); + workspace.getTagElements().get(tag).add("minecraft:plains"); + workspace.getTagElements().get(tag).add("~testmod:testbiome"); + + tag = new TagElement(TagType.DAMAGE_TYPES, "minecraft:test"); + workspace.addTagElement(tag); + workspace.getTagElements().get(tag).add("testmod:testdamage"); + workspace.getTagElements().get(tag).add("~testmod:testdamage2"); + } + if (workspace.getGeneratorStats().getBaseCoverageInfo().get("variables") == GeneratorStats.CoverageStatus.FULL) { VariableElement sampleVariable1 = new VariableElement("test"); @@ -1230,39 +1254,6 @@ Color.white, new Procedure("condition4"), block.customModelName = new String[] { "Normal", "Single texture", "Cross model", "Grass block" }[valueIndex]; return block; - } else if (ModElementType.TAG.equals(modElement.getType())) { - Tag tag = new Tag(modElement); - tag.namespace = getRandomItem(random, new String[] { "forge", "minecraft", "test1", "test2" }); - tag.type = getRandomItem(random, - new String[] { "Items", "Blocks", "Entities", "Functions", "Biomes", "Damage types" }); - tag.name = modElement.getName().toLowerCase(Locale.ENGLISH); - tag.items = new ArrayList<>(); - tag.blocks = new ArrayList<>(); - tag.functions = new ArrayList<>(); - tag.entities = new ArrayList<>(); - tag.biomes = new ArrayList<>(); - tag.damageTypes = new ArrayList<>(); - if (!emptyLists) { - tag.items.addAll( - blocksAndItems.stream().map(e -> new MItemBlock(modElement.getWorkspace(), e.getName())) - .toList()); - tag.blocks.addAll( - blocks.stream().map(e -> new MItemBlock(modElement.getWorkspace(), e.getName())).toList()); - tag.entities.addAll(ElementUtil.loadAllEntities(modElement.getWorkspace()).stream() - .map(e -> new EntityEntry(modElement.getWorkspace(), e.getName())).toList()); - tag.biomes.addAll(ElementUtil.loadAllBiomes(modElement.getWorkspace()).stream() - .map(e -> new BiomeEntry(modElement.getWorkspace(), e.getName())).toList()); - tag.biomes.add(new BiomeEntry(modElement.getWorkspace(), "#is_overworld")); - tag.biomes.add(new BiomeEntry(modElement.getWorkspace(), "#forge:tag/test")); - tag.damageTypes.addAll( - ElementUtil.loadDataListAndElements(modElement.getWorkspace(), "damagesources", false, null, - "damagetype").stream() - .map(e -> new DamageTypeEntry(modElement.getWorkspace(), e.getName())).toList()); - - tag.functions.add("ExampleFunction1"); - tag.functions.add("ExampleFunction2"); - } - return tag; } else if (ModElementType.LOOTTABLE.equals(modElement.getType())) { LootTable lootTable = new LootTable(modElement); diff --git a/src/test/java/net/mcreator/integration/WorkspaceConvertersTest.java b/src/test/java/net/mcreator/integration/WorkspaceConvertersTest.java index ee34012e13d..454fb1490ba 100644 --- a/src/test/java/net/mcreator/integration/WorkspaceConvertersTest.java +++ b/src/test/java/net/mcreator/integration/WorkspaceConvertersTest.java @@ -72,8 +72,8 @@ File workspaceFile = WorkspaceUtils.getWorkspaceFileForWorkspaceFolder(workspaceDir); - GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForFlavor( - Generator.GENERATOR_CACHE.values(), GeneratorFlavor.FORGE); + GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForBaseLanguage( + Generator.GENERATOR_CACHE.values(), GeneratorFlavor.BaseLanguage.JAVA); assertNotNull(generatorConfiguration); diff --git a/src/test/java/net/mcreator/integration/ui/DialogsTest.java b/src/test/java/net/mcreator/integration/ui/DialogsTest.java index 9cfcea8f86b..5bccbec2c88 100644 --- a/src/test/java/net/mcreator/integration/ui/DialogsTest.java +++ b/src/test/java/net/mcreator/integration/ui/DialogsTest.java @@ -65,8 +65,8 @@ // create temporary directory Path tempDirWithPrefix = Files.createTempDirectory("mcreator_test_workspace"); - GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForFlavor( - Generator.GENERATOR_CACHE.values(), GeneratorFlavor.FORGE); + GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForBaseLanguage( + Generator.GENERATOR_CACHE.values(), GeneratorFlavor.BaseLanguage.JAVA); if (generatorConfiguration == null) fail("Failed to load any Forge flavored generator for this unit test"); @@ -143,10 +143,13 @@ } } + @Test public void testAddCommonTagsDialog() throws Throwable { + UITestUtil.waitUntilWindowIsOpen(mcreator, () -> AddCommonTagsDialog.open(mcreator)); + } + @Test public void testToolsDialogs() throws Throwable { UITestUtil.waitUntilWindowIsOpen(mcreator, () -> ArmorPackMakerTool.getAction(mcreator.actionRegistry).doAction()); - UITestUtil.waitUntilWindowIsOpen(mcreator, () -> InjectTagsTool.getAction(mcreator.actionRegistry).doAction()); UITestUtil.waitUntilWindowIsOpen(mcreator, () -> MaterialPackMakerTool.getAction(mcreator.actionRegistry).doAction()); UITestUtil.waitUntilWindowIsOpen(mcreator, diff --git a/src/test/java/net/mcreator/integration/ui/ImageMakerTest.java b/src/test/java/net/mcreator/integration/ui/ImageMakerTest.java index f32400c0cd0..111a0b54284 100644 --- a/src/test/java/net/mcreator/integration/ui/ImageMakerTest.java +++ b/src/test/java/net/mcreator/integration/ui/ImageMakerTest.java @@ -54,8 +54,8 @@ // create temporary directory Path tempDirWithPrefix = Files.createTempDirectory("mcreator_test_workspace"); - GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForFlavor( - Generator.GENERATOR_CACHE.values(), GeneratorFlavor.FORGE); + GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForBaseLanguage( + Generator.GENERATOR_CACHE.values(), GeneratorFlavor.BaseLanguage.JAVA); if (generatorConfiguration == null) fail("Failed to load any Forge flavored generator for this unit test"); diff --git a/src/test/java/net/mcreator/integration/ui/ModElementUITest.java b/src/test/java/net/mcreator/integration/ui/ModElementUITest.java index 37749952907..875a63d3f4e 100644 --- a/src/test/java/net/mcreator/integration/ui/ModElementUITest.java +++ b/src/test/java/net/mcreator/integration/ui/ModElementUITest.java @@ -63,8 +63,8 @@ // create temporary directory Path tempDirWithPrefix = Files.createTempDirectory("mcreator_test_workspace"); - GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForFlavor( - Generator.GENERATOR_CACHE.values(), GeneratorFlavor.FORGE); + GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForBaseLanguage( + Generator.GENERATOR_CACHE.values(), GeneratorFlavor.BaseLanguage.JAVA); if (generatorConfiguration == null) fail("Failed to load any Forge flavored generator for this unit test"); diff --git a/src/test/java/net/mcreator/integration/workspace/ReferencesFinderTest.java b/src/test/java/net/mcreator/integration/workspace/ReferencesFinderTest.java index 747bfe8c62b..8797753755c 100644 --- a/src/test/java/net/mcreator/integration/workspace/ReferencesFinderTest.java +++ b/src/test/java/net/mcreator/integration/workspace/ReferencesFinderTest.java @@ -63,8 +63,8 @@ // create temporary directory Path tempDirWithPrefix = Files.createTempDirectory("mcreator_test_workspace"); - GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForFlavor( - Generator.GENERATOR_CACHE.values(), GeneratorFlavor.FORGE); + GeneratorConfiguration generatorConfiguration = GeneratorConfiguration.getRecommendedGeneratorForBaseLanguage( + Generator.GENERATOR_CACHE.values(), GeneratorFlavor.BaseLanguage.JAVA); if (generatorConfiguration == null) fail("Failed to load any Forge flavored generator for this unit test");