From b87f91ef207623e9a8130424f25d92b7d45c84c4 Mon Sep 17 00:00:00 2001 From: Christian Raoulis Date: Sat, 31 Aug 2024 11:30:09 +0200 Subject: [PATCH] clear info branch content --- build.gradle | 261 --------- gradle.properties | 11 - gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 5 - gradlew | 234 -------- gradlew.bat | 89 --- settings.gradle | 9 - .../github/manasmods/manascore/ManasCore.java | 27 - .../attribute/AttributeModifierHelper.java | 92 --- .../manascore/api/attribute/package-info.java | 7 - .../api/client/gui/FontRenderHelper.java | 126 ---- .../api/client/gui/package-info.java | 7 - .../gui/widget/ImagePredicateButton.java | 54 -- .../api/client/gui/widget/RenderCheck.java | 13 - .../api/client/gui/widget/package-info.java | 7 - .../client/keybinding/KeybindingCategory.java | 21 - .../client/keybinding/ManasKeybinding.java | 62 -- .../client/keybinding/ManasKeybindings.java | 21 - .../api/client/keybinding/package-info.java | 7 - .../manascore/api/data/gen/BlockLoot.java | 263 --------- .../api/data/gen/BlockStateProvider.java | 552 ------------------ .../api/data/gen/BlockTagProvider.java | 158 ----- .../api/data/gen/CustomDataProvider.java | 71 --- .../manascore/api/data/gen/EntityLoot.java | 157 ----- .../api/data/gen/ItemModelProvider.java | 215 ------- .../api/data/gen/ItemTagProvider.java | 44 -- .../api/data/gen/LanguageProvider.java | 44 -- .../api/data/gen/RecipeProvider.java | 515 ---------------- .../manascore/api/data/gen/RenderType.java | 23 - .../gen/annotation/GenerateBlockLoot.java | 60 -- .../gen/annotation/GenerateBlockModels.java | 55 -- .../gen/annotation/GenerateEntityLoot.java | 27 - .../gen/annotation/GenerateItemModels.java | 37 -- .../manascore/api/data/gen/package-info.java | 11 - .../api/datapack/CodecJsonDataManager.java | 123 ---- .../datapack/MergeableCodecDataManager.java | 157 ----- .../manascore/api/datapack/package-info.java | 11 - .../api/permission/PermissionHelper.java | 42 -- .../api/permission/package-info.java | 11 - .../api/tab/AbstractInventoryTab.java | 65 --- .../manascore/api/tab/InventoryTabs.java | 43 -- .../api/tab/annotation/ScreenForTab.java | 20 - .../api/tab/annotation/package-info.java | 7 - .../manascore/api/tab/package-info.java | 7 - .../manascore/api/util/ItemComparator.java | 65 --- .../util/MethodsReturnNonnullByDefault.java | 13 - .../manascore/api/util/ReflectionUtils.java | 52 -- .../manascore/api/util/StreamUtils.java | 17 - .../manascore/api/util/package-info.java | 5 - .../api/world/gen/biome/BiomeBuilder.java | 115 ---- .../biome/BiomeGenerationSettingsHelper.java | 68 --- .../api/world/gen/biome/MobSpawnHelper.java | 59 -- .../api/world/gen/biome/package-info.java | 11 - .../attribute/ManasCoreAttributeHandler.java | 50 -- .../attribute/ManasCoreAttributes.java | 24 - .../manascore/attribute/package-info.java | 7 - .../widget/InventoryTabSwitcherWidget.java | 146 ----- .../client/gui/widget/package-info.java | 7 - .../client/keybinding/KeybindingRegistry.java | 37 -- .../keybinding/ManasKeybindingHandler.java | 17 - .../client/keybinding/package-info.java | 7 - .../core/AbstractContainerScreenAccessor.java | 13 - .../core/BlockLootSubProviderAccessor.java | 19 - .../core/ShapedRecipeBuilderAccessor.java | 14 - .../core/VanillaBlockLootAccessor.java | 13 - .../manasmods/manascore/package-info.java | 7 - .../manascore/tab/IInventoryTab.java | 26 - .../manascore/tab/InventoryTabHandler.java | 43 -- .../manascore/tab/InventoryTabRegistry.java | 47 -- .../manascore/tab/ManasCoreInventoryTabs.java | 21 - .../manasmods/manascore/tab/TabPosition.java | 35 -- .../manascore/tab/VanillaInventoryTab.java | 47 -- .../manasmods/manascore/tab/package-info.java | 7 - src/main/resources/META-INF/mods.toml | 32 - .../models/block/grass_like_inner_stairs.json | 37 -- .../models/block/grass_like_outer_stairs.json | 49 -- .../models/block/grass_like_slab.json | 18 - .../models/block/grass_like_slab_top.json | 18 - .../models/block/grass_like_stairs.json | 55 -- .../models/block/overlay_inner_stairs.json | 63 -- .../models/block/overlay_outer_stairs.json | 46 -- .../manascore/models/block/overlay_slab.json | 27 - .../models/block/overlay_slab_top.json | 27 - .../models/block/overlay_stairs.json | 72 --- .../manascore/textures/gui/tabs/bot-left.png | Bin 1964 -> 0 bytes .../manascore/textures/gui/tabs/bot-right.png | Bin 1965 -> 0 bytes .../manascore/textures/gui/tabs/bot.png | Bin 1963 -> 0 bytes .../manascore/textures/gui/tabs/top-left.png | Bin 1725 -> 0 bytes .../manascore/textures/gui/tabs/top-right.png | Bin 2072 -> 0 bytes .../manascore/textures/gui/tabs/top.png | Bin 1721 -> 0 bytes src/main/resources/logo.jpg | Bin 85578 -> 0 bytes src/main/resources/manascore.mixins.json | 18 - src/main/resources/pack.mcmeta | 6 - 93 files changed, 5231 deletions(-) delete mode 100644 build.gradle delete mode 100644 gradle.properties delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 gradlew delete mode 100644 gradlew.bat delete mode 100644 settings.gradle delete mode 100644 src/main/java/com/github/manasmods/manascore/ManasCore.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/attribute/AttributeModifierHelper.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/attribute/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/gui/FontRenderHelper.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/gui/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/gui/widget/ImagePredicateButton.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/gui/widget/RenderCheck.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/gui/widget/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/keybinding/KeybindingCategory.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybinding.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybindings.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/client/keybinding/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/BlockLoot.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/BlockStateProvider.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/BlockTagProvider.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/CustomDataProvider.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/EntityLoot.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/ItemModelProvider.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/ItemTagProvider.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/LanguageProvider.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/RecipeProvider.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/RenderType.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockLoot.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockModels.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateEntityLoot.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateItemModels.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/data/gen/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/datapack/CodecJsonDataManager.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/datapack/MergeableCodecDataManager.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/datapack/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/permission/PermissionHelper.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/permission/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/tab/AbstractInventoryTab.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/tab/InventoryTabs.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/tab/annotation/ScreenForTab.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/tab/annotation/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/tab/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/util/ItemComparator.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/util/MethodsReturnNonnullByDefault.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/util/ReflectionUtils.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/util/StreamUtils.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/util/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeBuilder.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeGenerationSettingsHelper.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/world/gen/biome/MobSpawnHelper.java delete mode 100644 src/main/java/com/github/manasmods/manascore/api/world/gen/biome/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java delete mode 100644 src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributes.java delete mode 100644 src/main/java/com/github/manasmods/manascore/attribute/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/client/gui/widget/InventoryTabSwitcherWidget.java delete mode 100644 src/main/java/com/github/manasmods/manascore/client/gui/widget/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java delete mode 100644 src/main/java/com/github/manasmods/manascore/client/keybinding/ManasKeybindingHandler.java delete mode 100644 src/main/java/com/github/manasmods/manascore/client/keybinding/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/core/AbstractContainerScreenAccessor.java delete mode 100644 src/main/java/com/github/manasmods/manascore/core/BlockLootSubProviderAccessor.java delete mode 100644 src/main/java/com/github/manasmods/manascore/core/ShapedRecipeBuilderAccessor.java delete mode 100644 src/main/java/com/github/manasmods/manascore/core/VanillaBlockLootAccessor.java delete mode 100644 src/main/java/com/github/manasmods/manascore/package-info.java delete mode 100644 src/main/java/com/github/manasmods/manascore/tab/IInventoryTab.java delete mode 100644 src/main/java/com/github/manasmods/manascore/tab/InventoryTabHandler.java delete mode 100644 src/main/java/com/github/manasmods/manascore/tab/InventoryTabRegistry.java delete mode 100644 src/main/java/com/github/manasmods/manascore/tab/ManasCoreInventoryTabs.java delete mode 100644 src/main/java/com/github/manasmods/manascore/tab/TabPosition.java delete mode 100644 src/main/java/com/github/manasmods/manascore/tab/VanillaInventoryTab.java delete mode 100644 src/main/java/com/github/manasmods/manascore/tab/package-info.java delete mode 100644 src/main/resources/META-INF/mods.toml delete mode 100644 src/main/resources/assets/manascore/models/block/grass_like_inner_stairs.json delete mode 100644 src/main/resources/assets/manascore/models/block/grass_like_outer_stairs.json delete mode 100644 src/main/resources/assets/manascore/models/block/grass_like_slab.json delete mode 100644 src/main/resources/assets/manascore/models/block/grass_like_slab_top.json delete mode 100644 src/main/resources/assets/manascore/models/block/grass_like_stairs.json delete mode 100644 src/main/resources/assets/manascore/models/block/overlay_inner_stairs.json delete mode 100644 src/main/resources/assets/manascore/models/block/overlay_outer_stairs.json delete mode 100644 src/main/resources/assets/manascore/models/block/overlay_slab.json delete mode 100644 src/main/resources/assets/manascore/models/block/overlay_slab_top.json delete mode 100644 src/main/resources/assets/manascore/models/block/overlay_stairs.json delete mode 100644 src/main/resources/assets/manascore/textures/gui/tabs/bot-left.png delete mode 100644 src/main/resources/assets/manascore/textures/gui/tabs/bot-right.png delete mode 100644 src/main/resources/assets/manascore/textures/gui/tabs/bot.png delete mode 100644 src/main/resources/assets/manascore/textures/gui/tabs/top-left.png delete mode 100644 src/main/resources/assets/manascore/textures/gui/tabs/top-right.png delete mode 100644 src/main/resources/assets/manascore/textures/gui/tabs/top.png delete mode 100644 src/main/resources/logo.jpg delete mode 100644 src/main/resources/manascore.mixins.json delete mode 100644 src/main/resources/pack.mcmeta diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 9de587ab..00000000 --- a/build.gradle +++ /dev/null @@ -1,261 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } - mavenCentral() - } - dependencies { - classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - } -} - -plugins { - id 'net.minecraftforge.gradle' version '5.1.+' - id 'org.parchmentmc.librarian.forgegradle' version '1.+' - id 'net.darkhax.curseforgegradle' version '1.0.11' - id "com.modrinth.minotaur" version "2.+" - id 'maven-publish' - id "io.freefair.lombok" version "6.6-rc1" -} - -apply plugin: 'org.spongepowered.mixin' - -group = 'com.github.manasmods' -version = "${minecraftVersion}-${modVersion}" -archivesBaseName = modId - -java.toolchain.languageVersion = JavaLanguageVersion.of(17) - -minecraft { - mappings channel: 'parchment', version: "${parchmentVersion}-${minecraftVersion}" - - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/removed as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - property 'forge.enabledGameTestNamespaces', "${modId}" - - mods { - manascore { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/removed as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - property 'forge.enabledGameTestNamespaces', "${modId}" - - mods { - manascore { - source sourceSets.main - } - } - } - - gameTestServer { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', "${modId}" - - mods { - manascore { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/removed as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', "${modId}", '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - - mods { - manascore { - source sourceSets.main - } - } - } - } -} - -mixin { - add sourceSets.main, "${modId}.refmap.json" - - config "${modId}.mixins.json" -} - -// Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: - // flatDir { - // dir 'libs' - // } - maven { - name = "manasmods" - credentials { - username project.findProperty('manasmodsUsername') ?: System.getenv().getOrDefault('MANAS_REPO_USER', '') - password project.findProperty('manasmodsPassword') ?: System.getenv().getOrDefault('MANAS_REPO_USER_PASSWORD', '') - } - url "https://manasmods.bytesafe.dev/maven/manasmods" - } -} - -dependencies { - minecraft "net.minecraftforge:forge:${minecraftVersion}-${forgeVersion}" - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' -} - -// Example for how to get properties into the manifest for reading at runtime. -jar { - manifest { - attributes([ - "Specification-Title" : "manascore", - "Specification-Vendor" : "ManasMods", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "ManasMods", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -jar.finalizedBy('reobfJar') - -def replaceResources = tasks.register("replaceResources", Copy) { - it.outputs.upToDateWhen { false } - //Copy it into the build dir - it.from(sourceSets.main.resources) { - def forgeLoaderVersion = forgeVersion.substring(0, forgeVersion.indexOf('.')) - def nextMinecraftVersion = getNextMajorMinecraftVersion(minecraftVersion) - def minecraftVersionCheck = "[${minecraftVersion},${nextMinecraftVersion})" - - include "META-INF/mods.toml" - expand 'modVersion': "${modVersion}", - 'forgeLoaderVersion': "[${forgeLoaderVersion},)", - 'minecraftVersionCheck': "${minecraftVersionCheck}", - 'modId': "${modId}" - } - it.into "$buildDir/resources/main/" -} - -static String getNextMajorMinecraftVersion(String currentVersion) { - def version = currentVersion.substring(0, currentVersion.indexOf('.')) - def majorVersion = currentVersion.substring(currentVersion.indexOf('.') + 1, currentVersion.indexOf('.', currentVersion.indexOf('.') + 1)) - def majorInt = Integer.valueOf(majorVersion) - majorInt++ - majorVersion = majorInt.toString() - return "${version}.${majorVersion}" -} - -processResources { - duplicatesStrategy(DuplicatesStrategy.FAIL) - exclude('META-INF/mods.toml') - configure { finalizedBy(replaceResources) } -} - -classes.configure { - dependsOn(replaceResources) -} - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - -task publishCurseForge(type: net.darkhax.curseforgegradle.TaskPublishCurseForge) { - dependsOn build - - apiToken = project.findProperty('curseforge_apikey') ?: System.getenv('CF_TOKEN') - def mainFile = upload(619025, jar) - mainFile.releaseType = 'release' - mainFile.displayName = "${minecraftVersion}-${modVersion}" - mainFile.changelog = file('CHANGELOG.md') - mainFile.changelogType = 'markdown' - mainFile.addModLoader('Forge') - mainFile.addGameVersion(minecraftVersion) -} - -modrinth { - token = project.findProperty('modrinth_apikey') ?: System.getenv('MODRINTH_TOKEN') - projectId = "wRRSWpd1" - versionType = "release" - versionName = "${minecraftVersion}-${modVersion}" - uploadFile = tasks.jar - gameVersions = [project.minecraftVersion] - loaders = ["forge"] - changelog = file('CHANGELOG.md').text -} - -publishing { - publications { - mavenJava(MavenPublication) { - artifact jar - } - } - repositories { - maven { - name = "ManasCore" - url "https://api-g.cloudsmith.io/maven/manasmods/manascore/" - credentials { - username = project.findProperty("cloudsmith_user") ?: System.getenv("CLOUDSMITH_USER") - password = project.findProperty("cloudsmith_password") ?: System.getenv("CLOUDSMITH_PASSWORD") - } - } - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index b552f4b9..00000000 --- a/gradle.properties +++ /dev/null @@ -1,11 +0,0 @@ -org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false -# Minecraft data -minecraftVersion=1.19.3 -# Forge date -forgeVersion=44.1.0 -# Parchment Version -parchmentVersion=2022.12.18 -# Mod Information see https://mcforge.readthedocs.io/en/1.18.x/gettingstarted/versioning/#examples -modVersion=2.1.0.0 -modId=manascore \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e750102e..00000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100644 index c53aefaa..00000000 --- a/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 107acd32..00000000 --- a/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 18ef4aa6..00000000 --- a/settings.gradle +++ /dev/null @@ -1,9 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - maven { url "https://maven.minecraftforge.net/" } - maven { url = 'https://maven.parchmentmc.org' } - } -} - -rootProject.name = 'ManasCore' \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/ManasCore.java b/src/main/java/com/github/manasmods/manascore/ManasCore.java deleted file mode 100644 index 507f0c3a..00000000 --- a/src/main/java/com/github/manasmods/manascore/ManasCore.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore; - -import com.github.manasmods.manascore.attribute.ManasCoreAttributes; -import lombok.Getter; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.ApiStatus.Internal; - -@Internal -@Mod(ManasCore.MOD_ID) -public final class ManasCore { - public static final String MOD_ID = "manascore"; - @Getter - private static final Logger logger = LogManager.getLogger(); - - public ManasCore() { - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - ManasCoreAttributes.register(modEventBus); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/attribute/AttributeModifierHelper.java b/src/main/java/com/github/manasmods/manascore/api/attribute/AttributeModifierHelper.java deleted file mode 100644 index 3a561774..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/attribute/AttributeModifierHelper.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.attribute; - -import lombok.experimental.UtilityClass; -import lombok.extern.log4j.Log4j2; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeInstance; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.util.Optional; -import java.util.UUID; - -@AvailableSince("1.0.0.0") -@UtilityClass -@Log4j2 -public final class AttributeModifierHelper { - /** - * Safe way to apply {@link AttributeModifier} to an {@link LivingEntity} - * - * @param entity Target Entity - * @param attribute Target Attribute - * @param modifier Attribute modifier - */ - public static void setModifier(final LivingEntity entity, final Attribute attribute, final AttributeModifier modifier) { - AttributeInstance instance = entity.getAttribute(attribute); - - if (instance == null) { - log.error("Tried to modify an unknown Attribute: {}", ForgeRegistries.ATTRIBUTES.getKey(attribute)); - return; - } - - double oldMaxHealth = attribute == Attributes.MAX_HEALTH ? entity.getMaxHealth() : 0; // Store old max health or 0 - Optional.ofNullable(instance.getModifier(modifier.getId())) //Get old modifier if present - .ifPresent(modifier1 -> instance.removeModifier(modifier1.getId())); //Remove old modifier - - instance.addPermanentModifier(modifier); //Add modifier - - if (attribute == Attributes.MAX_HEALTH) { - double newMaxHealth = entity.getMaxHealth(); - if (newMaxHealth > oldMaxHealth) { - double healAmount = (newMaxHealth - oldMaxHealth); - entity.heal((float) healAmount); //Heal entity by the amount of gained health - } else { - if (entity.getHealth() > newMaxHealth) { - entity.setHealth((float) newMaxHealth); //Reduce the entity health to the new max value - } - } - } - } - - /** - * @param entity Target Entity - * @param attribute Target Attribute - * @param attributeModifierId A unique id to identify this {@link AttributeModifier} - * @param attributeModifierName A unique name which is used to store the {@link AttributeModifier} - * @param amount Will be used to calculate the final value of the {@link Attribute} - * @param attributeOperation Mathematical operation type which is used to calculate the final value of the {@link Attribute} - */ - public static void addModifier(final LivingEntity entity, final Attribute attribute, final UUID attributeModifierId, final String attributeModifierName, final double amount, - final AttributeModifier.Operation attributeOperation) { - setModifier(entity, attribute, new AttributeModifier(attributeModifierId, attributeModifierName, amount, attributeOperation)); - } - - /** - * Safe way to remove {@link AttributeModifier} from Entities - * - * @param entity Target Entity - * @param attribute Target Attribute - * @param attributeModifierId Unique modifier id - */ - public static void removeModifier(final LivingEntity entity, final Attribute attribute, final UUID attributeModifierId) { - Optional.ofNullable(entity.getAttribute(attribute)).ifPresent(attributeInstance -> attributeInstance.removeModifier(attributeModifierId)); - } - - /** - * Safe way to remove {@link AttributeModifier} from Entities - * - * @param entity Target Entity - * @param attribute Target Attribute - * @param modifier Modifier - */ - public static void removeModifier(final LivingEntity entity, final Attribute attribute, final AttributeModifier modifier) { - removeModifier(entity, attribute, modifier.getId()); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/attribute/package-info.java b/src/main/java/com/github/manasmods/manascore/api/attribute/package-info.java deleted file mode 100644 index 717063fb..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/attribute/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.attribute; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/client/gui/FontRenderHelper.java b/src/main/java/com/github/manasmods/manascore/api/client/gui/FontRenderHelper.java deleted file mode 100644 index ffe42f0a..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/gui/FontRenderHelper.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.client.gui; - -import com.mojang.blaze3d.vertex.PoseStack; -import lombok.experimental.UtilityClass; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.util.FormattedCharSequence; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.awt.Color; -import java.util.List; - -@OnlyIn(Dist.CLIENT) -@AvailableSince("1.0.1.0") -@UtilityClass -public final class FontRenderHelper { - - public static void renderScaledTextInArea(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final float height, final Color color) { - renderScaledTextInArea(poseStack, font, text, x, y, width, height, color, 0F); - } - - public static void renderScaledTextInArea(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final float height, final int color) { - renderScaledTextInArea(poseStack, font, text, x, y, width, height, color, 0F); - } - - public static void renderScaledTextInArea(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final float height, final Color color, - final float spacePerLine) { - renderScaledTextInArea(poseStack, font, text, x, y, width, height, color, spacePerLine, 0.01F); - } - - public static void renderScaledTextInArea(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final float height, final int color, - final float spacePerLine) { - renderScaledTextInArea(poseStack, font, text, x, y, width, height, color, spacePerLine, 0.01F); - } - - public static void renderScaledTextInArea(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final float height, final Color color, - final float spacePerLine, final float scalingSteps) { - renderScaledTextInArea(poseStack, font, text, x, y, width, height, color.getRGB(), spacePerLine, scalingSteps); - } - - public static void renderScaledTextInArea(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final float height, final int color, - final float spacePerLine, final float scalingSteps) { - float scaling = 1F; - - while (true) { - List formattedCharSequences = font.split(text, Math.round(width / scaling)); - if (formattedCharSequences.size() * (font.lineHeight + spacePerLine) * scaling > height) { - scaling -= scalingSteps; - } else { - break; - } - } - - renderScaledText(poseStack, - font, - scaling, - font.split(text, Math.round(width / scaling)), - x, - y, - color, - spacePerLine - ); - } - - public static void renderScaledWrappedText(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final Color color) { - renderScaledWrappedText(poseStack, font, text, x, y, width, color, 0); - } - - public static void renderScaledWrappedText(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final int color) { - renderScaledWrappedText(poseStack, font, text, x, y, width, color, 0); - } - - public static void renderScaledWrappedText(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final Color color, - final float spacePerLine) { - renderScaledWrappedText(poseStack, font, text, x, y, width, color.getRGB(), spacePerLine); - } - - public static void renderScaledWrappedText(final PoseStack poseStack, final Font font, final FormattedText text, final float x, float y, final float width, final int color, - final float spacePerLine) { - float scaling = 1F; - - while (true) { - List sequences = font.split(text, Minecraft.getInstance().getWindow().getScreenWidth()); - float currentScaling = scaling; - int maxWidth = sequences.stream() - .map(seq -> font.width(seq) * currentScaling) - .mapMultiToInt((aFloat, intConsumer) -> intConsumer.accept(Math.round(aFloat))) - .max() - .orElse(0); - if (maxWidth > width) { - scaling -= 0.01F; - } else { - break; - } - } - - renderScaledText(poseStack, - font, - scaling, - font.split(text, Math.round(width / scaling)), - x, - y, - color, - spacePerLine - ); - } - - private static void renderScaledText(final PoseStack poseStack, final Font font, final float scaling, final List text, final float x, float y, final int color, - final float spacePerLine) { - poseStack.scale(scaling, scaling, scaling); - - for (FormattedCharSequence charSequence : text) { - font.draw(poseStack, charSequence, x / scaling, y / scaling, color); - y += (font.lineHeight + spacePerLine) * scaling; - } - - poseStack.scale(1 / scaling, 1 / scaling, 1 / scaling); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/client/gui/package-info.java b/src/main/java/com/github/manasmods/manascore/api/client/gui/package-info.java deleted file mode 100644 index 22e38564..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/gui/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.client.gui; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/ImagePredicateButton.java b/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/ImagePredicateButton.java deleted file mode 100644 index e822712d..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/ImagePredicateButton.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.client.gui.widget; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Tooltip; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -/** - * Simple button which gets rendered while the render check is true - */ -@AvailableSince("1.0.0.0") -public class ImagePredicateButton extends Button { - private final ResourceLocation texture; - private final RenderCheck renderCheck; - - public ImagePredicateButton(int pX, int pY, int pWidth, int pHeight, ResourceLocation texture, OnPress pOnPress, Tooltip tooltip, RenderCheck renderCheck) { - super(new Builder(Component.empty(), pOnPress) - .pos(pX, pY) - .size(pWidth, pHeight) - .tooltip(tooltip) - ); - this.texture = texture; - this.renderCheck = renderCheck; - } - - public void hideToolTip() { - setTooltip(null); - } - - @Override - public void renderButton(PoseStack pPoseStack, int pMouseX, int pMouseY, float pPartialTick) { - active = renderCheck.check(); - - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, texture); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - if (active) { - blit(pPoseStack, this.getX(), this.getY(), 0, isHoveredOrFocused() ? height : 0, width, height, width, height * 2); - } else { - blit(pPoseStack, this.getX(), this.getY(), 0, height, width, height, width, height * 2); - } - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/RenderCheck.java b/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/RenderCheck.java deleted file mode 100644 index c4ee89ce..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/RenderCheck.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.client.gui.widget; - -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -@AvailableSince("1.0.0.0") -@FunctionalInterface -public interface RenderCheck { - boolean check(); -} diff --git a/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/package-info.java b/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/package-info.java deleted file mode 100644 index 83b523e7..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/gui/widget/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.client.gui.widget; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/KeybindingCategory.java b/src/main/java/com/github/manasmods/manascore/api/client/keybinding/KeybindingCategory.java deleted file mode 100644 index 7f7b5e22..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/KeybindingCategory.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.client.keybinding; - -import com.github.manasmods.manascore.ManasCore; -import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; - -@AvailableSince("1.0.0.0") -@NonExtendable -@RequiredArgsConstructor(staticName = "of") -public final class KeybindingCategory { - private final String id; - - public String getCategoryString() { - return String.format("%s.category.%s", ManasCore.MOD_ID, this.id); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybinding.java b/src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybinding.java deleted file mode 100644 index 83add22a..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybinding.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.client.keybinding; - -import com.mojang.blaze3d.platform.InputConstants; -import lombok.Getter; -import net.minecraft.client.KeyMapping; -import net.minecraftforge.client.settings.KeyConflictContext; -import net.minecraftforge.fml.common.Mod; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -@AvailableSince("1.0.0.0") -public class ManasKeybinding extends KeyMapping { - @Getter - private final KeyBindingAction action; - - /** - * Creates a Keybinding which handles the given action automatically. - * No need to create an {@link Mod.EventBusSubscriber}. - * - * @param langKey Translation String - * @param defaultKey Default Key - * @param category Category - * @param action Action when pressed - */ - public ManasKeybinding(String langKey, int defaultKey, KeybindingCategory category, KeyBindingAction action) { - this(langKey, InputConstants.Type.KEYSYM.getOrCreate(defaultKey), category, action); - } - - /** - * Creates a Keybinding which handles the given action automatically. - * No need to create an {@link Mod.EventBusSubscriber}. - * - * @param langKey Translation String - * @param defaultKey Default Key - * @param category Category - * @param action Action when pressed - */ - public ManasKeybinding(String langKey, InputConstants.Key defaultKey, KeybindingCategory category, KeyBindingAction action) { - super(langKey, KeyConflictContext.UNIVERSAL, defaultKey, category.getCategoryString()); - this.action = action; - } - - /** - * Creates a Keybinding without a default key. - * - * @param langKey Translation String - * @param category Category - * @param action Action when pressed. - */ - public ManasKeybinding(String langKey, KeybindingCategory category, KeyBindingAction action) { - this(langKey, InputConstants.UNKNOWN.getValue(), category, action); - } - - - @FunctionalInterface - public interface KeyBindingAction { - void onPress(); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybindings.java b/src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybindings.java deleted file mode 100644 index 9cd07e3d..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/ManasKeybindings.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.client.keybinding; - -import com.github.manasmods.manascore.client.keybinding.KeybindingRegistry; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; - -@AvailableSince("1.0.0.0") -@NonExtendable -public final class ManasKeybindings { - /** - * Registers {@link ManasKeybinding} to ManasCore and Minecraft. - * This has to be used in the mod constructor - */ - public static void register(ManasKeybinding... keybinding) { - KeybindingRegistry.register(keybinding); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/package-info.java b/src/main/java/com/github/manasmods/manascore/api/client/keybinding/package-info.java deleted file mode 100644 index 9ec39b83..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/client/keybinding/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.client.keybinding; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockLoot.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockLoot.java deleted file mode 100644 index f5d363e7..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockLoot.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot.DoorDrop; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot.LeavesDrop; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot.OreDrop; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot.OtherDrop; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot.SelfDrop; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot.SlabDrop; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockLoot.WithLootTables; -import com.github.manasmods.manascore.api.util.ReflectionUtils; -import lombok.extern.log4j.Log4j2; -import net.minecraft.data.loot.packs.VanillaBlockLoot; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; -import org.objectweb.asm.Type; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.stream.Stream; - -import static com.github.manasmods.manascore.api.util.StreamUtils.distinctBy; - -@AvailableSince("2.0.3.0") -@Log4j2 -public abstract class BlockLoot extends VanillaBlockLoot { - private static final Type GEN_ANNOTATION = Type.getType(GenerateBlockLoot.class); - - @NonExtendable - @Override - protected final void generate() { - loadTables(); - final List annotations = new ArrayList<>(); - ModList.get().forEachModFile(modFile -> { - modFile.getScanResult().getAnnotations() - .stream() - .filter(annotationData -> GEN_ANNOTATION.equals(annotationData.annotationType())) - .forEach(annotations::add); - }); - generateAnnotationLootTables(annotations); - } - - @NonExtendable - private void generateAnnotationLootTables(List annotations) { - annotations.forEach(annotationData -> { - Class clazz = null; - try { - clazz = Class.forName(annotationData.clazz().getClassName()); - } catch (ClassNotFoundException e) { - log.error("Could not load class " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (clazz == null) return; - - List blockRegistryObjectFieldList = Arrays.stream(clazz.getDeclaredFields()) - .filter(field -> Modifier.isStatic(field.getModifiers())) - .filter(field -> field.getType().equals(RegistryObject.class)) - .filter(field -> { - ParameterizedType registryObjectType = null; - try { - registryObjectType = ((ParameterizedType) field.getGenericType()); - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (registryObjectType == null) return false; - - Class registryObjectClass = null; - try { - registryObjectClass = (Class) registryObjectType.getActualTypeArguments()[0]; - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName() + "."); - log.throwing(e); - } - if (registryObjectClass == null) return false; - - return Block.class.isAssignableFrom(registryObjectClass); - }) - .toList(); - - generateDropSelfLootTables(annotationData, blockRegistryObjectFieldList); - generateDropOtherLootTables(annotationData, blockRegistryObjectFieldList); - generateDropOreLootTables(annotationData, blockRegistryObjectFieldList); - generateDropLeavesLootTables(annotationData, blockRegistryObjectFieldList); - generateDropDoorLootTables(annotationData, blockRegistryObjectFieldList); - generateDropSlabLootTables(annotationData, blockRegistryObjectFieldList); - }); - } - - @NonExtendable - private void generateDropSelfLootTables(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(SelfDrop.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - if (registryObject == null) continue; - log.debug("Generating block loot for registry object {}", registryObject.getId()); - dropSelf(registryObject.get()); - } - } - - @NonExtendable - private void generateDropOtherLootTables(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(OtherDrop.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - if (registryObject == null) continue; - - OtherDrop annotation = registryObjectField.getAnnotation(OtherDrop.class); - if (annotation.value().isBlank()) continue; - - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Item lootItem = ForgeRegistries.ITEMS.getValue(itemId); - if (lootItem == null) { - log.error("Could not find loot item {} for block {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating block loot for registry object {}", registryObject.getId()); - dropOther(registryObject.get(), lootItem); - } - } - - @NonExtendable - private void generateDropOreLootTables(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(OreDrop.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - if (registryObject == null) continue; - - OreDrop annotation = registryObjectField.getAnnotation(OreDrop.class); - if (annotation.value().isBlank()) continue; - - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Item lootItem = ForgeRegistries.ITEMS.getValue(itemId); - if (lootItem == null) { - log.error("Could not find loot item {} for block {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating block loot for registry object {}", registryObject.getId()); - add(registryObject.get(), block -> createOreDrop(registryObject.get(), lootItem)); - } - } - - @NonExtendable - private void generateDropLeavesLootTables(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(LeavesDrop.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - if (registryObject == null) continue; - - LeavesDrop annotation = registryObjectField.getAnnotation(LeavesDrop.class); - if (annotation.value().isBlank()) continue; - - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Block saplingBlock = ForgeRegistries.BLOCKS.getValue(itemId); - if (saplingBlock == null) { - log.error("Could not find sapling block {} for block {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating block loot for registry object {}", registryObject.getId()); - add(registryObject.get(), block -> createLeavesDrops(registryObject.get(), saplingBlock, annotation.chances())); - } - } - - @NonExtendable - private void generateDropDoorLootTables(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(DoorDrop.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - if (registryObject == null) continue; - - log.debug("Generating block loot for registry object {}", registryObject.getId()); - add(registryObject.get(), this::createDoorTable); - } - } - - @NonExtendable - private void generateDropSlabLootTables(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(SlabDrop.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - if (registryObject == null) continue; - - log.debug("Generating block loot for registry object {}", registryObject.getId()); - add(registryObject.get(), this::createSlabItemTable); - } - } - - protected abstract void loadTables(); - - /** - * Gets all {@link DeferredRegister} objects in {@link GenerateBlockLoot} annotated classes with {@link WithLootTables} annotation. - */ - @Override - protected Iterable getKnownBlocks() { - return ModList.get().getAllScanData() - .stream() - .flatMap(modFileScanData -> modFileScanData.getAnnotations().stream()) - .filter(annotationData -> GEN_ANNOTATION.equals(annotationData.annotationType())) - .flatMap(annotationData -> { - Class clazz = null; - try { - clazz = Class.forName(annotationData.clazz().getClassName()); - } catch (ClassNotFoundException e) { - log.error("Could not load class " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (clazz == null) return Stream.of(); - - return Arrays.stream(clazz.getDeclaredFields()) - .filter(field -> Modifier.isStatic(field.getModifiers())) - .filter(field -> field.getType().equals(DeferredRegister.class)) - .filter(field -> { - ParameterizedType registryObjectType = null; - try { - registryObjectType = ((ParameterizedType) field.getGenericType()); - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (registryObjectType == null) return false; - - Class registryObjectClass = null; - try { - registryObjectClass = (Class) registryObjectType.getActualTypeArguments()[0]; - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName() + "."); - log.throwing(e); - } - if (registryObjectClass == null) return false; - - return Block.class.isAssignableFrom(registryObjectClass); - }) - .filter(field -> field.isAnnotationPresent(WithLootTables.class)) - .map(field -> ReflectionUtils.getDeferredRegisterFromField(annotationData, field, Block.class)) - .filter(Objects::nonNull) - .flatMap(blockDeferredRegister -> blockDeferredRegister.getEntries().stream()) - .filter(RegistryObject::isPresent) - .filter(distinctBy(blockRegistryObject -> blockRegistryObject)) - .map(RegistryObject::get); - }) - .toList(); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockStateProvider.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockStateProvider.java deleted file mode 100644 index 11555464..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockStateProvider.java +++ /dev/null @@ -1,552 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockModels; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockModels.CubeAllModel; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockModels.PillarModel; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockModels.SlabModel; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateBlockModels.StairModel; -import com.github.manasmods.manascore.api.util.ReflectionUtils; -import lombok.extern.log4j.Log4j2; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.level.block.SlabBlock; -import net.minecraft.world.level.block.StairBlock; -import net.minecraft.world.level.block.state.properties.Half; -import net.minecraft.world.level.block.state.properties.SlabType; -import net.minecraft.world.level.block.state.properties.StairsShape; -import net.minecraftforge.client.model.generators.BlockModelBuilder; -import net.minecraftforge.client.model.generators.ConfiguredModel; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.client.model.generators.ModelFile.UncheckedModelFile; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; -import org.jetbrains.annotations.ApiStatus.OverrideOnly; -import org.objectweb.asm.Type; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.function.Supplier; - -@AvailableSince("1.0.0.0") -@SuppressWarnings("unused") -@Log4j2 -public abstract class BlockStateProvider extends net.minecraftforge.client.model.generators.BlockStateProvider { - private static final Type GEN_ANNOTATION = Type.getType(GenerateBlockModels.class); - - public BlockStateProvider(final GatherDataEvent gatherDataEvent, String modId) { - super(gatherDataEvent.getGenerator().getPackOutput(), modId, gatherDataEvent.getExistingFileHelper()); - } - - @OverrideOnly - protected abstract void generate(); - - @NonExtendable - @Override - protected final void registerStatesAndModels() { - generate(); - final List annotations = new ArrayList<>(); - ModList.get().forEachModFile(modFile -> { - modFile.getScanResult().getAnnotations() - .stream() - .filter(annotationData -> GEN_ANNOTATION.equals(annotationData.annotationType())) - .forEach(annotations::add); - }); - generateAnnotationModels(annotations); - } - - @NonExtendable - private void generateAnnotationModels(List annotations) { - annotations.forEach(annotationData -> { - Class clazz = null; - try { - clazz = Class.forName(annotationData.clazz().getClassName()); - } catch (ClassNotFoundException e) { - log.error("Could not load class " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (clazz == null) return; - - List blockRegistryObjectFieldList = Arrays.stream(clazz.getDeclaredFields()) - .filter(field -> Modifier.isStatic(field.getModifiers())) - .filter(field -> field.getType().equals(RegistryObject.class)) - .filter(field -> { - ParameterizedType registryObjectType = null; - try { - registryObjectType = ((ParameterizedType) field.getGenericType()); - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (registryObjectType == null) return false; - - Class registryObjectClass = null; - try { - registryObjectClass = (Class) registryObjectType.getActualTypeArguments()[0]; - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName() + "."); - log.throwing(e); - } - if (registryObjectClass == null) return false; - - return Block.class.isAssignableFrom(registryObjectClass); - }) - .toList(); - - generateCubeAllModels(annotationData, blockRegistryObjectFieldList); - generatePillarModels(annotationData, blockRegistryObjectFieldList); - generateStairModels(annotationData, blockRegistryObjectFieldList); - generateSlabModels(annotationData, blockRegistryObjectFieldList); - }); - } - - @NonExtendable - private void generateCubeAllModels(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(CubeAllModel.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - - if (registryObject == null) continue; - CubeAllModel annotation = registryObjectField.getAnnotation(CubeAllModel.class); - // Generate default model - if (annotation.value().isEmpty() || annotation.value().isBlank()) { - log.debug("Generating block model for registry object {}", registryObject.getId()); - defaultBlock(registryObject.get(), annotation.renderType()); - continue; - } - - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Block textureBlock = ForgeRegistries.BLOCKS.getValue(itemId); - if (textureBlock == null) { - log.error("Could not find texture block {} for block {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating block model for registry object {} with texture of {}", registryObject.getId(), itemId); - defaultBlock(registryObject.get(), textureBlock, annotation.renderType()); - } - } - - @NonExtendable - private void generatePillarModels(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(PillarModel.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - if (registryObject == null) continue; - // Generate default model - log.debug("Generating block model for registry object {}", registryObject.getId()); - pillar(registryObject.get()); - } - } - - @NonExtendable - private void generateStairModels(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(StairModel.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - - if (registryObject == null) continue; - StairModel annotation = registryObjectField.getAnnotation(StairModel.class); - // Generate default model - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Block textureBlock = ForgeRegistries.BLOCKS.getValue(itemId); - if (textureBlock == null) { - log.error("Could not find texture block {} for block {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating block model for registry object {} with texture of {}", registryObject.getId(), itemId); - stairs(registryObject.get(), textureBlock); - } - } - - @NonExtendable - private void generateSlabModels(AnnotationData annotationData, List blockRegistryObjectFieldList) { - for (Field registryObjectField : blockRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(SlabModel.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Block.class); - - if (registryObject == null) continue; - SlabModel annotation = registryObjectField.getAnnotation(SlabModel.class); - // Generate default model - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Block textureBlock = ForgeRegistries.BLOCKS.getValue(itemId); - if (textureBlock == null) { - log.error("Could not find texture block {} for block {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating block model for registry object {} with texture of {}", registryObject.getId(), itemId); - slab(registryObject.get(), textureBlock); - } - } - - @AvailableSince("2.0.0.0") - @NonExtendable - protected final ResourceLocation rl(Block block) { - return Objects.requireNonNull(ForgeRegistries.BLOCKS.getKey(block)); - } - - @NonExtendable - protected final String name(Block block) { - return rl(block).getPath(); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param block the target {@link Block} - */ - protected void defaultBlock(Block block) { - defaultBlock(block, block); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param block the target {@link Block} - * @param renderType the render type - */ - protected void defaultBlock(Block block, RenderType renderType) { - defaultBlock(block, block, renderType); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param block the target {@link Block} - * @param textureBlock the texture providing {@link Block} - */ - protected void defaultBlock(Block block, Block textureBlock) { - defaultBlock(block, textureBlock, RenderType.DEFAULT); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param block the target {@link Block} - * @param textureBlock the texture providing {@link Block} - * @param renderType the render type - */ - protected void defaultBlock(Block block, Block textureBlock, RenderType renderType) { - getVariantBuilder(block).forAllStates(state -> { - if (RenderType.DEFAULT.equals(renderType)) { - return ConfiguredModel.builder() - .modelFile(cubeAll(textureBlock)) - .build(); - } else { - return ConfiguredModel.builder() - .modelFile(models() - .cubeAll(name(textureBlock), blockTexture(textureBlock)) - .renderType(renderType.getId())) - .build(); - } - }); - - itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()) - .parent(new UncheckedModelFile(modLoc("block/" + name(block)))); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param stairBlock the {@link StairBlock} Object - * @param textureBlock the {@link Block} you want to use as texture - */ - protected void stairs(Block stairBlock, Block textureBlock) { - if (!(stairBlock instanceof StairBlock block)) { - throw new IllegalArgumentException(Objects.requireNonNull(rl(stairBlock)) + " is not a instance of StairBlock."); - } else { - stairsBlock(block, new ResourceLocation(Objects.requireNonNull(rl(textureBlock)).getNamespace(), "block/" + name(textureBlock))); - itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()) - .parent(new ModelFile.UncheckedModelFile(modLoc("block/" + name(block)))); - } - } - - protected void stairs(Block stairBlock, ResourceLocation top, ResourceLocation bottom, ResourceLocation side, ResourceLocation overlay) { - if (stairBlock instanceof StairBlock block) { - String baseName = rl(block).toString(); - ModelFile stairs = overlayStair(baseName, top, bottom, side, overlay); - ModelFile stairsInner = overlayInnerStair(baseName + "_inner", top, bottom, side, overlay); - ModelFile stairsOuter = overlayOuterStair(baseName + "_outer", top, bottom, side, overlay); - - getVariantBuilder(block) - .forAllStatesExcept(state -> { - Direction facing = state.getValue(StairBlock.FACING); - Half half = state.getValue(StairBlock.HALF); - StairsShape shape = state.getValue(StairBlock.SHAPE); - int yRot = (int) facing.getClockWise().toYRot(); // Stairs model is rotated 90 degrees clockwise for some reason - if (shape == StairsShape.INNER_LEFT || shape == StairsShape.OUTER_LEFT) { - yRot += 270; // Left facing stairs are rotated 90 degrees clockwise - } - if (shape != StairsShape.STRAIGHT && half == Half.TOP) { - yRot += 90; // Top stairs are rotated 90 degrees clockwise - } - yRot %= 360; - boolean uvlock = yRot != 0 || half == Half.TOP; // Don't set uvlock for states that have no rotation - return ConfiguredModel.builder() - .modelFile(shape == StairsShape.STRAIGHT ? stairs : shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT ? stairsInner : stairsOuter) - .rotationX(half == Half.BOTTOM ? 0 : 180) - .rotationY(yRot) - .uvLock(uvlock) - .build(); - }, StairBlock.WATERLOGGED); - - this.itemModels().getBuilder(name(block)).parent(new ModelFile.UncheckedModelFile(this.modLoc("block/" + name(block)))); - } else { - throw new IllegalArgumentException(Objects.requireNonNull(rl(stairBlock)) + " is not a instance of StairBlock."); - } - } - - protected void sidedStairs(Block stairBlock, ResourceLocation top, ResourceLocation bottom, ResourceLocation side) { - if (stairBlock instanceof StairBlock block) { - String baseName = rl(block).toString(); - ModelFile stairs = grassLikeStair(baseName, top, bottom, side); - ModelFile stairsInner = grassLikeInnerStair(baseName + "_inner", top, bottom, side); - ModelFile stairsOuter = grassLikeOuterStair(baseName + "_outer", top, bottom, side); - - getVariantBuilder(block) - .forAllStatesExcept(state -> { - Direction facing = state.getValue(StairBlock.FACING); - Half half = state.getValue(StairBlock.HALF); - StairsShape shape = state.getValue(StairBlock.SHAPE); - int yRot = (int) facing.getClockWise().toYRot(); // Stairs model is rotated 90 degrees clockwise for some reason - if (shape == StairsShape.INNER_LEFT || shape == StairsShape.OUTER_LEFT) { - yRot += 270; // Left facing stairs are rotated 90 degrees clockwise - } - if (shape != StairsShape.STRAIGHT && half == Half.TOP) { - yRot += 90; // Top stairs are rotated 90 degrees clockwise - } - yRot %= 360; - boolean uvlock = yRot != 0 || half == Half.TOP; // Don't set uvlock for states that have no rotation - return ConfiguredModel.builder() - .modelFile(shape == StairsShape.STRAIGHT ? stairs : shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT ? stairsInner : stairsOuter) - .rotationX(half == Half.BOTTOM ? 0 : 180) - .rotationY(yRot) - .uvLock(uvlock) - .build(); - }, StairBlock.WATERLOGGED); - - this.itemModels().getBuilder(name(block)).parent(new ModelFile.UncheckedModelFile(this.modLoc("block/" + name(block)))); - } else { - throw new IllegalArgumentException(Objects.requireNonNull(rl(stairBlock)) + " is not a instance of StairBlock."); - } - } - - protected void stairs(Block stairBlock, ResourceLocation side, ResourceLocation bottom, ResourceLocation top) { - if (stairBlock instanceof StairBlock block) { - stairsBlock(block, side, bottom, top); - this.itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()).parent(new ModelFile.UncheckedModelFile(this.modLoc("block/" + name(block)))); - } else { - throw new IllegalArgumentException(Objects.requireNonNull(rl(stairBlock)) + " is not a instance of StairBlock."); - } - } - - protected void stairs(Block stairBlock, ResourceLocation side, ResourceLocation top) { - stairs(stairBlock, side, top, top); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param slabBlock the {@link SlabBlock} Object - * @param textureBlock the {@link Block} you want to use as texture - */ - protected void slab(Block slabBlock, Block textureBlock) { - if (!(slabBlock instanceof SlabBlock block)) { - throw new IllegalArgumentException(Objects.requireNonNull(rl(slabBlock)) + " is not a instance of StairBlock."); - } else { - ResourceLocation textureLocation = new ResourceLocation(Objects.requireNonNull(rl(textureBlock)).getNamespace(), "block/" + name(textureBlock)); - slabBlock(block, textureLocation, textureLocation); - itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()).parent(new ModelFile.UncheckedModelFile(modLoc("block/" + name(block)))); - } - } - - protected void slab(Block slabBlock, Block fullBlock, ResourceLocation top, ResourceLocation bottom, ResourceLocation side, ResourceLocation overlay) { - if (slabBlock instanceof SlabBlock block) { - ModelFile doubleSlab = models().getExistingFile(new ResourceLocation(rl(fullBlock).getNamespace(), "block/" + name(fullBlock))); - ModelFile bottomSlab = overlaySlab(name(block), top, bottom, side, overlay); - ModelFile topSlab = overlaySlabTop(name(block) + "_top", top, bottom, side, overlay); - - getVariantBuilder(block) - .partialState().with(SlabBlock.TYPE, SlabType.BOTTOM).addModels(new ConfiguredModel(bottomSlab)) - .partialState().with(SlabBlock.TYPE, SlabType.TOP).addModels(new ConfiguredModel(topSlab)) - .partialState().with(SlabBlock.TYPE, SlabType.DOUBLE).addModels(new ConfiguredModel(doubleSlab)); - - this.itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()).parent(new ModelFile.UncheckedModelFile(this.modLoc("block/" + name(block)))); - } else { - throw new IllegalArgumentException(Objects.requireNonNull(rl(slabBlock)) + " is not a instance of StairBlock."); - } - } - - protected void slab(Block slabBlock, Block fullBlock, ResourceLocation side, ResourceLocation bottom, ResourceLocation top) { - if (slabBlock instanceof SlabBlock block) { - slabBlock(block, new ResourceLocation(rl(fullBlock).getNamespace(), "block/" + name(fullBlock)), side, bottom, top); - this.itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()).parent(new ModelFile.UncheckedModelFile(this.modLoc("block/" + name(block)))); - } else { - throw new IllegalArgumentException(Objects.requireNonNull(rl(slabBlock)) + " is not a instance of SlabBlock."); - } - } - - protected void slab(Block stairBlock, Block fullBlock, ResourceLocation side, ResourceLocation top) { - slab(stairBlock, fullBlock, side, top, top); - } - - protected void sidedSlab(Block slabBlock, Block fullBlock, ResourceLocation top, ResourceLocation bottom, ResourceLocation side) { - if (slabBlock instanceof SlabBlock block) { - ModelFile doubleSlab = models().getExistingFile(new ResourceLocation(rl(fullBlock).getNamespace(), "block/" + name(fullBlock))); - ModelFile bottomSlab = grassLikeSlab(name(block), top, bottom, side); - ModelFile topSlab = grassLikeSlabTop(name(block) + "_top", top, bottom, side); - - getVariantBuilder(block) - .partialState().with(SlabBlock.TYPE, SlabType.BOTTOM).addModels(new ConfiguredModel(bottomSlab)) - .partialState().with(SlabBlock.TYPE, SlabType.TOP).addModels(new ConfiguredModel(topSlab)) - .partialState().with(SlabBlock.TYPE, SlabType.DOUBLE).addModels(new ConfiguredModel(doubleSlab)); - - this.itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()).parent(new ModelFile.UncheckedModelFile(this.modLoc("block/" + name(block)))); - } else { - throw new IllegalArgumentException(Objects.requireNonNull(rl(slabBlock)) + " is not a instance of StairBlock."); - } - } - - /** - * Generates blockstate, block and item model json file. - * - * @param block the {@link RotatedPillarBlock} Object. - */ - protected void pillar(Block block) { - if (!(block instanceof RotatedPillarBlock rotatedPillarBlock)) { - throw new IllegalArgumentException(Objects.requireNonNull(rl(block)) + " is not a instance of RotatedPillarBlock."); - } else { - logBlock(rotatedPillarBlock); - itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()) - .parent(new ModelFile.UncheckedModelFile(modLoc("block/" + name(block)))); - } - } - - /** - * Generates blockstate, block and item model json file. - * - * @param block the {@link RotatedPillarBlock} Object. - * @param textureTopBot the path to the texture file for the top or bottom of the Block - * @param textureSides the path to the texture file for the sides of the block - */ - protected void nonRotatablePillar(Block block, ResourceLocation textureTopBot, ResourceLocation textureSides) { - getVariantBuilder(block) - .forAllStates(blockState -> ConfiguredModel.builder().modelFile(models().cubeColumn(name(block), textureSides, textureTopBot)).build()); - itemModels().getBuilder(Objects.requireNonNull(rl(block)).getPath()) - .parent(new ModelFile.UncheckedModelFile(modLoc("block/" + name(block)))); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param sapling sapling block - */ - protected void sapling(Supplier sapling) { - sapling(sapling.get()); - } - - /** - * Generates blockstate, block and item model json file. - * - * @param sapling sapling block - */ - protected void sapling(Block sapling) { - getVariantBuilder(sapling).forAllStates(blockState -> ConfiguredModel.builder().modelFile(models().cross(name(sapling), blockTexture(sapling))).build()); - itemModels().getBuilder(Objects.requireNonNull(rl(sapling)).getPath()) - .parent(new ModelFile.UncheckedModelFile(modLoc("block/" + name(sapling)))); - } - - private BlockModelBuilder overlayStair(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side, ResourceLocation overlay) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/overlay_stairs")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top) - .texture("overlay", overlay); - } - - private BlockModelBuilder overlayInnerStair(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side, ResourceLocation overlay) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/overlay_inner_stairs")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top) - .texture("overlay", overlay); - } - - private BlockModelBuilder overlayOuterStair(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side, ResourceLocation overlay) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/overlay_outer_stairs")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top) - .texture("overlay", overlay); - } - - private BlockModelBuilder overlaySlab(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side, ResourceLocation overlay) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/overlay_slab")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top) - .texture("overlay", overlay); - } - - private BlockModelBuilder overlaySlabTop(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side, ResourceLocation overlay) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/overlay_slab_top")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top) - .texture("overlay", overlay); - } - - private BlockModelBuilder grassLikeStair(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/grass_like_stairs")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top); - } - - private BlockModelBuilder grassLikeInnerStair(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/grass_like_inner_stairs")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top); - } - - private BlockModelBuilder grassLikeOuterStair(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/grass_like_outer_stairs")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top); - } - - private BlockModelBuilder grassLikeSlab(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/grass_like_slab")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top); - } - - private BlockModelBuilder grassLikeSlabTop(String baseName, ResourceLocation top, ResourceLocation bottom, ResourceLocation side) { - return models().withExistingParent(baseName, new ResourceLocation(ManasCore.MOD_ID, "block/grass_like_slab_top")) - .texture("side", side) - .texture("bottom", bottom) - .texture("top", top); - } -} - diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockTagProvider.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockTagProvider.java deleted file mode 100644 index 63189909..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/BlockTagProvider.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import net.minecraft.core.HolderLookup; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.Tags.Blocks; -import net.minecraftforge.common.data.BlockTagsProvider; -import net.minecraftforge.data.event.GatherDataEvent; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; -import org.jetbrains.annotations.ApiStatus.OverrideOnly; - -import java.util.Arrays; -import java.util.function.Supplier; - -@AvailableSince("1.0.0.0") -public abstract class BlockTagProvider extends BlockTagsProvider { - public BlockTagProvider(GatherDataEvent gatherDataEvent, String modId) { - super(gatherDataEvent.getGenerator().getPackOutput(),gatherDataEvent.getLookupProvider(), modId, gatherDataEvent.getExistingFileHelper()); - } - - @Override - protected void addTags(HolderLookup.Provider pProvider) { - generate(); - } - - @OverrideOnly - protected abstract void generate(); - - @SafeVarargs - @NonExtendable - protected final void mineableWithAxe(Supplier... blocks) { - mineableWithAxe(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void mineableWithAxe(Block... blocks) { - tag(BlockTags.MINEABLE_WITH_AXE).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void mineableWithHoe(Supplier... blocks) { - mineableWithHoe(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void mineableWithHoe(Block... blocks) { - tag(BlockTags.MINEABLE_WITH_HOE).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void mineableWithPickaxe(Supplier... blocks) { - mineableWithPickaxe(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void mineableWithPickaxe(Block... blocks) { - tag(BlockTags.MINEABLE_WITH_PICKAXE).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void mineableWithShovel(Supplier... blocks) { - mineableWithShovel(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void mineableWithShovel(Block... blocks) { - tag(BlockTags.MINEABLE_WITH_SHOVEL).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void mineableWithAllTools(Supplier... blocks) { - mineableWithAllTools(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void mineableWithAllTools(Block... blocks) { - mineableWithAxe(blocks); - mineableWithHoe(blocks); - mineableWithPickaxe(blocks); - mineableWithShovel(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void needsNetheriteTool(Supplier... blocks) { - needsNetheriteTool(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void needsNetheriteTool(Block... blocks) { - tag(Blocks.NEEDS_NETHERITE_TOOL).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void needsDiamondTool(Supplier... blocks) { - needsDiamondTool(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void needsDiamondTool(Block... blocks) { - tag(BlockTags.NEEDS_DIAMOND_TOOL).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void needsIronTool(Supplier... blocks) { - needsIronTool(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void needsIronTool(Block... blocks) { - tag(BlockTags.NEEDS_IRON_TOOL).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void needsStoneTool(Supplier... blocks) { - needsStoneTool(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void needsStoneTool(Block... blocks) { - tag(BlockTags.NEEDS_STONE_TOOL).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void needsWoodenTools(Supplier... blocks) { - needsWoodenTools(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void needsWoodenTools(Block... blocks) { - tag(Blocks.NEEDS_WOOD_TOOL).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void needsGoldenTools(Supplier... blocks) { - needsGoldenTools(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void needsGoldenTools(Block... blocks) { - tag(Blocks.NEEDS_GOLD_TOOL).add(blocks); - } - - @SafeVarargs - @NonExtendable - protected final void subTag(TagKey root, TagKey sub, Supplier... blocks) { - subTag(root, sub, Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); - } - - protected void subTag(TagKey root, TagKey sub, Block... blocks) { - tag(root).addTag(sub); - tag(sub).add(blocks); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/CustomDataProvider.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/CustomDataProvider.java deleted file mode 100644 index 46c6d0a9..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/CustomDataProvider.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ -package com.github.manasmods.manascore.api.data.gen; - -import com.google.common.collect.Maps; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import lombok.extern.log4j.Log4j2; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.DataProvider; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.OverrideOnly; -import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; - -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.function.BiConsumer; -import java.util.function.Supplier; - -@AvailableSince("1.0.0.0") -@Log4j2 -public abstract class CustomDataProvider implements DataProvider { - @ScheduledForRemoval(inVersion = "2.1.0.0") - @Deprecated(forRemoval = true) - private static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .create(); - private final String outputPath; - private final DataGenerator generator; - - public CustomDataProvider(String path, DataGenerator generator) { - this.outputPath = path; - this.generator = generator; - } - - @OverrideOnly - protected abstract void run(BiConsumer> consumer); - - @Override - public CompletableFuture run(CachedOutput pOutput) { - Map> map = Maps.newHashMap(); - BiConsumer> consumer = (location, jsonElementSupplier) -> { - Supplier supplier = map.put(location, jsonElementSupplier); - if (supplier != null) { - throw new IllegalStateException(String.format("Duplicate %s for %s", getName(), location)); - } - }; - - run(consumer); - - List> futures = new ArrayList<>(); - map.forEach((location, jsonElementSupplier) -> { - Path path = this.generator.getPackOutput().getOutputFolder() - .resolve("data") - .resolve(location.getNamespace()) - .resolve(this.outputPath) - .resolve(location.getPath() + ".json"); - - futures.add(DataProvider.saveStable(pOutput, jsonElementSupplier.get(), path)); - }); - - return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/EntityLoot.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/EntityLoot.java deleted file mode 100644 index 98a4e85e..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/EntityLoot.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateEntityLoot; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateEntityLoot.EmptyLootTable; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateEntityLoot.WithLootTables; -import com.github.manasmods.manascore.api.util.ReflectionUtils; -import lombok.extern.log4j.Log4j2; -import net.minecraft.data.loot.packs.VanillaEntityLoot; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.ApiStatus.NonExtendable; -import org.objectweb.asm.Type; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.stream.Stream; - -import static com.github.manasmods.manascore.api.util.StreamUtils.distinctBy; - -@Log4j2 -public abstract class EntityLoot extends VanillaEntityLoot { - private static final Type GEN_ANNOTATION = Type.getType(GenerateEntityLoot.class); - - @NonExtendable - @Override - public final void generate() { - loadTables(); - final List annotations = new ArrayList<>(); - ModList.get().forEachModFile(modFile -> { - modFile.getScanResult().getAnnotations() - .stream() - .filter(annotationData -> GEN_ANNOTATION.equals(annotationData.annotationType())) - .forEach(annotations::add); - }); - generateAnnotationLootTables(annotations); - } - - @NonExtendable - private void generateAnnotationLootTables(List annotations) { - annotations.forEach(annotationData -> { - Class clazz = null; - try { - clazz = Class.forName(annotationData.clazz().getClassName()); - } catch (ClassNotFoundException e) { - log.error("Could not load class " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (clazz == null) return; - - List entityRegistryObjectFieldList = Arrays.stream(clazz.getDeclaredFields()) - .filter(field -> Modifier.isStatic(field.getModifiers())) - .filter(field -> field.getType().equals(RegistryObject.class)) - .filter(field -> { - ParameterizedType registryObjectType = null; - try { - registryObjectType = ((ParameterizedType) field.getGenericType()); - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (registryObjectType == null) return false; - - Class registryObjectClass = null; - try { - registryObjectClass = (Class) registryObjectType.getActualTypeArguments()[0]; - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName() + "."); - log.throwing(e); - } - if (registryObjectClass == null) return false; - - return EntityType.class.isAssignableFrom(registryObjectClass); - }) - .toList(); - // TODO add Annotation Generators - generateEmptyLootTables(annotationData, entityRegistryObjectFieldList); - }); - } - - @NonExtendable - private void generateEmptyLootTables(AnnotationData annotationData, List entityRegistryObjectFieldList) { - for (Field registryObjectField : entityRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(EmptyLootTable.class)) continue; - @SuppressWarnings("unchecked") RegistryObject> registryObject = - (RegistryObject>) (Object) ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, EntityType.class); - if (registryObject == null) continue; - log.debug("Generating block loot for registry object {}", registryObject.getId()); - add(registryObject.get(), LootTable.lootTable()); - } - } - - protected abstract void loadTables(); - - @SuppressWarnings("unchecked") - @Override - protected Stream> getKnownEntityTypes() { - return (Stream>) (Object) ModList.get().getAllScanData() - .stream() - .flatMap(modFileScanData -> modFileScanData.getAnnotations().stream()) - .filter(annotationData -> GEN_ANNOTATION.equals(annotationData.annotationType())) - .flatMap(annotationData -> { - Class clazz = null; - try { - clazz = Class.forName(annotationData.clazz().getClassName()); - } catch (ClassNotFoundException e) { - log.error("Could not load class " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (clazz == null) return Stream.of(); - - return Arrays.stream(clazz.getDeclaredFields()) - .filter(field -> Modifier.isStatic(field.getModifiers())) - .filter(field -> field.getType().equals(DeferredRegister.class)) - .filter(field -> { - ParameterizedType registryObjectType = null; - try { - registryObjectType = ((ParameterizedType) field.getGenericType()); - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (registryObjectType == null) return false; - - Class registryObjectClass = null; - try { - registryObjectClass = (Class) registryObjectType.getActualTypeArguments()[0]; - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName() + "."); - log.throwing(e); - } - if (registryObjectClass == null) return false; - - return EntityType.class.isAssignableFrom(registryObjectClass); - }) - .filter(field -> field.isAnnotationPresent(WithLootTables.class)) - .map(field -> ReflectionUtils.getDeferredRegisterFromField(annotationData, field, EntityType.class)) - .filter(Objects::nonNull) - .flatMap(blockDeferredRegister -> blockDeferredRegister.getEntries().stream()) - .filter(RegistryObject::isPresent) - .filter(distinctBy(entityTypeRegistryObject -> entityTypeRegistryObject)) - .map(RegistryObject::get); - }); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/ItemModelProvider.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/ItemModelProvider.java deleted file mode 100644 index a4eb5af5..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/ItemModelProvider.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateItemModels; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateItemModels.SingleHandheldTextureModel; -import com.github.manasmods.manascore.api.data.gen.annotation.GenerateItemModels.SingleTextureModel; -import com.github.manasmods.manascore.api.util.ReflectionUtils; -import lombok.extern.log4j.Log4j2; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; -import org.jetbrains.annotations.ApiStatus.OverrideOnly; -import org.objectweb.asm.Type; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -@AvailableSince("1.0.0.0") -@SuppressWarnings("unused") -@Log4j2 -public abstract class ItemModelProvider extends net.minecraftforge.client.model.generators.ItemModelProvider { - private static final Type GEN_MODELS = Type.getType(GenerateItemModels.class); - - public ItemModelProvider(final GatherDataEvent gatherDataEvent, String modId) { - super(gatherDataEvent.getGenerator().getPackOutput(), modId, gatherDataEvent.getExistingFileHelper()); - } - - @OverrideOnly - protected abstract void generate(); - - @NonExtendable - @Override - protected final void registerModels() { - generate(); - - final List annotations = new ArrayList<>(); - ModList.get().forEachModFile(modFile -> { - modFile.getScanResult().getAnnotations() - .stream() - .filter(annotationData -> GEN_MODELS.equals(annotationData.annotationType())) - .forEach(annotations::add); - }); - generateAnnotationModels(annotations); - } - - @NonExtendable - private void generateAnnotationModels(List annotations) { - annotations.forEach(annotationData -> { - Class clazz = null; - try { - clazz = Class.forName(annotationData.clazz().getClassName()); - } catch (ClassNotFoundException e) { - log.error("Could not load class " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (clazz == null) return; - - List itemRegistryObjectFieldList = Arrays.stream(clazz.getDeclaredFields()) - .filter(field -> Modifier.isStatic(field.getModifiers())) - .filter(field -> field.getType().equals(RegistryObject.class)) - .filter(field -> { - ParameterizedType registryObjectType = null; - try { - registryObjectType = ((ParameterizedType) field.getGenericType()); - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName()); - log.throwing(e); - } - if (registryObjectType == null) return false; - - Class registryObjectClass = null; - try { - registryObjectClass = (Class) registryObjectType.getActualTypeArguments()[0]; - } catch (ClassCastException e) { - log.error("Could not load generic type of field " + field.getName() + " in " + annotationData.clazz().getClassName() + "."); - log.throwing(e); - } - if (registryObjectClass == null) return false; - - return Item.class.isAssignableFrom(registryObjectClass); - }) - .toList(); - - generateSingleTextureModels(annotationData, itemRegistryObjectFieldList); - generateSingleHandheldTextureModels(annotationData, itemRegistryObjectFieldList); - }); - } - - @NonExtendable - private void generateSingleTextureModels(AnnotationData annotationData, List itemRegistryObjectFieldList) { - for (Field registryObjectField : itemRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(SingleTextureModel.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Item.class); - - if (registryObject == null) continue; - SingleTextureModel annotation = registryObjectField.getAnnotation(SingleTextureModel.class); - // Generate default model - if (annotation.value().isEmpty() || annotation.value().isBlank()) { - log.debug("Generating item model for registry object {}", registryObject.getId()); - singleTexture(registryObject.get()); - continue; - } - - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Item textureItem = ForgeRegistries.ITEMS.getValue(itemId); - if (textureItem == null) { - log.error("Could not find texture item {} for item {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating item model for registry object {} with texture of {}", registryObject.getId(), itemId); - singleTexture(registryObject.get(), textureItem); - } - } - - @NonExtendable - private void generateSingleHandheldTextureModels(AnnotationData annotationData, List itemRegistryObjectFieldList) { - for (Field registryObjectField : itemRegistryObjectFieldList) { - if (!registryObjectField.isAnnotationPresent(SingleHandheldTextureModel.class)) continue; - RegistryObject registryObject = ReflectionUtils.getRegistryObjectFromField(annotationData, registryObjectField, Item.class); - - if (registryObject == null) continue; - SingleHandheldTextureModel annotation = registryObjectField.getAnnotation(SingleHandheldTextureModel.class); - // Generate default model - if (annotation.value().isEmpty() || annotation.value().isBlank()) { - log.debug("Generating item model for registry object {}", registryObject.getId()); - handheldSingleTexture(registryObject.get()); - continue; - } - - ResourceLocation itemId = ResourceLocation.tryParse(annotation.value()); - Item textureItem = ForgeRegistries.ITEMS.getValue(itemId); - if (textureItem == null) { - log.error("Could not find texture item {} for item {}", itemId, registryObject.getId()); - continue; - } - - log.debug("Generating item model for registry object {} with texture of {}", registryObject.getId(), itemId); - handheldSingleTexture(registryObject.get(), textureItem); - } - } - - @AvailableSince("2.0.0.0") - @NonExtendable - protected final ResourceLocation rl(Item item) { - return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item)); - } - - @AvailableSince("2.0.0.0") - @NonExtendable - protected final String name(Item item) { - return rl(item).getPath(); - } - - /** - * Generates the item model json file. - * Can be used for any default rendered {@link Item} object. - * - * @param item the target {@link Item} - */ - protected void singleTexture(Item item) { - singleTexture(item, item); - } - - /** - * Generates the item model json file. - * Can be used for any default rendered {@link Item} object. - * - * @param item the target {@link Item} - * @param textureItem the texture providing {@link Item} - */ - protected void singleTexture(Item item, Item textureItem) { - getBuilder(name(item)) - .parent(new ModelFile.UncheckedModelFile(mcLoc("item/generated"))) - .texture("layer0", new ResourceLocation(rl(textureItem).getNamespace(), "item/" + name(textureItem))); - } - - /** - * Generates the item model json file. - * Can be used for any handheld rendered {@link Item} like Tools and Torches. - * - * @param item the target {@link Item} - */ - protected void handheldSingleTexture(Item item) { - handheldSingleTexture(item, item); - } - - /** - * Generates the item model json file. - * Can be used for any handheld rendered {@link Item} like Tools and Torches. - * - * @param item the target {@link Item} - * @param textureItem the texture providing {@link Item} - */ - protected void handheldSingleTexture(Item item, Item textureItem) { - getBuilder(name(item)) - .parent(new ModelFile.UncheckedModelFile(mcLoc("item/handheld"))) - .texture("layer0", new ResourceLocation(rl(textureItem).getNamespace(), "item/" + name(textureItem))); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/ItemTagProvider.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/ItemTagProvider.java deleted file mode 100644 index 0ecddc64..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/ItemTagProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import net.minecraft.core.HolderLookup; -import net.minecraft.data.tags.ItemTagsProvider; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraftforge.data.event.GatherDataEvent; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; -import org.jetbrains.annotations.ApiStatus.OverrideOnly; - -import java.util.Arrays; -import java.util.function.Supplier; - -@AvailableSince("1.0.0.0") -public abstract class ItemTagProvider extends ItemTagsProvider { - - public ItemTagProvider(GatherDataEvent gatherDataEvent, String modId, BlockTagProvider blockTagProvider) { - super(gatherDataEvent.getGenerator().getPackOutput(),gatherDataEvent.getLookupProvider(), blockTagProvider, modId, gatherDataEvent.getExistingFileHelper()); - } - - @SafeVarargs - @NonExtendable - protected final void subTag(TagKey root, TagKey sub, Supplier... items) { - subTag(root, sub, Arrays.stream(items).map(Supplier::get).toArray(Item[]::new)); - } - - private void subTag(TagKey root, TagKey sub, Item... items) { - tag(root).addTag(sub); - tag(sub).add(items); - } - - @Override - protected void addTags(HolderLookup.Provider pProvider) { - generate(); - } - - @OverrideOnly - protected abstract void generate(); -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/LanguageProvider.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/LanguageProvider.java deleted file mode 100644 index 40a18ca2..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/LanguageProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - - -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.OverrideOnly; - -@AvailableSince("1.0.0.0") -public abstract class LanguageProvider extends net.minecraftforge.common.data.LanguageProvider { - public LanguageProvider(GatherDataEvent gatherDataEvent, String modid) { - this(gatherDataEvent, modid, "en_us"); - } - - public LanguageProvider(GatherDataEvent gatherDataEvent, String modid, String localeCode) { - super(gatherDataEvent.getGenerator().getPackOutput(), modid, localeCode); - } - - @OverrideOnly - protected abstract void generate(); - - @Override - protected void addTranslations() { - generate(); - } - - protected void addBlock(RegistryObject obj, String value) { - add(obj.get(), value); - } - - protected void addItem(RegistryObject obj, String value) { - add(obj.get(), value); - } - protected > void addEntityType(RegistryObject obj, String value) { - add(obj.get(), value); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/RecipeProvider.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/RecipeProvider.java deleted file mode 100644 index cc42e073..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/RecipeProvider.java +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import com.github.manasmods.manascore.core.ShapedRecipeBuilderAccessor; -import net.minecraft.advancements.RequirementsStrategy; -import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.data.recipes.RecipeBuilder; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.data.recipes.ShapelessRecipeBuilder; -import net.minecraft.data.recipes.SimpleCookingRecipeBuilder; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.crafting.conditions.IConditionBuilder; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; -import org.jetbrains.annotations.ApiStatus.OverrideOnly; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.function.Supplier; - -@AvailableSince("1.0.0.0") -@SuppressWarnings({"unused", "SameParameterValue"}) -public abstract class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider implements IConditionBuilder { - public RecipeProvider(final GatherDataEvent gatherDataEvent) { - super(gatherDataEvent.getGenerator().getPackOutput()); - } - - @OverrideOnly - protected abstract void generate(Consumer pWriter); - - @Override - protected void buildRecipes(@NotNull Consumer pWriter) { - generate(pWriter); - } - - @AvailableSince("2.0.0.0") - @NonExtendable - protected final ResourceLocation rl(Item item) { - return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item)); - } - - @AvailableSince("2.0.0.0") - @NonExtendable - protected final ResourceLocation rl(ItemStack item) { - return rl(item.getItem()); - } - - @AvailableSince("2.0.0.0") - @NonExtendable - protected final ResourceLocation rl(ItemLike itemLike) { - return rl(itemLike.asItem()); - } - - @AvailableSince("2.0.0.0") - @NonExtendable - protected final ResourceLocation rl(Block block) { - return rl(block.asItem()); - } - - protected void allSmeltingRecipes(Consumer pFinishedRecipeConsumer, Ingredient ingredient, RecipeCategory recipeCategory, ItemLike result, float exp, int smeltingTicks, int campfireTicks, int smokingTicks) { - smeltingRecipe(pFinishedRecipeConsumer, ingredient, recipeCategory, result, exp, smeltingTicks); - campfireRecipe(pFinishedRecipeConsumer, ingredient, result, exp, campfireTicks); - smokingRecipe(pFinishedRecipeConsumer, ingredient, result, exp, smokingTicks); - } - - protected void smeltingRecipe(Consumer pFinishedRecipeConsumer, Ingredient ingredient, RecipeCategory recipeCategory, ItemLike result, float exp, int cookingTicks) { - for (ItemStack itemStack : ingredient.getItems()) { - SimpleCookingRecipeBuilder.smelting(ingredient, recipeCategory, result, exp, cookingTicks) - .unlockedBy("has_" + getHasName(itemStack), has(itemStack.getItem())) - .save(pFinishedRecipeConsumer, getSmeltingRecipeName(result)); - } - } - - protected void campfireRecipe(Consumer pFinishedRecipeConsumer, Ingredient ingredient, ItemLike result, float exp, int cookingTicks) { - for (ItemStack itemStack : ingredient.getItems()) { - simpleCookingRecipe(pFinishedRecipeConsumer, "campfire_cooking", RecipeSerializer.CAMPFIRE_COOKING_RECIPE, cookingTicks, itemStack.getItem(), result, exp); - } - } - - protected void smokingRecipe(Consumer pFinishedRecipeConsumer, Ingredient ingredient, ItemLike result, float exp, int cookingTicks) { - for (ItemStack itemStack : ingredient.getItems()) { - simpleCookingRecipe(pFinishedRecipeConsumer, "smoking", RecipeSerializer.SMOKING_RECIPE, cookingTicks, itemStack.getItem(), result, exp); - } - } - - protected void slab(Consumer finishedRecipeConsumer, Supplier slab, TagKey tag) { - slab(finishedRecipeConsumer, slab.get(), tag); - } - - protected void slab(Consumer finishedRecipeConsumer, Block slab, TagKey tag) { - RecipeBuilder builder = slabBuilder(RecipeCategory.BUILDING_BLOCKS, slab, Ingredient.of(tag)); - builder.unlockedBy("has_" + tag.location().getNamespace(), has(tag)); - builder.save(finishedRecipeConsumer); - } - - @SafeVarargs - protected final void slab(Consumer finishedRecipeConsumer, Supplier slab, Supplier... material) { - slab(finishedRecipeConsumer, slab.get(), Arrays.stream(material).map(Supplier::get).toArray(Block[]::new)); - } - - protected void slab(Consumer finishedRecipeConsumer, Block slab, Block... material) { - RecipeBuilder builder = slabBuilder(RecipeCategory.BUILDING_BLOCKS, slab, Ingredient.of(material)); - for (Block block : material) { - builder.unlockedBy("has_" + getHasName(block), has(block)); - } - - builder.save(finishedRecipeConsumer); - } - - protected void stairs(Consumer finishedRecipeConsumer, Supplier stairs, TagKey tag) { - stairs(finishedRecipeConsumer, stairs.get(), tag); - } - - protected void stairs(Consumer finishedRecipeConsumer, Block stairs, TagKey tag) { - stairs(finishedRecipeConsumer, true, stairs, tag); - } - - protected void stairs(Consumer finishedRecipeConsumer, boolean craft8, Block stairs, TagKey tag) { - RecipeBuilder builder = craft8 ? betterStairBuilder(stairs, Ingredient.of(tag)) : stairBuilder(stairs, Ingredient.of(tag)); - builder.unlockedBy("has_" + tag.location().getNamespace(), has(tag)); - builder.save(finishedRecipeConsumer); - } - - @SafeVarargs - protected final void stairs(Consumer finishedRecipeConsumer, Supplier stairs, Supplier... material) { - stairs(finishedRecipeConsumer, stairs.get(), Arrays.stream(material).map(Supplier::get).toArray(Block[]::new)); - } - - protected void stairs(Consumer finishedRecipeConsumer, Block stairs, Block... material) { - stairs(finishedRecipeConsumer, true, stairs, material); - } - - protected void stairs(Consumer finishedRecipeConsumer, boolean craft8, Block stairs, Block... material) { - RecipeBuilder builder = craft8 ? betterStairBuilder(stairs, Ingredient.of(material)) : stairBuilder(stairs, Ingredient.of(material)); - - for (Block block : material) { - builder.unlockedBy("has_" + getHasName(block), has(block)); - } - - builder.save(finishedRecipeConsumer); - } - - protected static RecipeBuilder betterStairBuilder(ItemLike pStairs, Ingredient pMaterial) { - return ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, pStairs, 8) - .define('#', pMaterial) - .pattern("# ") - .pattern("## ") - .pattern("###"); - } - - @SuppressWarnings("ConstantConditions") - protected void stairsToBlock(Consumer finishedRecipeConsumer, Block stair, Block block) { - ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, block, 3) - .requires(stair, 4) - .unlockedBy("has_" + getHasName(stair), has(stair)) - .save(finishedRecipeConsumer, new ResourceLocation(rl(block).getNamespace(), "stairs_to_block/" + rl(block).getPath())); - } - - @SuppressWarnings("ConstantConditions") - protected void slabsToBlock(Consumer finishedRecipeConsumer, Block slab, Block block) { - ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, block, 1) - .requires(slab, 2) - .unlockedBy("has_" + getHasName(slab), has(slab)) - .save(finishedRecipeConsumer, new ResourceLocation(rl(block).getNamespace(), "slabs_to_block/" + rl(block).getPath())); - } - - protected void sword(Consumer finishedRecipeConsumer, ItemLike material, ItemLike sword) { - sword(finishedRecipeConsumer, Ingredient.of(material), sword); - } - - protected void sword(Consumer finishedRecipeConsumer, TagKey material, ItemLike sword) { - sword(finishedRecipeConsumer, Ingredient.of(material), sword); - } - - protected void sword(Consumer finishedRecipeConsumer, Ingredient material, ItemLike sword) { - sword(finishedRecipeConsumer, material, Ingredient.of(Tags.Items.RODS_WOODEN), sword); - } - - protected void sword(Consumer finishedRecipeConsumer, ItemLike material, ItemLike stick, ItemLike sword) { - sword(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), sword); - } - - protected void sword(Consumer finishedRecipeConsumer, TagKey material, TagKey stick, ItemLike sword) { - sword(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), sword); - } - - protected void sword(Consumer finishedRecipeConsumer, Ingredient material, Ingredient stick, ItemLike sword) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, sword) - .pattern("X") - .pattern("X") - .pattern("S") - .define('X', material) - .define('S', stick); - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void axe(Consumer finishedRecipeConsumer, ItemLike material, ItemLike axe) { - axe(finishedRecipeConsumer, Ingredient.of(material), axe); - } - - protected void axe(Consumer finishedRecipeConsumer, TagKey material, ItemLike axe) { - axe(finishedRecipeConsumer, Ingredient.of(material), axe); - } - - protected void axe(Consumer finishedRecipeConsumer, Ingredient material, ItemLike axe) { - axe(finishedRecipeConsumer, material, Ingredient.of(Tags.Items.RODS_WOODEN), axe); - } - - protected void axe(Consumer finishedRecipeConsumer, ItemLike material, ItemLike stick, ItemLike axe) { - axe(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), axe); - } - - protected void axe(Consumer finishedRecipeConsumer, TagKey material, TagKey stick, ItemLike axe) { - axe(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), axe); - } - - protected void axe(Consumer finishedRecipeConsumer, Ingredient material, Ingredient stick, ItemLike axe) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, axe) - .pattern("XX") - .pattern("XS") - .pattern(" S") - .define('X', material) - .define('S', stick); - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void hoe(Consumer finishedRecipeConsumer, ItemLike material, ItemLike hoe) { - hoe(finishedRecipeConsumer, Ingredient.of(material), hoe); - } - - protected void hoe(Consumer finishedRecipeConsumer, TagKey material, ItemLike hoe) { - hoe(finishedRecipeConsumer, Ingredient.of(material), hoe); - } - - protected void hoe(Consumer finishedRecipeConsumer, Ingredient material, ItemLike hoe) { - hoe(finishedRecipeConsumer, material, Ingredient.of(Tags.Items.RODS_WOODEN), hoe); - } - - protected void hoe(Consumer finishedRecipeConsumer, ItemLike material, ItemLike stick, ItemLike hoe) { - hoe(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), hoe); - } - - protected void hoe(Consumer finishedRecipeConsumer, TagKey material, TagKey stick, ItemLike hoe) { - hoe(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), hoe); - } - - protected void hoe(Consumer finishedRecipeConsumer, Ingredient material, Ingredient stick, ItemLike hoe) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, hoe) - .pattern("XX") - .pattern(" S") - .pattern(" S") - .define('X', material) - .define('S', stick); - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void pickaxe(Consumer finishedRecipeConsumer, ItemLike material, ItemLike pickaxe) { - pickaxe(finishedRecipeConsumer, Ingredient.of(material), pickaxe); - } - - protected void pickaxe(Consumer finishedRecipeConsumer, TagKey material, ItemLike pickaxe) { - pickaxe(finishedRecipeConsumer, Ingredient.of(material), pickaxe); - } - - protected void pickaxe(Consumer finishedRecipeConsumer, Ingredient material, ItemLike pickaxe) { - pickaxe(finishedRecipeConsumer, material, Ingredient.of(Tags.Items.RODS_WOODEN), pickaxe); - } - - protected void pickaxe(Consumer finishedRecipeConsumer, ItemLike material, ItemLike stick, ItemLike pickaxe) { - pickaxe(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), pickaxe); - } - - protected void pickaxe(Consumer finishedRecipeConsumer, TagKey material, TagKey stick, ItemLike pickaxe) { - pickaxe(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), pickaxe); - } - - protected void pickaxe(Consumer finishedRecipeConsumer, Ingredient material, Ingredient stick, ItemLike pickaxe) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, pickaxe) - .pattern("XXX") - .pattern(" S ") - .pattern(" S ") - .define('X', material) - .define('S', stick); - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void shovel(Consumer finishedRecipeConsumer, ItemLike material, ItemLike shovel) { - shovel(finishedRecipeConsumer, Ingredient.of(material), shovel); - } - - protected void shovel(Consumer finishedRecipeConsumer, TagKey material, ItemLike shovel) { - shovel(finishedRecipeConsumer, Ingredient.of(material), shovel); - } - - protected void shovel(Consumer finishedRecipeConsumer, Ingredient material, ItemLike shovel) { - shovel(finishedRecipeConsumer, material, Ingredient.of(Tags.Items.RODS_WOODEN), shovel); - } - - protected void shovel(Consumer finishedRecipeConsumer, ItemLike material, ItemLike stick, ItemLike shovel) { - shovel(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), shovel); - } - - protected void shovel(Consumer finishedRecipeConsumer, TagKey material, TagKey stick, ItemLike shovel) { - shovel(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), shovel); - } - - protected void shovel(Consumer finishedRecipeConsumer, Ingredient material, Ingredient stick, ItemLike shovel) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, shovel) - .pattern("X") - .pattern("S") - .pattern("S") - .define('X', material) - .define('S', stick); - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void tools(Consumer finishedRecipeConsumer, ItemLike material, ItemLike axe, ItemLike hoe, ItemLike pickaxe, ItemLike shovel, ItemLike sword) { - tools(finishedRecipeConsumer, Ingredient.of(material), axe, hoe, pickaxe, shovel, sword); - } - - protected void tools(Consumer finishedRecipeConsumer, TagKey material, ItemLike axe, ItemLike hoe, ItemLike pickaxe, ItemLike shovel, ItemLike sword) { - tools(finishedRecipeConsumer, Ingredient.of(material), axe, hoe, pickaxe, shovel, sword); - } - - protected void tools(Consumer finishedRecipeConsumer, Ingredient material, ItemLike axe, ItemLike hoe, ItemLike pickaxe, ItemLike shovel, ItemLike sword) { - tools(finishedRecipeConsumer, material, Ingredient.of(Tags.Items.RODS_WOODEN), axe, hoe, pickaxe, shovel, sword); - } - - protected void tools(Consumer finishedRecipeConsumer, ItemLike material, ItemLike stick, ItemLike axe, ItemLike hoe, ItemLike pickaxe, ItemLike shovel, ItemLike sword) { - tools(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), axe, hoe, pickaxe, shovel, sword); - } - - protected void tools(Consumer finishedRecipeConsumer, TagKey material, TagKey stick, ItemLike axe, ItemLike hoe, ItemLike pickaxe, ItemLike shovel, ItemLike sword) { - tools(finishedRecipeConsumer, Ingredient.of(material), Ingredient.of(stick), axe, hoe, pickaxe, shovel, sword); - } - - protected void tools(Consumer finishedRecipeConsumer, Ingredient material, Ingredient stick, ItemLike axe, ItemLike hoe, ItemLike pickaxe, ItemLike shovel, ItemLike sword) { - axe(finishedRecipeConsumer, material, stick, axe); - hoe(finishedRecipeConsumer, material, stick, hoe); - pickaxe(finishedRecipeConsumer, material, stick, pickaxe); - shovel(finishedRecipeConsumer, material, stick, shovel); - sword(finishedRecipeConsumer, material, stick, sword); - } - - - protected void saveWithAutoUnlock(Consumer finishedRecipeConsumer, ShapedRecipeBuilder builder, Ingredient material) { - saveWithAutoUnlock(finishedRecipeConsumer, builder, material, ""); - } - - protected void saveWithAutoUnlock(Consumer finishedRecipeConsumer, ShapedRecipeBuilder builder, Ingredient material, String filePath) { - if (material.getItems().length > 1) { - ((ShapedRecipeBuilderAccessor) builder).getAdvancement().requirements(RequirementsStrategy.OR); - } - - for (ItemStack stack : material.getItems()) { - builder.unlockedBy(getHasName(stack.getItem()), has(stack.getItem())); - } - - ResourceLocation recipeResourceLocation = RecipeBuilder.getDefaultRecipeId(builder.getResult()); - builder.save(finishedRecipeConsumer, new ResourceLocation(recipeResourceLocation.getNamespace(), filePath + recipeResourceLocation.getPath())); - } - - protected String getHasName(ItemStack stack) { - return getHasName(stack.getItem()); - } - - protected void nineStorage(Consumer finishedRecipeConsumer, Supplier material, ItemLike packedMaterial) { - nineStorage(finishedRecipeConsumer, material.get(), packedMaterial); - } - - protected void nineStorage(Consumer finishedRecipeConsumer, ItemLike material, Supplier packedMaterial) { - nineStorage(finishedRecipeConsumer, material, packedMaterial.get()); - } - - protected void nineStorage(Consumer finishedRecipeConsumer, Supplier material, Supplier packedMaterial) { - nineStorage(finishedRecipeConsumer, material.get(), packedMaterial.get()); - } - - protected void nineStorage(Consumer finishedRecipeConsumer, ItemLike material, ItemLike packedMaterial) { - nineStorage(finishedRecipeConsumer, Ingredient.of(material), packedMaterial); - } - - protected void nineStorage(Consumer finishedRecipeConsumer, TagKey material, ItemLike packedMaterial) { - nineStorage(finishedRecipeConsumer, Ingredient.of(material), packedMaterial); - } - - protected void nineStorage(Consumer finishedRecipeConsumer, Ingredient material, ItemLike packedMaterial) { - if (material.getItems().length == 0) { - throw new IllegalStateException("No Item in material ingredient of recipe: " + rl(packedMaterial)); - } - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.MISC, packedMaterial) - .pattern("XXX") - .pattern("XXX") - .pattern("XXX") - .define('X', material); - saveWithAutoUnlock(finishedRecipeConsumer, builder, material, "storage/pack/"); - } - - protected void helmet(Consumer finishedRecipeConsumer, ItemLike material, ItemLike helmet) { - helmet(finishedRecipeConsumer, Ingredient.of(material), helmet); - } - - protected void helmet(Consumer finishedRecipeConsumer, TagKey material, ItemLike helmet) { - helmet(finishedRecipeConsumer, Ingredient.of(material), helmet); - } - - protected void helmet(Consumer finishedRecipeConsumer, Ingredient material, ItemLike helmet) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, helmet) - .pattern("XXX") - .pattern("X X") - .define('X', material); - - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void chestplate(Consumer finishedRecipeConsumer, ItemLike material, ItemLike chestplate) { - chestplate(finishedRecipeConsumer, Ingredient.of(material), chestplate); - } - - protected void chestplate(Consumer finishedRecipeConsumer, TagKey material, ItemLike chestplate) { - chestplate(finishedRecipeConsumer, Ingredient.of(material), chestplate); - } - - protected void chestplate(Consumer finishedRecipeConsumer, Ingredient material, ItemLike chestplate) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, chestplate) - .pattern("X X") - .pattern("XXX") - .pattern("XXX") - .define('X', material); - - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void leggings(Consumer finishedRecipeConsumer, ItemLike material, ItemLike leggings) { - leggings(finishedRecipeConsumer, Ingredient.of(material), leggings); - } - - protected void leggings(Consumer finishedRecipeConsumer, TagKey material, ItemLike leggings) { - leggings(finishedRecipeConsumer, Ingredient.of(material), leggings); - } - - protected void leggings(Consumer finishedRecipeConsumer, Ingredient material, ItemLike leggings) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, leggings) - .pattern("XXX") - .pattern("X X") - .pattern("X X") - .define('X', material); - - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void boots(Consumer finishedRecipeConsumer, ItemLike material, ItemLike boots) { - boots(finishedRecipeConsumer, Ingredient.of(material), boots); - } - - protected void boots(Consumer finishedRecipeConsumer, TagKey material, ItemLike boots) { - boots(finishedRecipeConsumer, Ingredient.of(material), boots); - } - - protected void boots(Consumer finishedRecipeConsumer, Ingredient material, ItemLike boots) { - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, boots) - .pattern("X X") - .pattern("X X") - .define('X', material); - - saveWithAutoUnlock(finishedRecipeConsumer, builder, material); - } - - protected void armour(Consumer finishedRecipeConsumer, ItemLike material, ItemLike helmet, ItemLike chestplate, ItemLike leggings, ItemLike boots) { - armour(finishedRecipeConsumer, Ingredient.of(material), helmet, chestplate, leggings, boots); - } - - protected void armour(Consumer finishedRecipeConsumer, TagKey material, ItemLike helmet, ItemLike chestplate, ItemLike leggings, ItemLike boots) { - armour(finishedRecipeConsumer, Ingredient.of(material), helmet, chestplate, leggings, boots); - } - - protected void armour(Consumer finishedRecipeConsumer, Ingredient material, ItemLike helmet, ItemLike chestplate, ItemLike leggings, ItemLike boots) { - helmet(finishedRecipeConsumer, material, helmet); - chestplate(finishedRecipeConsumer, material, chestplate); - leggings(finishedRecipeConsumer, material, leggings); - boots(finishedRecipeConsumer, material, boots); - } - - protected void armor(Consumer finishedRecipeConsumer, ItemLike material, ItemLike helmet, ItemLike chestplate, ItemLike leggings, ItemLike boots) { - armour(finishedRecipeConsumer, Ingredient.of(material), helmet, chestplate, leggings, boots); - } - - protected void armor(Consumer finishedRecipeConsumer, TagKey material, ItemLike helmet, ItemLike chestplate, ItemLike leggings, ItemLike boots) { - armour(finishedRecipeConsumer, Ingredient.of(material), helmet, chestplate, leggings, boots); - } - - protected void armor(Consumer finishedRecipeConsumer, Ingredient material, ItemLike helmet, ItemLike chestplate, ItemLike leggings, ItemLike boots) { - armour(finishedRecipeConsumer, material, helmet, chestplate, leggings, boots); - } - - protected void planksFromLogs(Consumer pFinishedRecipeConsumer, Supplier pPlanks, TagKey pLogs) { - planksFromLogs(pFinishedRecipeConsumer, pPlanks.get(), pLogs, 4); - } -} \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/RenderType.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/RenderType.java deleted file mode 100644 index 1bfc4b0b..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/RenderType.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import net.minecraft.resources.ResourceLocation; - -@RequiredArgsConstructor -public enum RenderType { - DEFAULT(null), // pass no value into the render type (causes the builder to decide the value) - SOLID(new ResourceLocation("minecraft", "solid")), - CUTOUT(new ResourceLocation("minecraft", "cutout")), - CUTOUT_MIPPED(new ResourceLocation("minecraft", "cutout_mipped")), - CUTOUT_MIPPED_ALL(new ResourceLocation("minecraft", "cutout_mipped_all")), - TRANSLUCENT(new ResourceLocation("minecraft", "translucent")), - TRIPWIRE(new ResourceLocation("minecraft", "tripwire")); - - @Getter - private final ResourceLocation id; -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockLoot.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockLoot.java deleted file mode 100644 index 4df20599..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockLoot.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen.annotation; - -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@AvailableSince("2.0.3.0") -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface GenerateBlockLoot { - @AvailableSince("2.0.3.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface WithLootTables {} - - @AvailableSince("2.0.3.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface SelfDrop {} - - @AvailableSince("2.0.3.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface OtherDrop { - String value(); - } - - @AvailableSince("2.0.3.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface OreDrop { - String value(); - } - - @AvailableSince("2.0.3.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface LeavesDrop { - String value(); - - float[] chances() default {0.05F, 0.0625F, 0.083333336F, 0.1F}; - } - - @AvailableSince("2.0.3.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface DoorDrop {} - - @AvailableSince("2.0.3.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface SlabDrop {} -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockModels.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockModels.java deleted file mode 100644 index 4578c86a..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateBlockModels.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen.annotation; - -import com.github.manasmods.manascore.api.data.gen.RenderType; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@AvailableSince("2.0.2.0") -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface GenerateBlockModels { - @AvailableSince("2.0.2.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface CubeAllModel { - /** - * ResourceLocation to the block providing a Texture - */ - String value() default ""; - - RenderType renderType() default RenderType.DEFAULT; - } - - @AvailableSince("2.0.2.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface PillarModel {} - - @AvailableSince("2.0.2.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface StairModel { - /** - * ResourceLocation to the block providing a Texture - */ - String value(); - } - - @AvailableSince("2.0.2.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface SlabModel { - /** - * ResourceLocation to the block providing a Texture - */ - String value(); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateEntityLoot.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateEntityLoot.java deleted file mode 100644 index 72f098b8..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateEntityLoot.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen.annotation; - -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@AvailableSince("2.0.5.0") -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface GenerateEntityLoot { - @AvailableSince("2.0.5.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface WithLootTables {} - - @AvailableSince("2.0.5.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface EmptyLootTable {} -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateItemModels.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateItemModels.java deleted file mode 100644 index eea25f95..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/annotation/GenerateItemModels.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.data.gen.annotation; - -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@AvailableSince("2.0.2.0") -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface GenerateItemModels { - @AvailableSince("2.0.2.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface SingleTextureModel { - /** - * ResourceLocation to the item providing a texture - */ - String value() default ""; - } - - @AvailableSince("2.0.2.0") - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface SingleHandheldTextureModel { - /** - * ResourceLocation to the item providing a texture - */ - String value() default ""; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/data/gen/package-info.java b/src/main/java/com/github/manasmods/manascore/api/data/gen/package-info.java deleted file mode 100644 index 04de5704..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/data/gen/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.data.gen; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/datapack/CodecJsonDataManager.java b/src/main/java/com/github/manasmods/manascore/api/datapack/CodecJsonDataManager.java deleted file mode 100644 index 13463ee6..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/datapack/CodecJsonDataManager.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.datapack; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; -import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.OnDatapackSyncEvent; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.network.simple.SimpleChannel; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; -import java.util.function.Function; - -@AvailableSince("1.0.0.0") -public class CodecJsonDataManager extends SimpleJsonResourceReloadListener { - private static final Gson STANDARD_GSON = new Gson(); - private static final Logger LOGGER = LogManager.getLogger(); - - /** The codec we use to convert json-elements to T objects **/ - private final Codec codec; - - private final String folderName; - - /** The raw data that we parsed from json last time resources were reloaded **/ - protected Map data = new HashMap<>(); - - /** - * Creates a data manager with a standard gson parser - * - * @param folderName The name of the data folder that we will load from, vanilla folderNames are "recipes", "loot_tables", etc
- * Jsons will be read from data/all_modids/folderName/all_jsons
- * folderName can include subfolders, e.g. "some_mod_that_adds_lots_of_data_loaders/cheeses" - * @param codec A codec to deserialize the json into your T, see javadocs above class - */ - public CodecJsonDataManager(String folderName, Codec codec) { - this(folderName, codec, STANDARD_GSON); - } - - /** - * As above but with a custom GSON - * - * @param folderName The name of the data folder that we will load from, vanilla folderNames are "recipes", "loot_tables", etc
- * Jsons will be read from data/all_modids/folderName/all_jsons
- * folderName can include subfolders, e.g. "some_mod_that_adds_lots_of_data_loaders/cheeses" - * @param codec A codec to deserialize the json into your T, see javadocs above class - * @param gson A gson for parsing the raw json data into JsonElements. JsonElement-to-T conversion will be done by the codec, - * so gson type adapters shouldn't be necessary here - */ - public CodecJsonDataManager(String folderName, Codec codec, Gson gson) { - super(gson, folderName); - this.folderName = folderName; // superclass has this but it's a private field - this.codec = codec; - } - - /** - * @return The data entries - */ - public Map getData() { - return this.data; - } - - @Override - protected void apply(Map jsons, ResourceManager resourceManager, ProfilerFiller profiler) { - LOGGER.info("Beginning loading of data for data loader: {}", this.folderName); - Map newMap = new HashMap<>(); - - for (Map.Entry entry : jsons.entrySet()) { - ResourceLocation key = entry.getKey(); - JsonElement element = entry.getValue(); - // if we fail to parse json, log an error and continue - // if we succeeded, add the resulting T to the map - this.codec.decode(JsonOps.INSTANCE, element) - .get() - .ifLeft(result -> newMap.put(key, result.getFirst())) - .ifRight(partial -> LOGGER.error("Failed to parse data json for {} due to: {}", key, partial.message())); - } - - this.data = newMap; - LOGGER.info("Data loader for {} loaded {} jsons", this.folderName, this.data.size()); - } - - /** - * This should be called at most once, during construction of your mod (static init of your main mod class is fine) - * Calling this method automatically subscribes a packet-sender to {@link OnDatapackSyncEvent}. - * - * @param the packet type that will be sent on the given channel - * @param channel The networking channel of your mod - * @param packetFactory A packet constructor or factory method that converts the given map to a packet object to send on the given channel - * - * @return this manager object - */ - public CodecJsonDataManager subscribeAsSyncable(final SimpleChannel channel, final Function, PACKET> packetFactory) { - MinecraftForge.EVENT_BUS.addListener(this.getDatapackSyncListener(channel, packetFactory)); - return this; - } - - /** Generate an event listener function for the on-datapack-sync event **/ - private Consumer getDatapackSyncListener(final SimpleChannel channel, final Function, PACKET> packetFactory) { - return event -> { - ServerPlayer player = event.getPlayer(); - PACKET packet = packetFactory.apply(this.data); - PacketDistributor.PacketTarget target = player == null - ? PacketDistributor.ALL.noArg() - : PacketDistributor.PLAYER.with(() -> player); - channel.send(target, packet); - }; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/datapack/MergeableCodecDataManager.java b/src/main/java/com/github/manasmods/manascore/api/datapack/MergeableCodecDataManager.java deleted file mode 100644 index f94f46fb..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/datapack/MergeableCodecDataManager.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.datapack; - -import com.google.common.collect.ImmutableMap; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.packs.resources.Resource; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.server.packs.resources.SimplePreparableReloadListener; -import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.OnDatapackSyncEvent; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.network.simple.SimpleChannel; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * Generic data loader for Codec-parsable data. - * This works best if initialized during your mod's construction. - * After creating the manager, subscribeAsSyncable can optionally be called on it to subscribe the manager - * to the forge events necessary for syncing datapack data to clients. - * - * @param The type of the objects that the codec is parsing jsons as - * @param The type of the object we get after merging the parsed objects. Can be the same as RAW - */ -@AvailableSince("1.0.0.0") -public class MergeableCodecDataManager extends SimplePreparableReloadListener> { - private static final Logger LOGGER = LogManager.getLogger(); - - /** ".json" **/ - protected static final String JSON_EXTENSION = ".json"; - /** 5 **/ - protected static final int JSON_EXTENSION_LENGTH = JSON_EXTENSION.length(); - - /** the loaded data **/ - protected Map data = new HashMap<>(); - - private final String folderName; - private final Codec codec; - private final Function, FINE> merger; - - /** - * Initialize a data manager with the given folder name, codec, and merger - * - * @param folderName The name of the folder to load data from, - * e.g. "cheeses" would load data from "data/modid/cheeses" for all modids. - * Can include subfolders, e.g. "cheeses/sharp" - * @param codec A codec that will be used to parse jsons. See
drullkus's codec primer for help on creating these. - * @param merger A merging function that uses a list of java-objects-that-were-parsed-from-json to create a final object. - * The list contains all successfully-parsed objects with the same ID from all mods and datapacks. - * (for a json located at "data/modid/folderName/name.json", the object's ID is "modid:name") - * As an example, consider vanilla's Tags: mods or datapacks can define tags with the same modid:name id, - * and then all tag jsons defined with the same ID are merged additively into a single set of items, etc - */ - public MergeableCodecDataManager(final String folderName, Codec codec, final Function, FINE> merger) { - this.folderName = folderName; - this.codec = codec; - this.merger = merger; - } - - /** - * @return The immutable map of data entries - */ - public Map getData() { - return this.data; - } - - /** Off-thread processing (can include reading files from hard drive) **/ - @Override - protected Map prepare(final ResourceManager resourceManager, final ProfilerFiller profiler) { - LOGGER.info("Beginning loading of data for data loader: {}", this.folderName); - final Map map = new HashMap<>(); - - Map> resourceStacks = new HashMap<>(); - resourceManager.listResources(this.folderName, id -> id.toDebugFileName().endsWith(JSON_EXTENSION)).forEach((location, resource) -> { - resourceStacks.put(location, resourceManager.getResourceStack(location)); - }); - - for (var entry : resourceStacks.entrySet()) { - List raws = new ArrayList<>(); - ResourceLocation fullId = entry.getKey(); - String fullPath = fullId.getPath(); // includes folderName/ and .json - ResourceLocation id = new ResourceLocation( - fullId.getNamespace(), - fullPath.substring(this.folderName.length() + 1, fullPath.length() - JSON_EXTENSION_LENGTH)); - - for (Resource resource : entry.getValue()) { - try (Reader reader = new InputStreamReader(resource.open())) { - JsonElement jsonElement = JsonParser.parseReader(reader); - this.codec.parse(JsonOps.INSTANCE, jsonElement) - .resultOrPartial(errorMsg -> LOGGER.error("Error deserializing json {} in folder {} from pack {}: {}", id, this.folderName, resource.sourcePackId(), errorMsg)) - .ifPresent(raws::add); - } catch (Exception e) { - LOGGER.error(String.format(Locale.ENGLISH, "Error reading resource %s in folder %s from pack %s: ", id, this.folderName, resource.sourcePackId()), e); - } - } - map.put(id, merger.apply(raws)); - } - - LOGGER.info("Data loader for {} loaded {} finalized objects", this.folderName, this.data.size()); - return ImmutableMap.copyOf(map); - } - - /** Main-thread processing, runs after prepare concludes **/ - @Override - protected void apply(final Map processedData, final ResourceManager resourceManager, final ProfilerFiller profiler) { - // now that we're on the main thread, we can finalize the data - this.data = processedData; - } - - /** - * This should be called at most once, during construction of your mod - * Calling this method automatically subscribes a packet-sender to {@link OnDatapackSyncEvent}. - * - * @param the packet type that will be sent on the given channel - * @param channel The networking channel of your mod - * @param packetFactory A packet constructor or factory method that converts the given map to a packet object to send on the given channel - * - * @return this manager object - */ - public MergeableCodecDataManager subscribeAsSyncable(final SimpleChannel channel, - final Function, PACKET> packetFactory) { - MinecraftForge.EVENT_BUS.addListener(this.getDatapackSyncListener(channel, packetFactory)); - return this; - } - - /** Generate an event listener function for the on-datapack-sync event **/ - private Consumer getDatapackSyncListener(final SimpleChannel channel, final Function, PACKET> packetFactory) { - return event -> { - ServerPlayer player = event.getPlayer(); - PACKET packet = packetFactory.apply(this.data); - PacketDistributor.PacketTarget target = player == null - ? PacketDistributor.ALL.noArg() - : PacketDistributor.PLAYER.with(() -> player); - channel.send(target, packet); - }; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/datapack/package-info.java b/src/main/java/com/github/manasmods/manascore/api/datapack/package-info.java deleted file mode 100644 index fd8a0810..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/datapack/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.datapack; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/permission/PermissionHelper.java b/src/main/java/com/github/manasmods/manascore/api/permission/PermissionHelper.java deleted file mode 100644 index 5ca17757..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/permission/PermissionHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.permission; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import lombok.RequiredArgsConstructor; -import net.minecraft.commands.CommandSourceStack; -import net.minecraftforge.server.permission.PermissionAPI; -import net.minecraftforge.server.permission.nodes.PermissionNode; -import net.minecraftforge.server.permission.nodes.PermissionTypes; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -@AvailableSince("1.0.0.0") -@RequiredArgsConstructor -public class PermissionHelper { - private final String modId; - - public boolean hasPermissionOrIsConsole(CommandSourceStack sourceStack, PermissionNode node) { - try { - return PermissionAPI.getPermission(sourceStack.getPlayerOrException(), node); - } catch (CommandSyntaxException e) { - return true; - } - } - - public boolean hasPermissonAndIsPlayer(CommandSourceStack sourceStack, PermissionNode node) { - try { - return PermissionAPI.getPermission(sourceStack.getPlayerOrException(), node); - } catch (CommandSyntaxException e) { - return false; - } - } - - public PermissionNode createNode(String node, boolean allowConsole, int permissionLevel) { - return new PermissionNode<>(modId, node, PermissionTypes.BOOLEAN, (player, playerUUID, context) -> { - if (player == null) return allowConsole; - return player.hasPermissions(permissionLevel); - }); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/permission/package-info.java b/src/main/java/com/github/manasmods/manascore/api/permission/package-info.java deleted file mode 100644 index cc0f9597..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/permission/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.permission; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/tab/AbstractInventoryTab.java b/src/main/java/com/github/manasmods/manascore/api/tab/AbstractInventoryTab.java deleted file mode 100644 index a5a0c008..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/tab/AbstractInventoryTab.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.tab; - -import com.github.manasmods.manascore.tab.IInventoryTab; -import com.github.manasmods.manascore.tab.TabPosition; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import lombok.Getter; -import lombok.Setter; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Tooltip; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -@AvailableSince("1.0.0.0") -public abstract class AbstractInventoryTab extends Button implements IInventoryTab { - protected static final int TAB_WIDTH = 28; - protected static final int TAB_HEIGHT = 32; - protected final Minecraft minecraft; - @Getter - @Setter - private TabPosition position; - - public AbstractInventoryTab(Tooltip tooltip) { - super(new Builder(Component.empty(), pButton -> { - AbstractInventoryTab tab = (AbstractInventoryTab) pButton; - tab.sendOpenContainerPacket(); - }) - .pos(0, 0) - .size(TAB_WIDTH, TAB_HEIGHT) - .tooltip(tooltip) - ); - this.minecraft = Minecraft.getInstance(); - } - - @Override - public void renderButton(PoseStack pPoseStack, int pMouseX, int pMouseY, float pPartialTick) { - RenderSystem.setShaderColor(1f, 1f, 1f, this.alpha); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - - this.renderBg(pPoseStack, minecraft, pMouseX, pMouseY); - this.renderIcon(pPoseStack, pMouseX, pMouseY, pPartialTick); - } - - protected abstract void renderIcon(PoseStack pPoseStack, int pMouseX, int pMouseY, float pPartialTick); - - @Override - protected void renderBg(PoseStack pPoseStack, Minecraft pMinecraft, int pMouseX, int pMouseY) { - RenderSystem.setShader(GameRenderer::getPositionTexShader); - this.position.bindTexture(); - float yOffset = this.isCurrent() ? TAB_HEIGHT : 0F; - blit(pPoseStack, this.getX(), this.getY(), TAB_WIDTH, TAB_HEIGHT, 0F, yOffset, TAB_WIDTH, TAB_HEIGHT - 1, TAB_WIDTH, TAB_HEIGHT * 2); - } - - public boolean isCurrent() { - return this.isCurrentScreen().test(minecraft.screen); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/tab/InventoryTabs.java b/src/main/java/com/github/manasmods/manascore/api/tab/InventoryTabs.java deleted file mode 100644 index 72439fed..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/tab/InventoryTabs.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.tab; - -import com.github.manasmods.manascore.api.tab.annotation.ScreenForTab; -import com.github.manasmods.manascore.tab.InventoryTabRegistry; -import net.minecraft.client.gui.screens.Screen; -import org.jetbrains.annotations.ApiStatus.AvailableSince; -import org.jetbrains.annotations.ApiStatus.NonExtendable; - -import javax.annotation.Nullable; -import java.util.Collection; -import java.util.Map; - -@AvailableSince("1.0.0.0") -@NonExtendable -public final class InventoryTabs { - /** - * Registers a {@link AbstractInventoryTab} instance to the Inventory Tab Registry. - */ - public static void registerTab(AbstractInventoryTab tab) { - InventoryTabRegistry.register(tab); - } - - public static Collection getRegisteredTabs() { - return InventoryTabRegistry.getValues(); - } - - public static Map getRegistryEntries() { - return InventoryTabRegistry.getEntries(); - } - - /** - * Returns the registered {@link AbstractInventoryTab} Object or null. - * The given {@link Screen} has be annotated with @{@link ScreenForTab} annotation to be able to find the {@link AbstractInventoryTab} in the registry. - */ - @Nullable - public static AbstractInventoryTab findByScreen(final Screen screen) { - return InventoryTabRegistry.findByScreen(screen); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/tab/annotation/ScreenForTab.java b/src/main/java/com/github/manasmods/manascore/api/tab/annotation/ScreenForTab.java deleted file mode 100644 index 14207b4a..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/tab/annotation/ScreenForTab.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.tab.annotation; - -import com.github.manasmods.manascore.api.tab.AbstractInventoryTab; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@AvailableSince("1.0.0.0") -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface ScreenForTab { - Class value(); -} diff --git a/src/main/java/com/github/manasmods/manascore/api/tab/annotation/package-info.java b/src/main/java/com/github/manasmods/manascore/api/tab/annotation/package-info.java deleted file mode 100644 index d7c09eb9..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/tab/annotation/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.tab.annotation; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/tab/package-info.java b/src/main/java/com/github/manasmods/manascore/api/tab/package-info.java deleted file mode 100644 index 2a449790..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/tab/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.tab; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/util/ItemComparator.java b/src/main/java/com/github/manasmods/manascore/api/util/ItemComparator.java deleted file mode 100644 index 813def1d..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/util/ItemComparator.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.github.manasmods.manascore.api.util; - -import net.minecraft.world.item.Item; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiFunction; - -@AvailableSince("1.0.2.0") -public class ItemComparator { - private final BiFunction[] tests; - - private ItemComparator(BiFunction[] tests) { - this.tests = tests; - } - - public int compare(T object1, T object2) { - for (BiFunction test : this.tests) { - int testResult = test.apply(object1, object2); - if (testResult != 0) return testResult; - } - - return 0; - } - - public static class Builder { - private final List> tests = new ArrayList<>(); - - private Builder(BiFunction initialTest) { - tests.add(initialTest); - } - - public static Builder first(BiFunction initialTest) { - return new Builder(initialTest); - } - - public static Builder firstInstancesOf(Class type) { - return new Builder<>((t, t2) -> { - if (type.isInstance(t) && !type.isInstance(t2)) return -1; - if (type.isInstance(t2) && !type.isInstance(t)) return 1; - return 0; - }); - } - - public Builder then(BiFunction test) { - tests.add(test); - return this; - } - - public Builder thenInstancesOf(Class type) { - tests.add((t, t2) -> { - if (type.isInstance(t) && !type.isInstance(t2)) return -1; - if (type.isInstance(t2) && !type.isInstance(t)) return 1; - return 0; - }); - - return this; - } - - public ItemComparator build() { - return new ItemComparator<>(this.tests.toArray(BiFunction[]::new)); - } - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/util/MethodsReturnNonnullByDefault.java b/src/main/java/com/github/manasmods/manascore/api/util/MethodsReturnNonnullByDefault.java deleted file mode 100644 index b52979fd..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/util/MethodsReturnNonnullByDefault.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.manasmods.manascore.api.util; - -import javax.annotation.Nonnull; -import javax.annotation.meta.TypeQualifierDefault; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Nonnull -@TypeQualifierDefault(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface MethodsReturnNonnullByDefault { -} diff --git a/src/main/java/com/github/manasmods/manascore/api/util/ReflectionUtils.java b/src/main/java/com/github/manasmods/manascore/api/util/ReflectionUtils.java deleted file mode 100644 index bea33e79..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/util/ReflectionUtils.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.util; - -import lombok.extern.log4j.Log4j2; -import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.Objects; - -@Log4j2 -public class ReflectionUtils { - @Nullable - public static RegistryObject getRegistryObjectFromField(AnnotationData annotationData, Field field, Class type) { - Objects.requireNonNull(type); - try { - field.setAccessible(true); - //noinspection unchecked - return (RegistryObject) field.get(null); // no check due to catch below - } catch (IllegalAccessException e) { - log.error("Could not load data from field {} in class {}", field.getName(), annotationData.clazz().getClassName()); - log.throwing(e); - } catch (ClassCastException e) { - log.error("Could not cast field {} in class {} to RegistryObject<{}> type", field.getName(), annotationData.clazz().getClassName(), type.getName()); - log.throwing(e); - } - - return null; - } - - @Nullable - public static DeferredRegister getDeferredRegisterFromField(AnnotationData annotationData, Field field, Class type) { - Objects.requireNonNull(type); - try { - field.setAccessible(true); - //noinspection unchecked - return (DeferredRegister) field.get(null); // no check due to catch below - } catch (IllegalAccessException e) { - log.error("Could not load data from field {} in class {}", field.getName(), annotationData.clazz().getClassName()); - log.throwing(e); - } catch (ClassCastException e) { - log.error("Could not cast field {} in class {} to RegistryObject<{}> type", field.getName(), annotationData.clazz().getClassName(), type.getName()); - log.throwing(e); - } - return null; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/util/StreamUtils.java b/src/main/java/com/github/manasmods/manascore/api/util/StreamUtils.java deleted file mode 100644 index c328f0cc..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/util/StreamUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.util; - -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; -import java.util.function.Predicate; - -public class StreamUtils { - public static Predicate distinctBy(Function keyExtractor) { - Set seen = ConcurrentHashMap.newKeySet(); - return t -> seen.add(keyExtractor.apply(t)); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/util/package-info.java b/src/main/java/com/github/manasmods/manascore/api/util/package-info.java deleted file mode 100644 index 057e7dca..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/util/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.util; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeBuilder.java b/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeBuilder.java deleted file mode 100644 index 1b50e726..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeBuilder.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.world.gen.biome; - -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import net.minecraft.sounds.Music; -import net.minecraft.util.Mth; -import net.minecraft.world.level.biome.AmbientMoodSettings; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSpecialEffects; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -import java.awt.Color; -import java.util.Optional; - -@AvailableSince("2.0.0.0") -@SuppressWarnings("unused") -@RequiredArgsConstructor -public class BiomeBuilder { - private final BiomeGenerationSettingsHelper generationSettingsHelper; - private final MobSpawnHelper mobSpawnHelper; - private final Biome.BiomeBuilder biomeBuilder = new Biome.BiomeBuilder(); - @Setter - private Biome.Precipitation rainType = Biome.Precipitation.RAIN; - private float temperature = 0.8F; - private float downfall = 0.4F; - private int waterColor = 4159204; - private int waterFogColor = 329011; - private int fogColor = 12638463; - private Music backgroundMusic = null; - private Optional grassColorOverride = Optional.empty(); - private BiomeSpecialEffects.GrassColorModifier grassColorModifier = BiomeSpecialEffects.GrassColorModifier.NONE; - - public BiomeBuilder grassColor(Color color) { - grassColorOverride = Optional.of(color.getRGB()); - return this; - } - - public BiomeBuilder grassModifier(BiomeSpecialEffects.GrassColorModifier grassColorModifier) { - this.grassColorModifier = grassColorModifier; - return this; - } - - public BiomeBuilder downfall(float downfall) { - this.downfall = downfall; - return this; - } - - public BiomeBuilder waterColor(Color color) { - this.waterColor = color.getRGB(); - return this; - } - - public BiomeBuilder waterFogColor(Color color) { - this.waterFogColor = color.getRGB(); - return this; - } - - public BiomeBuilder fogColor(Color color) { - this.fogColor = color.getRGB(); - return this; - } - - public BiomeBuilder backgroundMusic(Music music) { - this.backgroundMusic = music; - return this; - } - - public BiomeBuilder temperature(float temperature) { - this.temperature = temperature; - return this; - } - - public BiomeBuilder rain(Biome.Precipitation rainType) { - this.rainType = rainType; - return this; - } - - public Biome build() { - BiomeSpecialEffects.Builder specialEffects = new BiomeSpecialEffects.Builder() - .waterColor(waterColor) - .waterFogColor(waterFogColor) - .fogColor(fogColor) - .skyColor(calculateSkyColor(temperature)) - .ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS) - .backgroundMusic(backgroundMusic) - .grassColorModifier(grassColorModifier); - - this.grassColorOverride.ifPresent(specialEffects::grassColorOverride); - - return biomeBuilder - .precipitation(rainType) - .temperature(temperature) - .downfall(downfall) - .specialEffects(specialEffects.build()) - .mobSpawnSettings(mobSpawnHelper.finishMobSpawnSettings()) - .generationSettings(generationSettingsHelper.finishBiomeSettings()) - .build(); - } - - public static BiomeBuilder forest(BiomeGenerationSettingsHelper generationSettingsHelper, MobSpawnHelper mobSpawnHelper) { - return new BiomeBuilder(generationSettingsHelper, mobSpawnHelper) - .temperature(0.7F) - .downfall(0.8F); - } - - private static int calculateSkyColor(float p_194844_) { - float $$1 = p_194844_ / 3.0F; - $$1 = Mth.clamp($$1, -1.0F, 1.0F); - return Mth.hsvToRgb(0.62222224F - $$1 * 0.05F, 0.5F + $$1 * 0.1F, 1.0F); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeGenerationSettingsHelper.java b/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeGenerationSettingsHelper.java deleted file mode 100644 index 221a4bba..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/BiomeGenerationSettingsHelper.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.world.gen.biome; - -import lombok.RequiredArgsConstructor; -import net.minecraft.core.Holder; -import net.minecraft.core.HolderGetter; -import net.minecraft.world.level.biome.BiomeGenerationSettings; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -@AvailableSince("1.0.0.0") -@SuppressWarnings({"unused", "UnusedReturnValue"}) -@RequiredArgsConstructor -public class BiomeGenerationSettingsHelper { - private final BiomeGenerationSettings.Builder biomeGenSettings; - - public BiomeGenerationSettingsHelper(HolderGetter pPlacedFeatures, HolderGetter> pWorldCarvers) { - this.biomeGenSettings = new BiomeGenerationSettings.Builder(pPlacedFeatures, pWorldCarvers); - } - - public static BiomeGenerationSettingsHelper from(BiomeGenerationSettings.Builder biomeGenSettings) { - return new BiomeGenerationSettingsHelper(biomeGenSettings); - } - - public BiomeGenerationSettings.Builder toBuilder() { - return biomeGenSettings; - } - - public BiomeGenerationSettingsHelper apply(DefaultBiomeFeature defaultBiomeFeature) { - defaultBiomeFeature.apply(this.biomeGenSettings); - return this; - } - - public BiomeGenerationSettingsHelper apply(DefaultBiomeFeature defaultBiomeFeature, DefaultBiomeFeature... defaultBiomeFeatures) { - apply(defaultBiomeFeature); - - for (DefaultBiomeFeature feature : defaultBiomeFeatures) { - apply(feature); - } - - return this; - } - - public BiomeGenerationSettingsHelper addCarver(GenerationStep.Carving pCarving, Holder> pCarver) { - biomeGenSettings.addCarver(pCarving, pCarver); - return this; - } - - public BiomeGenerationSettingsHelper addFeature(GenerationStep.Decoration generationStep, Holder feature) { - biomeGenSettings.addFeature(generationStep, feature); - return this; - } - - public BiomeGenerationSettings finishBiomeSettings() { - return this.biomeGenSettings.build(); - } - - - @FunctionalInterface - public interface DefaultBiomeFeature { - void apply(BiomeGenerationSettings.Builder builder); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/MobSpawnHelper.java b/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/MobSpawnHelper.java deleted file mode 100644 index aeb271a8..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/MobSpawnHelper.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.api.world.gen.biome; - -import lombok.RequiredArgsConstructor; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.level.biome.MobSpawnSettings; -import org.jetbrains.annotations.ApiStatus.AvailableSince; - -@AvailableSince("1.0.0.0") -@SuppressWarnings({"unused", "UnusedReturnValue"}) -@RequiredArgsConstructor -public class MobSpawnHelper { - private final MobSpawnSettings.Builder mobSpawnSettings; - - public MobSpawnHelper() { - mobSpawnSettings = new MobSpawnSettings.Builder(); - } - - public static MobSpawnHelper from(MobSpawnSettings.Builder mobSpawnSettings) { - return new MobSpawnHelper(mobSpawnSettings); - } - - public MobSpawnSettings.Builder toBuilder() { - return mobSpawnSettings; - } - - public MobSpawnSettings finishMobSpawnSettings() { - return mobSpawnSettings.build(); - } - - public MobSpawnHelper apply(DefaultBiomeMobSpawnSettings defaultBiomeFeature) { - defaultBiomeFeature.apply(this.mobSpawnSettings); - return this; - } - - public MobSpawnHelper apply(DefaultBiomeMobSpawnSettings defaultBiomeFeature, DefaultBiomeMobSpawnSettings... defaultBiomeFeatures) { - apply(defaultBiomeFeature); - - for (DefaultBiomeMobSpawnSettings feature : defaultBiomeFeatures) { - apply(feature); - } - - return this; - } - - public MobSpawnHelper addSpawn(MobCategory category, EntityType entityType, int weight, int minCount, int maxCount) { - mobSpawnSettings.addSpawn(category, new MobSpawnSettings.SpawnerData(entityType, weight, minCount, maxCount)); - return this; - } - - @FunctionalInterface - public interface DefaultBiomeMobSpawnSettings { - void apply(MobSpawnSettings.Builder builder); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/package-info.java b/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/package-info.java deleted file mode 100644 index c249b373..00000000 --- a/src/main/java/com/github/manasmods/manascore/api/world/gen/biome/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.api.world.gen.biome; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java b/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java deleted file mode 100644 index 121914a8..00000000 --- a/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.attribute; - -import com.github.manasmods.manascore.ManasCore; -import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.event.entity.EntityAttributeModificationEvent; -import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import org.jetbrains.annotations.ApiStatus.Internal; - -@Internal -@Mod.EventBusSubscriber(modid = ManasCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) -public class ManasCoreAttributeHandler { - - @SubscribeEvent - public static void applyAttributesToEntities(final EntityAttributeModificationEvent e) { - e.add(EntityType.PLAYER, ManasCoreAttributes.JUMP_POWER.get()); - } - - @SubscribeEvent - public static void modifyJumpPower(final LivingJumpEvent e) { - if (e.getEntity().getAttribute(ManasCoreAttributes.JUMP_POWER.get()) == null) return; - - final LivingEntity entity = e.getEntity(); - final BlockPos entityPos = entity.blockPosition(); - //Calculation - double baseJumpPower = entity.getAttribute(ManasCoreAttributes.JUMP_POWER.get()).getValue(); - float blockModifier0 = entity.level.getBlockState(entityPos).getBlock().getJumpFactor(); - float blockModifier1 = entity.level.getBlockState(new BlockPos(entityPos.getX(), entity.getBoundingBox().minY - 0.5000001D, entityPos.getZ())).getBlock().getJumpFactor(); - double blockModifier = (double) blockModifier0 == 1.0D ? blockModifier1 : blockModifier0; - double jumpPower = baseJumpPower * blockModifier; - final double verticalVelocity = jumpPower + entity.getJumpBoostPower(); - //Apply velocity - Vec3 vec3 = entity.getDeltaMovement(); - entity.setDeltaMovement(vec3.x, verticalVelocity, vec3.z); - if (entity.isSprinting()) { - float f = entity.getYRot() * ((float) Math.PI / 180F); - entity.setDeltaMovement(entity.getDeltaMovement().add(-Mth.sin(f) * 0.2F, 0.0D, Mth.cos(f) * 0.2F)); - } - entity.hasImpulse = true; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributes.java b/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributes.java deleted file mode 100644 index 8858c91f..00000000 --- a/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributes.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.attribute; - -import com.github.manasmods.manascore.ManasCore; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.RangedAttribute; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.ApiStatus.Internal; - -@Internal -public class ManasCoreAttributes { - private static final DeferredRegister registry = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, ManasCore.MOD_ID); - public static final RegistryObject JUMP_POWER = registry.register("jump_power", () -> new RangedAttribute("manascore.attribute.max_aura.name", 0.42, 0, 800).setSyncable(true)); - - public static void register(final IEventBus modEventBus) { - registry.register(modEventBus); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/attribute/package-info.java b/src/main/java/com/github/manasmods/manascore/attribute/package-info.java deleted file mode 100644 index e612f62f..00000000 --- a/src/main/java/com/github/manasmods/manascore/attribute/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.attribute; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/client/gui/widget/InventoryTabSwitcherWidget.java b/src/main/java/com/github/manasmods/manascore/client/gui/widget/InventoryTabSwitcherWidget.java deleted file mode 100644 index 2f0fce48..00000000 --- a/src/main/java/com/github/manasmods/manascore/client/gui/widget/InventoryTabSwitcherWidget.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.client.gui.widget; - -import com.github.manasmods.manascore.api.tab.AbstractInventoryTab; -import com.github.manasmods.manascore.core.AbstractContainerScreenAccessor; -import com.github.manasmods.manascore.tab.TabPosition; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Renderable; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.ApiStatus.Internal; -import org.lwjgl.glfw.GLFW; - -import java.awt.*; -import java.util.TreeMap; - -@Internal -public class InventoryTabSwitcherWidget extends GuiComponent implements Renderable, GuiEventListener { - private int page = 1; - private final int maxPages; - private final Button prevButton, nextButton; - private final TreeMap tabs = new TreeMap<>(); - private final AbstractContainerScreen parent; - - public InventoryTabSwitcherWidget(AbstractContainerScreen parent, int maxPages) { - this.parent = parent; - this.maxPages = maxPages; - this.prevButton = Button.builder(Component.literal("<"), pButton -> { - page = Math.max(page - 1, 1); - updateTabs(); - }) - .pos(this.parent.getGuiLeft() - 20 - 2, this.parent.getGuiTop() - 20 - 2) - .size(20, 20) - .build(); - this.nextButton = Button.builder(Component.literal(">"), pButton -> { - page = Math.min(page + 1, this.maxPages); - updateTabs(); - }) - .pos(parent.getGuiLeft() + ((AbstractContainerScreenAccessor) parent).getImageWidth() + 2, this.parent.getGuiTop() - 20 - 2) - .size(20, 20) - .build(); - } - - @Override - public void render(PoseStack poseStack, int mouseX, int mouseY, float partialTicks) { - if (page > 1) { - this.prevButton.render(poseStack, mouseX, mouseY, partialTicks); - } - - if (maxPages > 1 && page != maxPages) { - this.nextButton.render(poseStack, mouseX, mouseY, partialTicks); - } - - if (maxPages > 1) { - drawCenteredString(poseStack, Minecraft.getInstance().font, this.page + " / " + this.maxPages, this.parent.width / 2, 2, Color.WHITE.getRGB()); - } - - this.tabs.values() - .stream() - .filter(AbstractInventoryTab::isActive) - .forEach(abstractInventoryTab -> abstractInventoryTab.render(poseStack, mouseX, mouseY, partialTicks)); - } - - public void updateTabs() { - this.tabs.forEach((integer, widget) -> { - int tabScreenIndex = integer; - while (tabScreenIndex > 12) { - tabScreenIndex -= 12; - } - - final int yOffset = 4; - final int xOffset = 1; - - switch (tabScreenIndex) { - case 1 -> { - widget.setX(parent.getGuiLeft()); - widget.setY(parent.getGuiTop() - widget.getHeight() + yOffset); - widget.setPosition(TabPosition.LEFT_TOP); - } - case 2, 3 -> { - widget.setX(parent.getGuiLeft() + widget.getWidth() * (tabScreenIndex - 1) + (xOffset * tabScreenIndex - 1) + 1); - widget.setY(parent.getGuiTop() - widget.getHeight() + yOffset); - widget.setPosition(TabPosition.TOP); - } - case 4, 5 -> { - widget.setX(parent.getGuiLeft() + widget.getWidth() * (tabScreenIndex - 1) + (xOffset * tabScreenIndex - 1) + 2); - widget.setY(parent.getGuiTop() - widget.getHeight() + yOffset); - widget.setPosition(TabPosition.TOP); - } - case 6 -> { - widget.setX(parent.getGuiLeft() + widget.getWidth() * (tabScreenIndex - 1) + (xOffset * tabScreenIndex - 1) + 3); - widget.setY(parent.getGuiTop() - widget.getHeight() + yOffset); - widget.setPosition(TabPosition.RIGHT_TOP); - } - case 7 -> { - widget.setX(parent.getGuiLeft()); - widget.setY(parent.getGuiTop() + ((AbstractContainerScreenAccessor) parent).getImageWidth() - yOffset - 11); - widget.setPosition(TabPosition.LEFT_BOT); - } - case 8, 9 -> { - widget.setX(parent.getGuiLeft() + widget.getWidth() * (tabScreenIndex - 7) + (xOffset * tabScreenIndex - 7) + 1); - widget.setY(parent.getGuiTop() + ((AbstractContainerScreenAccessor) parent).getImageWidth() - yOffset - 11); - widget.setPosition(TabPosition.BOT); - } - case 10, 11 -> { - widget.setX(parent.getGuiLeft() + widget.getWidth() * (tabScreenIndex - 7) + (xOffset * tabScreenIndex - 7) + 2); - widget.setY(parent.getGuiTop() + ((AbstractContainerScreenAccessor) parent).getImageWidth() - yOffset - 11); - widget.setPosition(TabPosition.BOT); - } - case 12 -> { - widget.setX(parent.getGuiLeft() + widget.getWidth() * (tabScreenIndex - 7) + (xOffset * tabScreenIndex - 7) + 3); - widget.setY(parent.getGuiTop() + ((AbstractContainerScreenAccessor) parent).getImageWidth() - yOffset - 11); - widget.setPosition(TabPosition.RIGHT_BOT); - } - } - - boolean isVisible = Math.ceil(integer / 12F) == this.page; - widget.active = isVisible; - }); - } - - public void addUpdateListener(int index, AbstractInventoryTab widget) { - tabs.put(index, widget); - updateTabs(); - } - - @Override - public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { - if (pButton == GLFW.GLFW_MOUSE_BUTTON_LEFT) { - this.tabs.values() - .stream() - .filter(AbstractInventoryTab::isActive) - .forEach(abstractInventoryTab -> abstractInventoryTab.mouseClicked(pMouseX, pMouseY, pButton)); - if (this.prevButton.isMouseOver(pMouseX, pMouseY)) this.prevButton.mouseClicked(pMouseX, pMouseY, pButton); - if (this.nextButton.isMouseOver(pMouseX, pMouseY)) this.nextButton.mouseClicked(pMouseX, pMouseY, pButton); - } - return false; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/client/gui/widget/package-info.java b/src/main/java/com/github/manasmods/manascore/client/gui/widget/package-info.java deleted file mode 100644 index ec9ceb0e..00000000 --- a/src/main/java/com/github/manasmods/manascore/client/gui/widget/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.client.gui.widget; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java b/src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java deleted file mode 100644 index 7b21dd31..00000000 --- a/src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.manasmods.manascore.client.keybinding; - -import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.client.keybinding.ManasKeybinding; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.client.event.RegisterKeyMappingsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import org.jetbrains.annotations.ApiStatus.Internal; - -import java.util.ArrayList; -import java.util.Arrays; - -@Internal -@Mod.EventBusSubscriber(modid = ManasCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) -public class KeybindingRegistry { - private static final ArrayList keybindings = new ArrayList<>(); - - @SubscribeEvent - public static void register(final RegisterKeyMappingsEvent e) { - keybindings.forEach(e::register); - } - - public static void register(ManasKeybinding... keybinding) { - keybindings.addAll(Arrays.asList(keybinding)); - } - - public static void checkKeybindings(final InputEvent.Key e) { - keybindings.forEach(keybinding -> { - if (keybinding.isDown()) { - keybinding.getAction().onPress(); - ManasCore.getLogger().debug("Pressed Keybinding {}", keybinding.getTranslatedKeyMessage().getString()); - } - }); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/client/keybinding/ManasKeybindingHandler.java b/src/main/java/com/github/manasmods/manascore/client/keybinding/ManasKeybindingHandler.java deleted file mode 100644 index 9bed6036..00000000 --- a/src/main/java/com/github/manasmods/manascore/client/keybinding/ManasKeybindingHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.manasmods.manascore.client.keybinding; - -import com.github.manasmods.manascore.ManasCore; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import org.jetbrains.annotations.ApiStatus.Internal; - -@Internal -@Mod.EventBusSubscriber(modid = ManasCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) -public class ManasKeybindingHandler { - @SubscribeEvent - public static void onKeyInput(final InputEvent.Key e) { - KeybindingRegistry.checkKeybindings(e); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/client/keybinding/package-info.java b/src/main/java/com/github/manasmods/manascore/client/keybinding/package-info.java deleted file mode 100644 index 426df4de..00000000 --- a/src/main/java/com/github/manasmods/manascore/client/keybinding/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.client.keybinding; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/core/AbstractContainerScreenAccessor.java b/src/main/java/com/github/manasmods/manascore/core/AbstractContainerScreenAccessor.java deleted file mode 100644 index d49df9b9..00000000 --- a/src/main/java/com/github/manasmods/manascore/core/AbstractContainerScreenAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.manasmods.manascore.core; - -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import org.jetbrains.annotations.ApiStatus.Internal; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Internal -@Mixin(AbstractContainerScreen.class) -public interface AbstractContainerScreenAccessor { - @Accessor - int getImageWidth(); -} diff --git a/src/main/java/com/github/manasmods/manascore/core/BlockLootSubProviderAccessor.java b/src/main/java/com/github/manasmods/manascore/core/BlockLootSubProviderAccessor.java deleted file mode 100644 index d61cfd5c..00000000 --- a/src/main/java/com/github/manasmods/manascore/core/BlockLootSubProviderAccessor.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.manasmods.manascore.core; - -import net.minecraft.data.loot.BlockLootSubProvider; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(BlockLootSubProvider.class) -public interface BlockLootSubProviderAccessor { - - @Accessor("NORMAL_LEAVES_SAPLING_CHANCES") - static float[] getNormalLeavesSaplingChances() { - throw new AssertionError("Could not access NORMAL_LEAVES_SAPLING_CHANCES in Block Loot class"); - } - - @Accessor("NORMAL_LEAVES_STICK_CHANCES") - static float[] getNormalStickChances() { - throw new AssertionError("Could not access NORMAL_LEAVES_SAPLING_CHANCES in Block Loot class"); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/core/ShapedRecipeBuilderAccessor.java b/src/main/java/com/github/manasmods/manascore/core/ShapedRecipeBuilderAccessor.java deleted file mode 100644 index 64b3073d..00000000 --- a/src/main/java/com/github/manasmods/manascore/core/ShapedRecipeBuilderAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.manasmods.manascore.core; - -import net.minecraft.advancements.Advancement; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import org.jetbrains.annotations.ApiStatus.Internal; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Internal -@Mixin(ShapedRecipeBuilder.class) -public interface ShapedRecipeBuilderAccessor { - @Accessor - Advancement.Builder getAdvancement(); -} diff --git a/src/main/java/com/github/manasmods/manascore/core/VanillaBlockLootAccessor.java b/src/main/java/com/github/manasmods/manascore/core/VanillaBlockLootAccessor.java deleted file mode 100644 index 6b549bbd..00000000 --- a/src/main/java/com/github/manasmods/manascore/core/VanillaBlockLootAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.manasmods.manascore.core; - -import net.minecraft.data.loot.packs.VanillaBlockLoot; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(VanillaBlockLoot.class) -public interface VanillaBlockLootAccessor { - @Accessor("JUNGLE_LEAVES_SAPLING_CHANGES") - static float[] getJungleLeavesSaplingChances() { - throw new AssertionError("Could not access NORMAL_LEAVES_SAPLING_CHANCES in Block Loot class"); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/package-info.java b/src/main/java/com/github/manasmods/manascore/package-info.java deleted file mode 100644 index 57ed5894..00000000 --- a/src/main/java/com/github/manasmods/manascore/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/tab/IInventoryTab.java b/src/main/java/com/github/manasmods/manascore/tab/IInventoryTab.java deleted file mode 100644 index 75cdb1a6..00000000 --- a/src/main/java/com/github/manasmods/manascore/tab/IInventoryTab.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.tab; - -import com.github.manasmods.manascore.api.tab.AbstractInventoryTab; -import net.minecraft.client.gui.screens.Screen; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.ApiStatus.Internal; - -import java.util.function.Predicate; - -@Internal -public interface IInventoryTab { - void sendOpenContainerPacket(); - - @OnlyIn(Dist.CLIENT) - default Predicate isCurrentScreen() { - return screen -> { - AbstractInventoryTab tab = InventoryTabRegistry.findByScreen(screen); - return tab != null && tab.equals(this); - }; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/tab/InventoryTabHandler.java b/src/main/java/com/github/manasmods/manascore/tab/InventoryTabHandler.java deleted file mode 100644 index 1ec61101..00000000 --- a/src/main/java/com/github/manasmods/manascore/tab/InventoryTabHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.tab; - -import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.tab.AbstractInventoryTab; -import com.github.manasmods.manascore.client.gui.widget.InventoryTabSwitcherWidget; -import com.github.manasmods.manascore.api.tab.annotation.ScreenForTab; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.ScreenEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import org.jetbrains.annotations.ApiStatus.Internal; - -import java.util.Map; - -@Internal -@Mod.EventBusSubscriber(modid = ManasCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) -public class InventoryTabHandler { - - @SubscribeEvent - public static void onOpenTabMenu(final ScreenEvent.Init e) { - if (!isValidTabScreen(e.getScreen())) return; - if (!(e.getScreen() instanceof AbstractContainerScreen containerScreen)) return; - - final Map tabRegistryEntries = InventoryTabRegistry.getEntries(); - InventoryTabSwitcherWidget tabSwitcherWidget = new InventoryTabSwitcherWidget(containerScreen, (int) Math.round(Math.ceil(tabRegistryEntries.size() / 12F))); - - tabRegistryEntries.forEach(tabSwitcherWidget::addUpdateListener); - tabSwitcherWidget.updateTabs(); - e.addListener(tabSwitcherWidget); - } - - private static boolean isValidTabScreen(Screen screen) { - if (screen instanceof InventoryScreen) return true; - return screen.getClass().isAnnotationPresent(ScreenForTab.class); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/tab/InventoryTabRegistry.java b/src/main/java/com/github/manasmods/manascore/tab/InventoryTabRegistry.java deleted file mode 100644 index b31264db..00000000 --- a/src/main/java/com/github/manasmods/manascore/tab/InventoryTabRegistry.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.tab; - -import com.github.manasmods.manascore.api.tab.AbstractInventoryTab; -import com.github.manasmods.manascore.api.tab.annotation.ScreenForTab; -import lombok.Getter; -import net.minecraft.client.gui.screens.Screen; -import org.jetbrains.annotations.ApiStatus.Internal; - -import javax.annotation.Nullable; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.TreeMap; - -@Internal -public class InventoryTabRegistry { - @Getter - private static int nextEntryId = 1; - private static final TreeMap registeredTabs = new TreeMap<>(); - - public static void register(AbstractInventoryTab tab) { - registeredTabs.put(nextEntryId++, tab); - } - - public static Collection getValues() { - return registeredTabs.values(); - } - - public static Map getEntries() { - return Map.copyOf(registeredTabs); - } - - @Nullable - public static AbstractInventoryTab findByScreen(Screen screen) { - if (!screen.getClass().isAnnotationPresent(ScreenForTab.class)) return null; - ScreenForTab annotation = screen.getClass().getAnnotation(ScreenForTab.class); - Optional result = getValues().stream() - .filter(abstractInventoryTab -> annotation.value().isInstance(abstractInventoryTab)) - .findFirst(); - - return result.orElse(null); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/tab/ManasCoreInventoryTabs.java b/src/main/java/com/github/manasmods/manascore/tab/ManasCoreInventoryTabs.java deleted file mode 100644 index 4f8d5db4..00000000 --- a/src/main/java/com/github/manasmods/manascore/tab/ManasCoreInventoryTabs.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.tab; - -import com.github.manasmods.manascore.ManasCore; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import org.jetbrains.annotations.ApiStatus.Internal; - -@Internal -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = ManasCore.MOD_ID, value = Dist.CLIENT) -public class ManasCoreInventoryTabs { - @SubscribeEvent - public static void onClientInit(final FMLClientSetupEvent e) { - InventoryTabRegistry.register(new VanillaInventoryTab()); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/tab/TabPosition.java b/src/main/java/com/github/manasmods/manascore/tab/TabPosition.java deleted file mode 100644 index 4c2b4105..00000000 --- a/src/main/java/com/github/manasmods/manascore/tab/TabPosition.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.tab; - -import com.github.manasmods.manascore.ManasCore; -import com.mojang.blaze3d.systems.RenderSystem; -import lombok.AllArgsConstructor; -import lombok.Getter; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.ApiStatus.Internal; - -@Internal -@AllArgsConstructor -public enum TabPosition { - LEFT_TOP(new ResourceLocation(ManasCore.MOD_ID, "textures/gui/tabs/top-left.png"), false), - TOP(new ResourceLocation(ManasCore.MOD_ID, "textures/gui/tabs/top.png"), false), - RIGHT_TOP(new ResourceLocation(ManasCore.MOD_ID, "textures/gui/tabs/top-right.png"), false), - LEFT_BOT(new ResourceLocation(ManasCore.MOD_ID, "textures/gui/tabs/bot-left.png"), true), - BOT(new ResourceLocation(ManasCore.MOD_ID, "textures/gui/tabs/bot.png"), true), - RIGHT_BOT(new ResourceLocation(ManasCore.MOD_ID, "textures/gui/tabs/bot-right.png"), true); - - private final ResourceLocation tabLocation; - @Getter - private final boolean bottom; - - public void bindTexture() { - RenderSystem.setShaderTexture(0, this.tabLocation); - } - - public boolean isTop() { - return !this.bottom; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/tab/VanillaInventoryTab.java b/src/main/java/com/github/manasmods/manascore/tab/VanillaInventoryTab.java deleted file mode 100644 index 757d1c14..00000000 --- a/src/main/java/com/github/manasmods/manascore/tab/VanillaInventoryTab.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2022. ManasMods - */ - -package com.github.manasmods.manascore.tab; - -import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.tab.AbstractInventoryTab; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.components.Tooltip; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Blocks; -import org.jetbrains.annotations.ApiStatus.Internal; - -import java.util.function.Predicate; - -@Internal -public class VanillaInventoryTab extends AbstractInventoryTab { - private final ItemStack iconStack = new ItemStack(Blocks.GRASS_BLOCK); - - public VanillaInventoryTab() { - super(Tooltip.create(Component.translatable("key.categories.inventory"))); - } - - @Override - protected void renderIcon(PoseStack pPoseStack, int pMouseX, int pMouseY, float pPartialTick) { - minecraft.getItemRenderer().renderAndDecorateFakeItem(this.iconStack, this.getX() + 6, this.getY() + 8); - } - - @Override - public void sendOpenContainerPacket() { - if (minecraft.player == null) { - ManasCore.getLogger().fatal("Local Player is null!?"); - return; - } - - minecraft.setScreen(new InventoryScreen(minecraft.player)); - } - - @Override - public Predicate isCurrentScreen() { - return screen -> screen instanceof InventoryScreen; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/tab/package-info.java b/src/main/java/com/github/manasmods/manascore/tab/package-info.java deleted file mode 100644 index 7395d651..00000000 --- a/src/main/java/com/github/manasmods/manascore/tab/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package com.github.manasmods.manascore.tab; - -import com.github.manasmods.manascore.api.util.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 0cb59d0d..00000000 --- a/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,32 +0,0 @@ -modLoader = "javafml" #mandatory -loaderVersion = "${forgeLoaderVersion}" -license = "GPL-3" -issueTrackerURL = "https://github.com/ManasMods/ManasCore/issues" #optional -[[mods]] #mandatory -modId = "${modId}" #mandatory -version = "${modVersion}" -displayName = "ManasCore" #mandatory -updateJSONURL="https://api.modrinth.com/updates/wRRSWpd1/forge_updates.json" #optional -displayURL="https://github.com/ManasMods/ManasCore/wiki" #optional -logoFile="logo.jpg" #optional -#credits="Thanks for this example mod goes to Java" #optional -authors = "ManasMods" #optional -description = ''' -Utility and Core Library for Manas Mods -''' -#@formatter:off -[[dependencies.manascore]] #optional - modId="forge" #mandatory - mandatory=true #mandatory - versionRange="${forgeLoaderVersion}" #mandatory - ordering="NONE" - side="BOTH" -# Here's another dependency -[[dependencies.manascore]] - modId="minecraft" - mandatory=true - # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="${minecraftVersionCheck}" - ordering="NONE" - side="BOTH" -##@formatter:on \ No newline at end of file diff --git a/src/main/resources/assets/manascore/models/block/grass_like_inner_stairs.json b/src/main/resources/assets/manascore/models/block/grass_like_inner_stairs.json deleted file mode 100644 index 364eff63..00000000 --- a/src/main/resources/assets/manascore/models/block/grass_like_inner_stairs.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, - "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up" }, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 8, 8 ], - "to": [ 8, 16, 16 ], - "faces": { - "up": { "uv": [ 0, 8, 8, 16 ], "texture": "#top", "cullface": "up" }, - "north": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, - "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "west" } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/grass_like_outer_stairs.json b/src/main/resources/assets/manascore/models/block/grass_like_outer_stairs.json deleted file mode 100644 index 94fd6f71..00000000 --- a/src/main/resources/assets/manascore/models/block/grass_like_outer_stairs.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 8 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 8 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 8 ], "texture": "#top" }, - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 8 ], - "to": [ 8, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 8, 8 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 0, 0, 8, 8 ], "texture": "#top" }, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 8, 8 ], - "to": [ 16, 16, 16 ], - "faces": { - "up": { "uv": [ 8, 8, 16, 16 ], "texture": "#top", "cullface": "up" }, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, - "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 0, 8 ], - "to": [ 16, 8, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#bottom" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#bottom", "cullface": "south" }, - "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#bottom" }, - "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#bottom", "cullface": "east" }, - "down": { "uv": [ 0, 0, 8, 8 ], "texture": "#bottom", "cullface": "down" } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/grass_like_slab.json b/src/main/resources/assets/manascore/models/block/grass_like_slab.json deleted file mode 100644 index 64eae4eb..00000000 --- a/src/main/resources/assets/manascore/models/block/grass_like_slab.json +++ /dev/null @@ -1,18 +0,0 @@ -{ "parent": "block/block", - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top"}, - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/grass_like_slab_top.json b/src/main/resources/assets/manascore/models/block/grass_like_slab_top.json deleted file mode 100644 index 9104b09f..00000000 --- a/src/main/resources/assets/manascore/models/block/grass_like_slab_top.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "cullface": "up"}, - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/grass_like_stairs.json b/src/main/resources/assets/manascore/models/block/grass_like_stairs.json deleted file mode 100644 index 6a60cb61..00000000 --- a/src/main/resources/assets/manascore/models/block/grass_like_stairs.json +++ /dev/null @@ -1,55 +0,0 @@ -{ "parent": "block/block", - "display": { - "gui": { - "rotation": [ 30, 135, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.625, 0.625, 0.625 ] - }, - "head": { - "rotation": [ 0, -90, 0 ], - "translation": [ 0, 0, 0 ], - "scale": [ 1, 1, 1 ] - }, - "thirdperson_lefthand": { - "rotation": [ 75, -135, 0 ], - "translation": [ 0, 2.5, 0], - "scale": [ 0.375, 0.375, 0.375 ] - } - }, - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 8, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up" }, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, - "north": { "uv": [ 8, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 8, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up"}, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/overlay_inner_stairs.json b/src/main/resources/assets/manascore/models/block/overlay_inner_stairs.json deleted file mode 100644 index 88423dce..00000000 --- a/src/main/resources/assets/manascore/models/block/overlay_inner_stairs.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "tintindex": 0 }, - "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up", "tintindex": 0 }, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 8, 8 ], - "to": [ 8, 16, 16 ], - "faces": { - "up": { "uv": [ 0, 8, 8, 16 ], "texture": "#top", "cullface": "up", "tintindex": 0 }, - "north": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, - "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "west" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#overlay", "cullface": "north", "tintindex": 0 }, - "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#overlay", "cullface": "west", "tintindex": 0 }, - "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#overlay", "cullface": "east", "tintindex": 0 } - } - }, - { "from": [ 8, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#overlay", "cullface": "north", "tintindex": 0 }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "tintindex": 0 }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "east", "tintindex": 0 } - } - }, - { "from": [ 0, 8, 8 ], - "to": [ 8, 16, 16 ], - "faces": { - "north": { "uv": [ 8, 0, 16, 8 ], "texture": "#overlay", "tintindex": 0 }, - "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#overlay", "cullface": "west", "tintindex": 0 } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/overlay_outer_stairs.json b/src/main/resources/assets/manascore/models/block/overlay_outer_stairs.json deleted file mode 100644 index cb54a711..00000000 --- a/src/main/resources/assets/manascore/models/block/overlay_outer_stairs.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "tintindex": 0 }, - "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 8, 8 ], - "to": [ 16, 16, 16 ], - "faces": { - "up": { "uv": [ 8, 8, 16, 16 ], "texture": "#top", "cullface": "up", "tintindex": 0 }, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, - "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "north", "tintindex": 0 }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "west", "tintindex": 0 }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "east", "tintindex": 0 } - } - }, - { "from": [ 8, 8, 8 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#overlay", "tintindex": 0 }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#overlay", "tintindex": 0 }, - "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#overlay", "cullface": "east", "tintindex": 0 } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/overlay_slab.json b/src/main/resources/assets/manascore/models/block/overlay_slab.json deleted file mode 100644 index 1d4fdabe..00000000 --- a/src/main/resources/assets/manascore/models/block/overlay_slab.json +++ /dev/null @@ -1,27 +0,0 @@ -{ "parent": "block/block", - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "tintindex": 0 }, - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "north", "tintindex": 0 }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "west", "tintindex": 0 }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "east", "tintindex": 0 } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/overlay_slab_top.json b/src/main/resources/assets/manascore/models/block/overlay_slab_top.json deleted file mode 100644 index b2935e96..00000000 --- a/src/main/resources/assets/manascore/models/block/overlay_slab_top.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "cullface": "up", "tintindex": 0 }, - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "north", "tintindex": 0 }, - "south": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "west", "tintindex": 0 }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "east", "tintindex": 0 } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/models/block/overlay_stairs.json b/src/main/resources/assets/manascore/models/block/overlay_stairs.json deleted file mode 100644 index a6658499..00000000 --- a/src/main/resources/assets/manascore/models/block/overlay_stairs.json +++ /dev/null @@ -1,72 +0,0 @@ -{ "parent": "block/block", - "display": { - "gui": { - "rotation": [ 30, 135, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.625, 0.625, 0.625 ] - }, - "head": { - "rotation": [ 0, -90, 0 ], - "translation": [ 0, 0, 0 ], - "scale": [ 1, 1, 1 ] - }, - "thirdperson_lefthand": { - "rotation": [ 75, -135, 0 ], - "translation": [ 0, 2.5, 0], - "scale": [ 0.375, 0.375, 0.375 ] - } - }, - "textures": { - "particle": "#side" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 8, 8, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 8, 16 ], "texture": "#top", "cullface": "down", "tintindex": 0 }, - "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "tintindex": 0 }, - "north": { "uv": [ 0, 8, 8, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 0, 8, 8, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 0, 0 ], - "to": [ 16, 8, 16 ], - "faces": { - "down": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "down", "tintindex": 0 }, - "north": { "uv": [ 8, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 8, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 8, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up", "tintindex": 0 }, - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 8, 8, 16 ], - "faces": { - "north": { "uv": [ 8, 0, 16, 8 ], "texture": "#overlay", "cullface": "north", "tintindex": 0 }, - "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "west", "tintindex": 0 } - } - }, - { "from": [ 8, 8, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#overlay", "cullface": "north", "tintindex": 0 }, - "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#overlay", "cullface": "south", "tintindex": 0 }, - "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "west", "tintindex": 0 }, - "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#overlay", "cullface": "east", "tintindex": 0 } - } - } - ] -} diff --git a/src/main/resources/assets/manascore/textures/gui/tabs/bot-left.png b/src/main/resources/assets/manascore/textures/gui/tabs/bot-left.png deleted file mode 100644 index 09c4392724fb96f49b70c4e23e57c5cbf6df2156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1964 zcmb_dTWB0r7+w)eO{j_$TSB12w3cc*J7>=9%WGp_K9uVqn9`RXpl$@Z;kF-5+_f= z;-j5d8(~%is$C!I zUaZy)dU1k?$t~*1N)kmrb%3@Nln8!nblaGxnTfUCB}MH9`c~duc12LUSj}a zTP(&l*5y*K$0mYsauM9<1!P@xP+IbsJjVjw@GUmE2sC#_-gqSEGa7Qg#Cffsso6ed z0pny!*mJ~jZQcy-9}r-98nUbyWld6$q-Z5YBWi|VbqryGP#0R{wo_h;p^#c#LPiNA zqNGS_Efi|TrXjr{*tSTS`*jKqJ9S!NvgcMrAr2$S@f!ERFtAex*9*Datk26%4K{+g zsRKe`GN&sUU6*iD>Ci0}Nx=<5>RPOj&x#P7q~q9xT1Z2wj3(Jk(x9ji?0r@;1n))0UxN5H%HKN;sX$NT$U!sjQirM$K}@wC%q9A>V-> zq_vyY6Ln@(J7n4kAgfEg);Y|c?0wZ7p;Ip4R@4Sr(TeiVfI)ZJStkM;^Pnr=tTIq~ zox1440$vWA)MpbFh}I43PQDiTfG%F2x@qdFszH(sJ*`VRPMMNvLh_JeF=nU;o8{Q` znEF7SqBK#Ieo1eXx;EG{T_LMV-3o(4RTgjFnT=KARe2b2W=+%mf6mC!QQECA`Rd~9 z>ktOU_!l8$WN5!KmPT?BSXi8yN*%grqlpP{>_i(X<>3E KfA+u=&-@4P?s*9S diff --git a/src/main/resources/assets/manascore/textures/gui/tabs/bot-right.png b/src/main/resources/assets/manascore/textures/gui/tabs/bot-right.png deleted file mode 100644 index 19396697c928fa9d66503352f37a46fecaa7516a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1965 zcmb_dU5Fb+9M4raueB#t>jzbE*(#@ao1K~LM|QY)%_Y|+(45Czr01KnyOU(O?9RHo zx#SM~z`iI#X^T&_57GxM+A4kU#UgDL5A{Kc4@LUY2M;WQ_##pi!P$H)X}PvXF|gU$ zncx5W_n-f}^K%ErckJ1bN~OljrQ!mAKgFMYW25|kd;ak!;+J1~B}}CrcqD#CQYTLG z&CzpCbtzh^9K;rL)5K;bO?O5fmVWf}=4tvg;${NwxuQE=>>cu1{)ieI1& zr?eK(#kIMrwYF>-wmAKwFxA0aflDJIblj#F;!aNN>cxB=Z_A?4g+$9aF&`TgmMZf? zfdy31(@?Si0D^9$b)plL(Iy215R^eyhDZVcBNZbc^nW5Z7uYqtP~6`)#=ml6BZ_=1 z%k6eM-Oi+0P?w=$7&1UILJ~(v;i?yrj^u@V2O5erv;xPE9OenJMq;v7loPqDy%=0S zQR{{MJn@Xl9pcL{4dR%(K-)@iek*8pjoX$?o7AOV6ml#~uzrI@ENrmbs7{V=GQe|N zsU$Ww^~H4)6Ja#F!o%n%WK(olUG=HFKtt9FEIPZw-P{{T!+Vf4 z?^#dWnK5^8$q9K?SNpBANMGx(nvT$=3no_F2077+>rZX5zwK<2fvrW*Q`>G(uJjJP z=)po(i`pch`8veWJ;g;zMSq1k74qy-;8W)G(W{^E33aMm%vYDb`Tb}3;9Fqlef!@0>GR(% z{CyTYyK9#0)rr diff --git a/src/main/resources/assets/manascore/textures/gui/tabs/bot.png b/src/main/resources/assets/manascore/textures/gui/tabs/bot.png deleted file mode 100644 index f96dd77cf6809decfe6ea88d065b1052305a9f37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1963 zcmb_dU1%Id9KW4jRFS%+1c;ExFrS zcQ?69`eFqi`XGXcl`2vY1WOU}AR>xN>x(bGSkadtmU9ACMz@)%CzFR8S%GIzYqn-%82KZ1yJy^ zwCc=m_;hh&u0%Fgh-rzZpA}9u5m!*BAr_kTnj4^IMr`Rtd>w5oqR@hbD;aSrGAJw+ z7KAMGsgRaci2wkEv?-@?8bd90Qh)%e3NREEN&q03L=Xs_pUBPmmW_(JvmImnDHWBIJJNliE-YlUuzk+h(c?$PTerzST)9aRTi?K%I=~%KHg=3 z$F@+2ZS3hwy&jtg!s#_mqZ5!l(Lrh5qe_tmY}F@pdX2j|9=&Mp=_oAgRfcnnaq3pmqX41V9^FV3uRA$55WylmyZx z2#~6yq`C{rYsSJMzAxA!$Yy>WbHYv?SE%B-6;X)8h_bB4d~TR~r}ggVv)Kio*-nig z1jU&%LVh}%Qq5FKg0k9jw@^TNHwdvyXg-$_d2nRMu~5L_K3j#7_`+ks+23e zM_sgG0kgvf_UTlGN9(?Ir`*l?0I%KKbzr5fq+t_DC8i;1RJSF=<}1@OEVB$v%^-T0 zdhB{nodO-{scxO_*Y#v?%d~|^6}uJ6FI7c+a5DR=#5?lPLuOag{eNVX=qhbjm~v{b6(XD=>6$QvUjb z&n|smzIYwks_QKd3*ZuzdTSEsvf3p9|)sNmhc67R!cnmCm`BLA(fw9D) zl^yNR*RnHLZ=Bs4&4-6?4d!*@kMc7pBu8&Au6=i5{Nrz)zBT{u-{)DuK635t$=8QJ z*)m>v^}>(eULQWPJ<--PG|Ck|we$1H_Ih=zeDmL*ei?ah;jfYH1B18!**w0yb21vI N`RTdbhi8^w{tqHKGpOVa(n z1)Y^_rFjBV9xBA+E>lKfEYOm4=*TE0bd_bmW!)gE%70(FDuckQ%BRas)QoGa7c8wO z?9}>lhpw+u+mnwR28TviCrfzII*u|jf>FAEuEAj`O@cTJcm#5d#N~smDhsMpAHuj$8>O>2 ziHNBq604ema-SwZj~2Likn|_UJ*u)k3t5z<0;?6+xW_Y|_V^B}i|hXw5V37G3me;V z3B$rfn$_2Y8?%6Hi%vV^n5k`+@p>nb>kq?F+x*llY4{0CVBqYM&AS7L;#!*)WMHq37_jw`=3wFll^G2=KO1K~N#YNgab`&(~HB+-q z6Y7dKq1$ZYMwDhGqO9RmWf2@D2s~_1pXoL!L!VkMbSotrR;-E-E!RMX>z63A3wejr zL0$rLc~8hwvtnu{GNA5yCamZs23?(6&?}dG>QY}LzBjl3N)m`3B>n%bC-2O>cJNY= zimZ-jt#gXKG28V6Few*IXx;`@ndbRtg2D7S*d_wI^I$4J>@lJA4s|hwrQFYkBw>qP z5v{w{ow^hGl&syE`tFjqh5Al)x?Aey%`Gz(qCFCInHZ|7oI9iD(`T9#b!)yRcbg{F z94^LRzAXl?_$Wp@|8JzKC=u!u@XeemBTGs$MN8E>!N?Vh~__dK=>cUB)d$;|G?+ho!t zd%Jg~Q0j}NZ^a6VKKY;pkt(Q&f)*e8AQlRWAcBJRQS4jmgW_a&6R*ehdK3qeOftXk z`+ncQe5V)Y5AB(FXhM>tJ+--NLp&cA*VH{b#J%JlKQA7;!nqe?NxFAmdfg?x_4a;A z+Bxktmy)IW^VsFSN+@@jI`Bh*mZZspgOIq(ERh}7_JXqV=NDfovPa9xqFIOau);dt z+*-sAugy2zwPn|)%E2jla)5;bpCv>d_}w7JgR(Nzi^V?utSRykk}Q{%>C~XSR9}!Q zJYuq?BH%&@Wy@AAViDaaJ}v7|M;a_?NCyyN-NZVS$4e3BBHF@@>T_db;;pQ7k|e~M z*6;V#zM=A{ts&dCHK=R44g>}Ri;_zNlRs_|N4}O@d z4dQW}M8vcK2{oj`)Tbekx;ZZFMctus>T0aZd=@0Jz@i)*c6h?$4!?!!{P-pVBDVE< zZevp}zMq?jli3yF#yB9GqT}Xj$g~EFc`tI=?24dyAoV81m57mqM@`PVS*8{;%CfGj z1^MwsFQB|1Ke0}LRY}6iN}4r*AV6jlnb@$gZaf8b4B-e`=hSPh=1`H^B7jy?hZrJ^ zN;g48%}|n%+k&Z!TRifKaM<%nn`vRtR^&X4xWc^*XKvaY6!@)v9Gh1V{BeiY*H&Hn9l>JWO8O*X(`}Kx+xCHWEAlZ} z*_t{bhC?Amph!z5pnAap1UU>8ouXyhHf%B7&Rox_XMKZgY?d(8v%c9bb#r|SkA&O~ z3EE8jZ7jaw*}5^1RkD~Z={BEg;w7JpED&*u z#MHb0?AeQAVxFi~r<+UP{P822IQi`E>Xn!E_kKG5`;m_t-(QeF-Ut5qy7|(VuMp== z@10LpuD$-ir;nZc{N3}H_y2b4jY~iDt|!;;KIfbquSbqvy5aBq?t=$^z7kxxd?GmW z+3DB*^7roj_L;wLOzgfdTi15I|LDbEUVZYa_3MsfSC1^xX6H;gyKA%a)emQmp86N) CewF(G diff --git a/src/main/resources/assets/manascore/textures/gui/tabs/top.png b/src/main/resources/assets/manascore/textures/gui/tabs/top.png deleted file mode 100644 index 45b139f64920b35158834bee28006115de878c1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1721 zcmbVNO^Do79FJgSTdfERZc7g#J^0Zkd3l+SXzJvQDN!stsHWtMDkhqUe-6ft@uyIMe_Qtc%q>^;^{rP=|^u~p0N!s&E z&|1ot+@}!Xp@u2e)()bY^5>P$6gi+Z43AL}DQ5V8!*{jeLQs9#ftyhyC`ZC#OvkZh%<%;XB?C3jw~^MuJ& z%}@ydK(5+a6<0AdD@SDrprHdxH=qgtf@K7OJiZj6E}=eJXgo1iCcbJ)C(B}_>%Cr2 z>zNu)+PY!ewho{Up(+q+I*2mdSEKasgrUJwk_2%U@JP-XvBy`lnj%ac`4GkhZIq7V zBqFBwajY8}$bA|DDJgLAYSJAlr$lF67P2Ty1=c9AaffF-?eHC_i{l##yB9`qSMwOX8Hn4`D#K~b4{3eIQJ$-^@QP!CoRsqlT6J|OqLJ zf{5~7`p6am*1#F7DS6gZ1E@y1Wt5R=BWNB05CJfPx||07pn!_hR#Z@J88#{z$f(`` z6*WU~hHnd|1o=D(v2ZvDahvIJ)K=sojHu4LJQ0e8b>`N6r(T~=xF2-ILAr42r0g{7 z6~nGnRHzw4b6poXQJUe1FsD&dL~yhqpomekVpAKcmPb96R!WwN{i>xxlX#H9GR3q! zk#BIanwP*to(g%>F9AR*mI{0usHRu)R1B=D>Jw7(sb!d!0VncLCxPfe-2LA?d1vOe zgJy$NWOXoZokezbyy^z>uv`!(c^lLelINdMWxO416M@}%Frw{sm>|7HU5sEU_p=^O z*i2hQ>$Y{L?__+6*KTe4?vi(t={wcwZcQ(5ZJCh}>ENi%#8B0h+!;NeKBJ`QH|J}3 zwq;UH;9~sc%VO|~k79JQNKhwYFrx!s9~47q@pFK4S|oMtPGngC`6!teO9|6P!j}o@F}RXvHiOKZ&9>nPA+Z`M5GQ% z3!7WGngRMYps#tlIT5Ze0Gj@)9f2k$CD1OQfq*_jpsl{qr*_JGqt6p)b9)DKP=?TE zCv$sq0{sTi_dMJ!08Mfk(04s-EIa|-3Fs5o-0f`uy$)!4dka%n2qN7_xb9|QW)0}m zfZpe#ttkWOa}cy=pVcn<>Mq*N!V9z$f@B<>yj^UptlikS%(&SEB_zbz6f8WiS-83J zshgVFnYx&>$vE0OnL2nw(6>Glo`Mb%c*_Qud`3{>%o#o*e!%{ppMQGuXQ_Wq5XSaf ziDiwQF(W$E`0LuQXMbIDOoAYB4B*Y9U)QcafuNE*5Ok#P*R>N*A&BNS1ifh4)t^HI zd9ikLbCMJg@bvWLx3MteCouHq=U*21S@N%mUGL*3yzeLP*e+REnz~Tv&CK1!gFu5hLHHtrs301M9%6)8A$Euh;)8@BG3YFG z9+HKWAT>xE(ua&8GsqgUhg={}$Pc;!-Gv@NkDv%B8cKjtpiC$adJdI970_#_9{K>a zLS4`&Xb>8MW}pRV71|;qBBCIoCZZ!^B!Urf5b+WT5s4E?6Uh=?CekF*C;EfPipYV; zoyd>q7SRKuP@-s}M50Wh0-{o)*F^7#+K76IhKQz!mWVcqNr?9m(-R*hK1nPW~E#5u$-h+h+bAnqa_B%UG0kU%7RNe+=5BjF}@~G;l`l*)p?%jKQuf$%By*7KV?|r=Y+1|H%hxTslJGhT$ zpUgg^eeU~$_oeT9wXb*IGBq{zN$T^|2GnlU!PJ@5wbWmz*Z0%y=ijfm-+VuEf6V?D z``h==(NNNG&|IJ~rtzVPq$#9nq4|1%^1#UhG6zf#1RRJtPBy{X_GIVBix9C#n>gdMk$>}-i73pp1AJFI0 zH`6aL9Apq-&}Hyqh+(K?7(7IB=;R^AL)Q+W4?REBeQ5LW(Zd%GTO7WBIPY-#;k6^o zN6sIyID$Hof28ZkCLa4`()KKNmF@oXeRjiK~;FoLijR zjysOKm4}!|l*gJUhNp#>nD-2?4R0K8+bObB5~mzaC7tTw+sAi-&x0?UZ;1a8|7HH0 z{3ZNz0w)9v1VRKF1aPNCPhUHoa{80tK|v+Kn}TJ6OF}$CW7XAm%@u8 zydoAN@gg5Z=|ojT14U~@x6g>3aXFKBW=iaY*dJoCVm;#Y;_Bi-;%_C$BrZxIB`PE~ zB+p2?Nj{gHKg)O4?rhfC$#b0NEY78z8<9FLWh#{@H7Ly{{fG2Z=|T80xG6jdK75}2 zy!rXG^Ai`iFW6qlxiEL}^hKA8#TVCPBxU?%UR@%&B!3BYsaf`*td4B7>=(J?a#nKL zatrdJ^1kw~6vz~m6+#qx6pt#JDP}4zD2XZgE4@+Pr>vzMtvr00=d#P?G8JMKC6zFh zepL=t2h|caNKH{KOzpEer@FIxxdyq0x<-t~xTc_{pJsy=otBAKme#8FMQyb9Cmk*w zcbytt8eJpZOx-oaB}6D>S=WvO0P>wmI=S-E|stmUNDAUT{%%NpmG~z2f@PjUIrhMt3gvJMKds(jGA$>z=xv zgv$| z4Z9mnH&5RTy}5D=ajWe1(c9N=kKB>JlYMvpU6;E(foB5~?vdWJxz~JO`2LgoIFvc+ z{e#mFA|GIb%!1xO6nyyjAwJkLxEXy09sh{@k;9|z5O_#NC~c@u=t!7K*o$zsa8&q8 zgh|A^NRh~dD5@y;sKLjVAHRHZ;>n{Y*l6qMu9%B4`LQgq_hZ-M%;VbQ&&TH_98GwT zu=&*H>BmI*#1}~?lOmJJlRc8hQ*=`rQpHm<)0om8q;01=qz`6jX1vK1%goGT$wFrn zXS-)l?j2Dq<=bD$!L`Rky3~)jrjjS5B|KzP5TjQe#r{ zsaCJH^Nq%v<~rrNxAk)MwG9^C*)OC9x{ik%<2RJ+=`b-F+H81)Q(H2*l+d#!h|&!cba)AfF` ze$?j!pCiApd`TMM9>^a&GgvuvX{d2nYxvWM*~rYO>nL{Y_Bi!;+9WF+S%ASuDPQ5^Ye`hdJAKVE{pi3pk>D8^c9hn8jL#T%c}kA)*5P^ zaXn*0e4}9#u{p8jiKW0k-save!zttX@%DH;eh%7y!QAnx1q9$Vzz_IOkPNhM&mLwf z=Hs-7Pw<>zVP-qQ%f-cZf}4XwP=JG*pNE%Mf|rM1KtxnjR7BwHKl%_VA)?;9_rU%G zKm(r;;yT79bXG)2Na*hhpC^3I?tK647oig3|8ga-Alf~|Xo?LI=r}|~OGHddjDG{c zKu5^{CIKHprwJb-ViHm^a*92aRC_^z;sX#d5eW$~DG3=FDF8`C{@^}DN=tU|nBWC+ zIt^2byN?PD3y+A5di*3hDLExIEj=SM z>v>^O@r#m|rDZj>Z|dqB-oAU^-qG3B-Se@xZ)kXAbZmTLa%y^UX?X>+y0*TtN$3|5 zMDnd$KYR8!{h|f^A|@pzA*CSni-_2h&~aK)vSWhe2QO$)m^#xP7rL>B{$faC!D~u( zVa)}Gt1fL+hfatLaV!$Lw$rnJuVXj=Q$73Hv0we_gZ7btA)qCuh2YR~7FW`Bs^7=| zZXQt9(f4veU%0;TNOBRY3_l!BPP%^L_s`$l_$>_oH_ZhOnrMTElAYm@hAjQgp=F+~ zW&U)}WD*ME%4>ODMTR!H*EsiHhV~AG?k>SYL+Z77NXlf%z%Qp+C-JbQw>`tO$wG!H z9*WQ3;Di07q;=K0kM%G0@pe}Kd<6cJlF;+NdbEWvsZtroun)f6g@-tje^C*EzaQP< z@&8ITNjlzcZNNi(K*k;hFw}T01480RJb$!D>39($6IqiOi1Vo)E#8+vWh#RfC5TSQ ztv4N4)P$2N&j{Q(@YZ=8+!es`96?TGURi~wKL)6@%FMlYFM7P-&*pMV5j;2`&$+8&|Xt@wP-AjY;s6o54Y#JFQ_@>kO>%A zDdr^xmrp}Mnt3CL*eQVYvgApixD`6736YT^)dOvN9Wub zdKScOc}wxo9e)^h#qq5M;PWPYV{+h8a_?Ic>bwT3z%ssJVbIgsXXE5 zRoFs)GLWr@8&p!Uw`MwhaTL_Dp75U+;X@|!J1n60m7wU!Si|mT+TqLhi^!TPG|oqC zlxx+6CSPNIokf(PAIRSKi@*B+brkly*MBbxzsLIftoSL-g^zwq_%}WBYX<+G*S~o2 zQ*Zs&X1{g#@0IKKdc6Z({^wB2Q$Ojy0YLOQXF{bYQ!*q2ISoRSRf{Sa5YL<4T)iW;oENT_vJpr(sam%LOj$XgUv3-;tn&Qbog4WJtvJZ z%JPKygoHMvUz?blhmppCyV=Iyaz*~l}pA;&ghn;n_30Q?rblawZdY%ObV(~71RCa zUv-D17TCDjnzn03D_NR_?2X-DEbwulJ+gKlU0-Z{?PdKqHTnjr@G$omkiF4~4mwvb(h_76ntrEmVaIb)a`?*%;b9GWT zAkjW8HID16$jwP)ga_u0-$^`#w!%Ysfg1=%19`KS+{I@}DDEeB7#h85>k}4&p9@4) zH|`5q6%6u)8B74bj1#hh28+Z)1*we>+2vdi3M)Rm&G28BlW~VBwol`s20XOIB=HEB zuT?O)f`~=d4C0|Q*g77T_#W1n^!QB44py3Ia!Rs=W4pvijEn1P-RT3pZ<2v-77IpAM3xaQgnPt>prKv9Y>pB z=`j*Cl0T%D+Gr4(z^Uc?FKdoEr&5(|STgJ*TRkrvA5gSm2C?!so359P;h_((9g$0i z*Ui?l%I`=;`?%Z#YRyka>lj}Bse$NqgX$F^e4vXnS`%_e?d*^9lT$_%SU!_YvmKGc zWB>y<8xLJZF5)3vG0UWMCZb@{*anjp7O&!shyJ?cB28BJSI-p$5fCf{?lB%Bh^j4o z$QBQE?6fdfUXmtD=Xa66;EQ`tq0kE=DKfsGx=*ANsG&S*_KgP5h;O5kX^%VM&FLAD zunvX}$eF@soZaktayu_ezgT9T*)ECfx`e&hf_)CevwE{LeE49Eu0Nc;cuUzQTDtv9 z+ROZPJ(HCWcnJ7ZW;DP^?ZrJojtp$u`Ym!!yKe<>%@Rr#joi>9KL3uOFP>FTMd5&h zr8_%wQO%m<-4t#BG$1TiDR_U0&c@Mz#3L6^3+k9LvQP7dm90ljjI8N3Y$3O8?*|;4 zW!tzyvj$qRG0b^0*T0&*UAnRAW}%}t?*ZP(KS`NR!Z1AA)7#|REDDY0(UW}fX-RU_ zB{rCQz}ivE$OL;zVABGy0=XlfcYu6WFV5qNrM*HhlH1kv9`p#nm!F-151Ar61hBq% zC|CZR%(PB|Xu95ae%-C?_;$)-Iw0+d(Jib@ zzv5C^!aNd_xvN68_!It0C5~^ua^=BshYoKGed9E;rUvK%ll3*gonWuP&TJ2Ca19C! z^{%Gu>cqso-<9kP&u^ammXqIe=eIrqn)6}g&w^dOtl=?jBpqT`KV!p+$G7ot7KWE`CZNbRlIRtzk}ZRhAXr4 zN}`%{kn>#d$4#Oq8mC+1cwKpElAilr$VZx!*_W3blpIMPv^%^D^GT#=pYF0^H7`0# z^-pByU{$JN$>_gEsHU>O#{Y%4lXtzy^^NpDsKd=zdU=nDKqkq&503tO5%*3FS&c^e zq|k763bbP9w%T%9N6K_S`bLM{<4q9>$<7ES_e?G*3H9wrd#9TA?mTUqEIrW-oU(eP z7gz;}IGs;DvuIVfw(_yv6|0qdM<@nvZTH~p zjD7V#xK;%&v;qg;LxLZT_&<2;UwdUT%?#c)$}}|wG_lLoA_wi6A^3&U8Tdt%6DW@OZ_zMS?%_3#|EuvZW7(gO9^4LGpiU zI%uPwcDnPdq}Vc(F_ZDpLoxsTC!+rK16L32xG1SghKFLTHuIOWs>tw=<^ZM@4;|C3 zxB_hb7L3V+p}_UU2^e$pc=?y#{F=JixCskrV*ZdeRecKAbZev+VtOiY#aT@m={Mw9{xv?KS#qJ82o; z9+Cf9iLb)i{@>4j=j1=+l^*WI!nJ6soKT@>F7hAZ2MlbTeMlb2OFh$grrD;gup_0$ zZEk5@7KY|*hnp#xxNBKm07# zK*)nI9e8e^1oEbAh+|sti{31(e_y_b!ozo)`%GlA(gYmvW+!k17o9${>qWBA z&ilTduE^aOlyJ|uQzLm@@yNA_TftpG8&Z9HnQ|sWXDWH~-@IekT;+CtV#An_y{rFyC*GX(t1l~Hb7D(*nq@6_O$e~SaZJTQ*5pQf74L*^IP<6NahzqzYhP5950?Io-{ckjfKrs zFB>fPH5I$ec6B@N*TK0XUR6&U?tt%} z2fzdX;Csemffb1Mm+IM3@6YradhxG*WTyXT&IrYYH5}XwByl1qPnMQVNrTu!!&l^j zz&2@T%aB>{`tZYT@3;qB4Y|w>xu(NGx-bL( zhXMKH4vwrvB+<2X)>Cmb-Fa~V-Ue@)(L9wO!Zl7= zYNCsWT2)-TTGvT%@T;38xSKXDLsvoTqyMt?`Mm3i4((UCbxwGjJ>@K2$=6P$U{H_Z zeVNK?VKx!?!i|yVl}`j4k|($_W|-IVy;>G>@?wQ$nW?meE2VtIN8S$UgUIZd?J=BO zMRTR_5a(uT^%s*-8=ZB%DXhG|EIoqzC4y}6>YNdD4`S_@bT&Tc*l9)`ulxYod+q0tdPx^rk9#Y~ z;UT?&8h^E7_0W^(`JINCTyhW{H#w|oerp@}Yg+HP)#M8o1WolC4O%CmIvYdy;_7wu z(CR7ZR)obu)#v2WtMAV*wW!NG&s_1W^{5L%&MV@f#OSGaO{S9N$$A~V_hspI$&(Hd zUw73w!FELxyp)IuR$ybs?Xg3v$jXXV2b3=t}!;u_W|6ZjDvfB(XbEZ=RR^oCWS5gt%4}<65Jp+9XMiX{xyB??Wu1A020}f8H z^$?qx`!;()xTnr<*>&xkLcjZGg&v|I%Rr(2ZN8IV-`5s>7X?M5f+a)0(=j5JiAmQ_ zCf&FkdL0%mtloB>PD7!R+xq9!{XU(Em{a|UQji%BaHX8Mo4gaNQzqwaVAIDz-vF1N zqB2-MR)*AJ4YwZQp^Aa`744M*!vp<+V2#lk4^J)iLJmCzITy@388C9&wn`5-TS;vH ziLs~O(agM%E9*S7+0DR3ub0Zp-Y~w^FpZ28isRG*dOF6ap*8V;L{FQvuPBP1+tAx^ zj*WHCrCGnoj|ApzRrO|9_#*w&ucKii51B#{iXUGk5w`g30h#t@xJ}@Y(UqEw(J#Hf zSn4x4s+DdWCvRO;C#iL_T;+gs&mve$nB3ogguR))m*V4OX-6 z9O)97ji@hn7@z9*ja0k{jfMU`myPH4pB{-{i$_wu&o$K)Mm#7xt{#3g`k98TwT%x; zbedm|-^=Ea;38G$o8=xCgN))L$Nd?q@z5UGmMz#?4+wLjcl98udlD(M)g+yd*wDWr ztLAOp?O^KXpmpn3h`R2(w7j6cLQpaNn;+`f)A%2ms4DB;>6MN9J_LE+c0u+sc-EJh zy|$hE_=>l6tNYznV3@e_45CDfVE4bl-2CohA}_!CNa~=LETk+e)<{3-`g7^s(?H)e z9>*aM#8Tx8_p9-Lz7ur!qSPaHg|l{GeH)DfjeHvY1bfQ)Gi#G9!wAiM1vzocL#Ll_SYp4(f-uhA)RrI2yKx4Ejvh*muhJG}eGWEL$ zH*~66x!(?LY6g8>G3B~q`*5#aeaOxDyZPNxMK{mv^P#HVPKw7v5gzJUrS4Xu1`eCY zD@qzuZhY)qMUY>cc)=^J+pl=ENzKCLShMeNVY<%p^a{UQ&&dZ`7cKiJkKVD`>E%_s zF{kq_?Cph_J=s}fS5wvG-L8Eq4Uu6@OUbx~136Gq)3(#MDl~3aokVoPyQ+bndg!-a z$vY_}v;AXPe$ZZKeXWsa?oM9dE7;=J;jZcxIwOpmG)SF7f2;y?;AwO_arzcZtAi>*9vP@5|A~KV{(DYL0c6UtcA)ZHH0W z@ofgfEm@FY!2>VS8d%Cpu-iY*+I;1K2w0jaL>CX^&ZTUo<8JfTXZHpGo!JncpiNlP zyt>?4*Du@7F-#>;!n>MqOL&Og*vc5akT-fUbfR2fNd#eY;RTOkDQlpt?oKz*v-E4& zY;<33Y1h}WkA^lv>J%G9K?H=4P9Vz}s3n@%;Mzu9c#;Z}^->W8~0BK;7c-g}_l z1WexXawG~5EiS^gU2(;45Ek$|EQRZjnbs2a10EE?F-^z_FTs58g?X&63?4G-+0aJx zGAO(F5(aoclvFI|E76=yU-|+L-kx=F>j>S)o+p|q5y~bqRR>g=nRODJecsl|U(mus z*6Gz_`fK}7T&+#a&ew6t7P8Uu>^hv2clph&zMOZh+til5s>e>mV=OSFY{5Q0TB$lN zwipH_#~9hfXdbV;KEWbwdc+Cyk%IPi-$-N;GZqCWeC5g_iW6M?V|@?pTr0N{3^(8G zRxv6p)03mgwUNsn@0ye)%wp>{by=_Hamf;!+L#_j?rW|h-9yG!i>}+|usJvw_YU4h z96vJWJCd=J9~RDBh^402xFSbUfE5D_I|6We7#@-l?dTC)7{HwaINL{UdtZ;DNX@Y@ zBX=g1!ZfNWnw;t#HI<9p>2E}XabADURI-|HV!ML*S+thwU9-c-6OM){i0%7ht6jym zH7L3v((VgZ#XD&mnEM1Nh7rDWlhAh3LtjTe`aOT5szR%D_3Rx*hGZqNeP%O?e94!@ zSj=YRPvHdK2*7S5S8pLh3~XI^_ZRi3pBHQyGgQy678c4?vpe4PL*(5&vyb%&hs|E0 zN`YzdEArpQ41QtXC0zO5`Q(c*tiKvCS-|$c)`xEDpC9Y=GInanx*fUmAI*z(PuN#I zvVeR!@V-=XMw$`X02GdMb%basLjbwYdVah^z!tJ%ps}a5rpmkYo2y$#cps-G4_DID zX^@F~or;>C3Azgw9twF)ZRgH#A}|g+>kS>1dH5p0L5u)PlV-O^hWKc<{%syHv8XR= zT=v@#IdbubXOYi&8w@H98nz9PFB3NRC>KWZ4B0(jod3LI z#ugLIR+Ta?u<(WLIJ|kpW;C_`+FZ?=O-&+b9NP$+DLmx5DB9kVfa<(E*LKwiZIHsN zrmtoQz8&lUwYBp8mE%F=5IpKJIP z7&5-Icx(POZUzsD=1b*_l@7?PTl45lX=rD+hh!9eH_qH~KzTccW88P*zz;{GxeSAM)ySkpOR z(Zhh{RJl!N(Vc$3dSu*Wt@>$B*(M5B6PScW6PGME;!=2X8K0ULt7 z{YO2F971XAB6qBbc_JjWwM(B;TBjXrlHS2M%$!QWX?4uj#7v=*7L0WO7|EqahyFGE z`Pa}#uh4%4BU=3JG==jkn4ELAd}VbNY2??q{roU8mx~5H*A(Kd! z!BaIz+C{iM>%c_B{n%2S_u9He3mKYDlDaCA;r&PNP%bAMx6IKje@V;Hc@lM9#i(PH zUscsB52e#lbj?gN3=wiB5eHC1zvHOgMBS9hg=yII0I-$hs{D*2Ce?dm-90b%$PCh~ zZ$FqG*rd$!+3gIlf!}%3;O47xwP_9A+1<5s>WM=2vfhPx2%*Z;kjLG4g7v)-za25K>Xb_Pw@ z2ffyoyyY_jHfe9K*uo1_KQmxHu1bZ`BNDu5v?8YmbAlVsuu{IA=54i$EIzDclrx#C zq5ZI_P1ekNcG~XZ>ks^Dxo#bKX|raO?aqkPxIbYJUx7C!>q}wN37ZGRu95gB1$Jxl?Ws8$!uyFts(gK- zr-M08LWg#@6{Gh~qaNpAZyL6FkejodxZ8GOqVt-Qhn7NT z4<0fLRSF9A?IBu}Q9-?}9Xp=qX=Pn+_nblNxr7CIvA7afQZd^~H4!kk@sM|QoSRPb z`d*xr{8kfoCMlnW7OU?QUkn>+XytYG(LL%QpwzLqvxT;GX<#?va9lLONrSa0583?^ zg|WeMEl(_-7M(Xf3YI5p`T-?qEV^Ck3{bHNZc_y5XoPG52&w9!&2}9BWXnv!S6_avIND1kW~dtL z)qq<`*ksIYQl7(!zP{flZ$Uk53CfSh)fY$gGq9$v$#-X*s`Dc45gggRsBrvZ&;@~y zBL#UGD%wg3{`+lYLQ3NZeE~ZjMhPJlJT#vy|BEz0S}B*Y6FM9pFKzOsEdw34$T0L_ zm^orli6H2S6*4aUjDSg^Z5YJ64*_@KdPdl8DPQ`l704|Y5V83-8-7rE$gfkLasyY; zW*-H$^l4%dL3qdkKny7uU~_i9k-+gCHj9rfshmwzW;_&KFz*F$2XSViQ7Uul~d(#uX*#?U9WhbkkbQ_6T-*npbb^Rj1bY#y;?3;g>tUArW=31b`*y z=ut(D22FKRU{UP2LN9ZNYSjrTK^6eK9L!fTkeyQgX*2^71vElt@T_)Oxxy$>_}#&v z;P7LLy=Po=?7DK0UFlo*2~Hcp(IKW6Kx+XPjvwm93&D(68aHMQUc1D5@EG@=C@L8H zA_YH%)WT*zZ1Q!yS2UTjx0HU#2Q}&^nI=z4F0Y;QQB4P4pELinULW!ocZLPN`Va8WuFnT2+{krY z*GnLz--Ed}gJ5TC61I2keBGAG$;}sF+4`pI=9rpH0WiS;lR<(zVFQM1SsWhvG-|W> z@N;2w;)@gmw`WC}XY2G)X~$D#ZO%SWL#ds*yTXRkeoyUy5t3|K*F*lOUjt;s(-G49 z3HvZcUbMX^g%>V>?IP>d%aYRNhSj5PJ}nQB#b!$$_M20nC^ka>>; znfFE>eP?>$s{ybL`K+fMZB{y;$ss#4IWoxC`yF1T_@-LT=fY6LwbJ z`{C4_tJsT6tp=$`7jwPJK_b$0b@S5&>T*RA22$L@$|hCm2(x8y*E`aE`OCRcue|Bh zW=ur9iwTj6mp>vD>eflu8OJ&l>XbEJJ|)#cc|K98=jI|dm1VOv`sNH`9BUUEPDvAQ zf<#!fD&9MQyMMTX+v>lZNZ;ne_q}Is2{g!&Rrva0+)cZfys)8pYyfaC6BD8WmvM*0 z=g^klHU;*5J1rF$vbWaG)vL?dyrT`cB{JerTaf3V+x#FYz1M#xrn|y!8_oS!1 zU){I#z)`?q(ED?I{6~iN?WivmEw7Td`J^9WvpZ+r*SFs0IT0n(TGJJq=&||8Kk7@+ z28(->nz|9Uc%6$956|S3rhP9eiaA(Niz@rz0eOaNT4|pQP&S;2wI3FFO?k)MPWa;? zwRLJ?+#$!EeG-I*jPN5S9M{mx883QXJae-z8TVGBLzMO-YnpcUPki43cWPi~y9Zbh zL~Cc0?ctdkvl|a)bbR9)u)A)xub-`l^;KEDE3q6HZZX=TQCi|F{_H1ogw7wB!M)k1 zWU1UTOY8KLl|<7uZTTjB#6DHbhaG7-YJ)74!b3{wB=&!(UG7f*q_tJMoTua<$}sAt zqD1pqXdL~4!=I=5N#{1t-t_%%f-htiZ4lFi1@lUJ==kN?oGr7+-R+U8#Nmc6JH92j ztGtL;@)7$xE-z=FjQ-oekr(C7FK^VcK@_Ywp{8-9Oe(9u61b-A3}<<#c~6=}a`yK` z+_y>b5usBF{dC2faYQ0Zny2&J2gRPFR~;~>>;kQp8S8hOMoS`e6i=RcMO>JyX;bG` zs$)tXGwn4HB_CygTtN3DTR5=*_}mT{!Fj{Sj9ZEV-MlM8zgl{`dAoy%!k+C0>=N=l zdR=}FJ`sk~_Eqq_@Q%OU>K{KY51wWT{c4Lnci9NGIgWgsuaLL*HIw;^u&5A5gejxx zjlS~g(>^_6!J+P+lRifjiZ8p{*i?Hi=Jd5b3qL*>>#9H0r^Wxg;xh7^tpi^GC5`<_SpFyNt`vAsFn^R_{v$$D>uRGoGw z$A0qtK3!euDi?}NMJB{fJke!5m&Du-fWOUFK(QREM%04A+>XaNa=hQMf*ixp;#FP) zTX^*K?5ejn?r3kzFs}n;Cl}*UGR4&h48s7`ef|ECaDi0xxtJk%WNO9S^@LJjY7^(5 zqYz!8?wo%6iZ(QT192BkvojpoNfGAr9znKRcIKY(Kw+RYKpvgs)a=l5@Rx|@b^fl| z+!}>cLsussOkQMN%^9`Ce4*6TE32ggd$W`)!D6t}qcU>t1RE0#O~mD6d%l`VD9(9X z)gjl{(Krw(Fc{`7SqGK@3@Ga!_>7UPr`Ed0JNW$@`Sz`Dv#X0Nn1{Z;i2F=yjx?%C zeaAv@xyT4JRFHW@)9Iy9hgyf+iXhk6PK}dGhr4s8wRp`)J+r!(uGhw6##CgrpMPBW zV{|AWb>M3YvOTj27OAwUThfQ<)Ya*KS~^i_V|*Y;=Uy`RyJ=^Wg9yO}+#*irmACuk zmvcqFok5pU@0rC_tmg3*G2dYnJVR0JIhf9%Xd8T4+oZ^cvFZxz6=~Fr#9eQMY?@PFTM;pS zMtDe{Vhasod{irs112}AmK`4?%&-A(5FP^J8A07vYiQ{N@RED%L=F~SwUpE5j8z-h zPBttNi+8FQG#a>Z%(Cbr(N+tng6WGj%0-U1;f-qgxhUnrj^sTqb(m-Gt9OKy$Pf-j zOylB#h&jpj(Bh!X*iQaf-)+*lJiSLbejR}@8@+jVP5x#ezj^t1mAIjkHrLNQ&Rzt)`v6LOkX`u6E7F# zLau-Gq*|X$*?vV2;YkpJ`lbVPST@gf50=-zme-W0cWo#;e5#y&G6|LVr`7M@^|rZH z)8qzpxY3DkFqLLaS1~KFmy-pP*Ux~&(r(3$sKhCm3wX$G1>m2a!2W&0G^;TiJ*~tT zcm-T?12+-1lTcC?CGkuHHC{l7PsAk>5*aQe-8z4u4g5XcZ2;%sjj}hkj?5u3GoD)xG#iuEamqG%pRzNB_=%2A zj@|2Krwgd|#1f;iJn&6NJOrYqTRb1i*BwU-)WpOAQUgMjF9XznRtL_Pa~q>4iN41N z{zP26p{Fl2NF}Q~FEVN?SPRE6zby(}>F~{!^>bunr;);Qj{@e?M?jS26TtO^HtKW_ zI*>kSsg%}x>~BRkv4(sl1~1yKHrV+}RMXSnAkJ$L6XplWo7XlZJu#_Qga=kKa$4Vf zin$St@pnLUYI2`gJI7>vgph@<^*sn%+T#CT-+&))w#%!Se{ucw8W4Oi%+WpZ-7fv} ziC7T^o|TL&ohgM*1A^a{aPX!sctjmt1&&Bh`+DJosVf55UWi;9M1A*OPeLXapWEvcRqOa713*Z+*MUEM1OJ-Iy@j|Mn`#35~uTLH2cj1^gXzqutj zKf$^aInVW=4YHzjr6jfc`As?`VKuoQKnTZFszYW?Rrs=GP~gLX_u# z+_!7=13Dk3vSKo395?|pSWaL(GZV?#hK#U@Y*NZLzBKZ*3;rY!B-%Xlz5((@Een@6Vhwn3yjC3H6;ie1z;dfP=FqBO6d_U=$wTEJxq11i`iI$gf?sJSpJZ zmv#7sOzEq}gq1o+D|jUp---6oVV-B9wNiuC$Q|O z+h=O+>^D{@t57N4+E|t+GZz()U7h6aO0~C6z0hEL7e{pD$dP8d#MW@r#y_$-dFdz9 z-a85FRE*5%DcPQEyJb36sZ{;O5rG;=8wL1-4egG6CPcMH^MlNShCf9*%M$Ks z6?Ggl3oG30;WKV#wRIce=v?NNt+6M{|Dz4rDUTZl&c?-MZ4D@y#PUpj8tRP10 zwcq9FnPOR(hHfv3dkQU)@ukcX-uTdHrP{2N&nkwwdwuCcWN6>z>KsN~vYgKHDP--* zOa%!Xx_AgAcZ#O^+CICkZ6>Ouy`L)nHm!W2TU^5V2_1&EVY~LoN-i(sPdIOMBOZFF z7g*zwBV-1PK|b^mY~oe~NsBbg;_)ULd~FS0%s6S9t%uvZRSf$i_Z^~WyiZ(m`KAvn zGc&uXK}W}SnZLo~U`)Dd<8)+Uu|S1%#DNN=L5c0nL5BcUyF48Ri}%6q6e`QYlBl-w z7uuTVCs56KKEQ4Nr08Ty-amkAv$CJ|3mZ|q>Af5(6P6HC{WuTH=k?x}ll6F5kfC@P zS5hTO(5f1ch{X}u7D%14ED;qbU+>`IzrNVV(BaF{(bds%Z|<}|N? z%UHDk6FRhr!MUp_jN|$xdn8cUpRjgKqSlv$6;P+M*{@68U_%th&@nZo#0SRc-p)+v z)dbO_#*6<^Phv^MVW68xw!3qfrURI3PL@;EvYTlIPrfg!ln`JqGAXM#wR{-2{vS~rR`na+jSQFzlA^@Y;l%zD|rJ2 zX2Gu#8vQdJ{h1H@BOH=Ru-uaOlQIW+s19Ve8~k;)*!R%r69XS) zKUT%9aAN4CEgaabuMK?Az^#2+{ibic)VGW=)v(OXgb9^Avq|+)5O}rePWiRNErvrf zh69oZe4@y~0^R-d|ALI(5#tk_q{(tq&Wh@6W$qs%mI;Wk0+tSn3%d{8FE-<{78gS{F8yoA3T>-%T^E^~Rh z#_z8m15i)oe^9P1WCu8rOT@zrZpBySV8dYV{Wfs>gtkKkn9IheR9pOP+f2e~RL zpC=CLs3<#_aQ-`f5k617%$?JllJb;{L}Z>nghG@9B0>E?lYe{uv|wjnCWBjB61{II zeSop_JiHGl_xuf#Dj=vGy~sX|R^3uq$-L1bs`g$wa4FmFRer+llr^a*DK8jL8BW6s zVFu4sxy7`c9$eM5zV)@CyJDdJ{`0ZG=RotXYHCEc328E?6vKn-;3;OnPLBlTa#M zBdky8A03iNMe#+PoK|<$Ol0oQv$8wz1(}UpGu%Kt$X8l@(1LNq%^-Oe-KUJx42!Dd z6N0}S@9w#U9GQb>;^YeK>|R$duE9D%I@6U1JQOG(=c>6rGVK$0$pIQp&2o?sUG6&3 z-B3vSM66Ffm8YLvJZsCQEm*!gQ9I&;(|w1$*8%KAPF`8sAcRECibb8iMA zNv7QM5=r4HqjL>MGP23!mcNQ;@)V6kH`}KsIw?Na8y~1s)XA-<)=#1?qEi$;Z)?`t zWtfQ_37JxFGgK-{$!Sbh74(!l{IHs^J(b`(SlYzU?8YclAkDTmAbr2^i17{MI}25v z&7qHcKym=Pv9EE|!jtR4*LILe?jo&bT8B_FCu3Uhb3>9Nd?9r@xpwJfG*a0oD^LqT z20%^}-`VP;5qfuPXz1U~*L6drX5EFOL7`rv9Aym6vSt`m=$dhTeEr@phL7yThHFm7 z-MzTV@Q$!G9gXuY8RtdTBNwL#>(7!O!r?HbQjuY3_XIyXoo09r+O}g(w$p~|$o?!R z|9V@+qyhat>S4YLw&ypGtB!0X6(z@6Y^AXHu=H>!=ohz6-Cj}4JluOP-9N=gyFSxC zhhy%V9n9C&_=EbMm#=3uD}eF0{c&VwRzGqCRsM(5z>T~z9g7o5s}j>%C7aNlj?TRc($)zv0TVCn;hB9}85!yd=_l)zV(NJWz|<^|-A_49rE*|9#YZRmiuT3R z7iRS9tUu}37Y)xnh~RpsAN_nfY492p)a8>6jpyoSrDWMQ_Onyd+Pe+cO0e`K_-T}! zR@@`ihKC;KtKF}skhV_JzgZ)ezp%Yzw7sCfw*wFNP(59c=z zQ-8>+t6l&(Pyv^K2<>1PF_PmIELueq(=Em~E7&JF!DLX;e$mxe6B|?6lumyy-anmw z63Fz0)1w`^>muO;qIZW&9rTjI-1)36>3g-j>duN-iJX-pvPNtPVzP-*DxKlla-$#L zo$Rfnlpa9^kA$sjnX;e)#hR{mBKSV&j51AN{ggrSiwQvFqBEF3|DGBfps%EXGcP1P zq}MQhQu9;6{!q04;>^(DCslf==fc~Tw_T0hYd684hYcdjI!DTc-kjA8Taq%j`>@@y zfm--*E7A5!k!Hntd|)!)di|X>w_5MV&-PP!+g= z2<~k)LO`f(tYh*iq^0kw`s>%eA2FkUb_V%YDH#K~(3$TWgMg|eq#F%kC+S~U$sT3t0Oq?t0+RdkNAzoir!G>?d5y-Y0nH|9FZnGrS&B}S3CmT~NH^G( zo^vgH`dT;Hj2qW%wgZypb2`~Hn9l{+POA*Gl~St|+2I+YN`WEoSoNy;`M`)=A$!lX!u$!;*D z?AwT}k)5*3zOTbDOTTkSx$jS(?fd)w@jS2R59XR{uDRyC&h6OV$NSJ_0CD0`=AnB> z%J$*tiHi){AW*#Thd1Si{QGA<11zg`clS29tcy=J`ADjBlcvk0!8O0zZf>nOw}c3x zm{{!h~OA9W29 zs5--Gki=zIiNv4DxivNAP$Atv?(CNtZDNJ=2h3jkYE{X6qDKQ=(g)AS|wG-$A8g5Z&_m zC7A7u(GP)wWetKPK*4$)!J?J?++ISxfH^;=E#a+pYnPgWy0Tzn^vTbIRR(N^zXURo zockG=$_|8Jm(6XN!Br}-0T*Xd#4w)LrSsJN2usBY=n@Yn z>L5V8?0tN@MKcTAR;gLuWQ`jWM}++P2t$GaC|?0#siXyM+A_!4Cb%3KqiEyFI(u;? zwp{R%(4Ud)yU@&&!jX7E%@E-;2^!jn^NMitd0dojKVQ0ElcU64v+~(&iYuW74V?c- z!>E315)lnxe;^gBsL+o%S*qGSxR=sr!WNDg8Pt`EETg_NY)ajqoI$cX43mUR zwB`(3>_N8-;F6B&?3}OTL8ro±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

)<_k4C5LG)y2SRf-Q_-y#N0?ls|H8VONc1s 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