diff --git a/.gitignore b/.gitignore index 12f86447..aa984279 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,20 @@ -# eclipse -bin -*.launch -.settings -.metadata -.classpath -.project - -# idea -out +build/ *.ipr +run/ *.iws +out/ *.iml -.idea - -# gradle -build -.gradle +.gradle/ +output/ +bin/ +libs/ -# other -eclipse -run - -# Files from Forge MDK -forge*changelog.txt +.classpath +.project +.idea/ +classes/ +.metadata +.vscode +.settings +*.launch +.architectury-transformer/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..68a49daa --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/README.md b/README.md index 6452facd..b3fa4ac9 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,20 @@ -Item Transform Helper -================== -When you create a custom item, you need to provide ItemCameraTransforms for it. This project is an interactive +# Item Transform Helper + +When you create a custom item, you need to provide ItemCameraTransforms for it. This project is an interactive tool to help you get the transforms right by interactively adjusting them. How to use:
-1) Place the ItemCamera somewhere in the player's hotbar
+1) Place the Camera item somewhere in the player's hotbar
2) Hold the Item you want to modify in the player's hand
3) Use the up/down keys to move up and down the menu.
-4) Use the left/right keys to edit the value (eg scaleX)
-5) To select a different view (eg first person, third person) use left/right to change the VIEW menu item. +4) Use the left/right keys to edit the value (e.g. scaleX)
+5) To select a different view (e.g. first person, third person) use left/right to change the VIEW menu item. 6) To modify the transform for an item on the ground: - * throw your Item onto the ground, and then put another copy of your Item into the player's hand + * Throw your Item onto the ground, and then put another copy of your Item into the player's hand * Use left/right to change the VIEW menu item to grnd
Use the same technique for items in the gui, on your head (eg pumpkin), fixed (in picture frames), or in the player's left hand. -7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views.
+7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views.
You can also copy parameters from a vanilla item to your custom item: * Hold the vanilla item in your hand * Select RESET or RSTALL, press left or right. @@ -25,39 +25,17 @@ How to use:
The item will appear in the Helpers tab in the creative inventory. For background information on
-- items: see here http://greyminecraftcoder.blogspot.com/2013/12/items.html
-- rendering items: see here http://greyminecraftcoder.blogspot.com.au/2014/12/item-rendering-18.html
+- Items: see here https://greyminecraftcoder.blogspot.com/2013/12/items.html
+- Rendering items: see here https://greyminecraftcoder.blogspot.com/2014/12/item-rendering-18.html
- This link describes the structure of the JSON Item Model file (see the Item Models section halfway down):
-- http://minecraft.gamepedia.com/Block_models +- https://minecraft.fandom.com/wiki/Model#Item_models As an alternative to the Item Transform Helper, you can also use BlockBench (https://blockbench.net/) to determine the correct transforms for your model, i.e. either
1) Create a new model in BlockBench; or
2) Import an existing model (either the json model file, or the item "generated" texture)
-Thanks to Romejanic for updating to 1.12.2, and to lehrj for updating to 1.16.1! - -## Licence Info: -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to +Thanks to ThexXTURBOXx for updating to 1.11.2 and Architectury (Forge + Fabric) 1.18.1, Romejanic for updating to 1.12.2, and to lehrj for updating to 1.16.1! + +## Licence Info + +See [here](https://github.com/TheGreyGhost/ItemTransformHelper/blob/master/LICENSE). diff --git a/ReadMeFirst.txt b/ReadMeFirst.txt index 73afcece..96a31a84 100644 --- a/ReadMeFirst.txt +++ b/ReadMeFirst.txt @@ -1,20 +1,20 @@ Item Transform Helper ================== -When you create a custom item, you need to provide ItemCameraTransforms for it. This project is an interactive +When you create a custom item, you need to provide ItemCameraTransforms for it. This project is an interactive tool to help you get the transforms right by interactively adjusting them. How to use: -1) Place the ItemCamera somewhere in the player's hotbar +1) Place the Camera item somewhere in the player's hotbar 2) Hold the Item you want to modify in the player's hand 3) Use the up/down keys to move up and down the menu. -4) Use the left/right keys to edit the value (eg scaleX) -5) To select a different view (eg first person, third person) use left/right to change the VIEW menu item. +4) Use the left/right keys to edit the value (e.g. scaleX) +5) To select a different view (e.g. first person, third person) use left/right to change the VIEW menu item. 6) To modify the transform for an item on the ground: - a) throw your Item onto the ground, and then put another copy of your Item into the player's hand + a) Throw your Item onto the ground, and then put another copy of your Item into the player's hand b) Use left/right to change the VIEW menu item to grnd Use the same technique for items in the gui, on your head (eg pumpkin), fixed (in picture frames), or in the player's left hand. -7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views. +7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views. You can also copy parameters from a vanilla item to your custom item: a) Hold the vanilla item in your hand b) Select RESET or RSTALL, press left or right. @@ -25,40 +25,18 @@ How to use: The item will appear in the Helpers tab in the creative inventory. For background information on -- items: see here http://greyminecraftcoder.blogspot.com/2013/12/items.html -- rendering items: see here http://greyminecraftcoder.blogspot.com.au/2014/12/item-rendering-18.html +- Items: see here https://greyminecraftcoder.blogspot.com/2013/12/items.html +- Rendering items: see here https://greyminecraftcoder.blogspot.com/2014/12/item-rendering-18.html - This link describes the structure of the JSON Item Model file (see the Item Models section halfway down): - http://minecraft.gamepedia.com/Block_models + https://minecraft.fandom.com/wiki/Model#Item_models As an alternative to the Item Transform Helper, you can also use BlockBench (https://blockbench.net/) to determine the correct transforms for your model, i.e. either 1) Create a new model in BlockBench; or 2) Import an existing model (either the json model file, or the item "generated" texture) -Thanks to Romejanic for updating to 1.12.2, and to lehrj for updating to 1.16.1! +Thanks to ThexXTURBOXx for updating to 1.11.2 and Architectury (Forge + Fabric) 1.18.1, Romejanic for updating to 1.12.2, and to lehrj for updating to 1.16.1! -------------- Licence Info -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to +See here: https://github.com/TheGreyGhost/ItemTransformHelper/blob/master/LICENSE diff --git a/build.gradle b/build.gradle index 31450988..0ff8b6bc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,147 +1,51 @@ -buildscript { - repositories { - maven { url = 'https://files.minecraftforge.net/maven' } - jcenter() - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true - } -} -apply plugin: 'net.minecraftforge.gradle' -// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -apply plugin: 'eclipse' -apply plugin: 'maven-publish' - -version = '1.0' -group = 'thegreyghost' // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = 'itemtransformhelper' - -sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. - -println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) -minecraft { - // The mappings can be changed at any time, and must be in the following format. - // snapshot_YYYYMMDD Snapshot are built nightly. - // stable_# Stables are built at the discretion of the MCP team. - // Use non-default mappings at your own risk. they may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'snapshot', version: '20200723-1.16.1' - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. - - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - itemtransformhelper { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - itemtransformhelper { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - args '--mod', 'itemtransformhelper', '--all', '--output', file('src/generated/resources/') - - mods { - itemtransformhelper { - source sourceSets.main - } - } - } - } -} - -dependencies { - // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed - // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. - // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.16.1-32.0.108' - - // You may put jars on which you depend on in ./libs or you may define them like so.. - // compile "some.group:artifact:version:classifier" - // compile "some.group:artifact:version" - - // Real examples - // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env - // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env - - // The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. - // provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' - - // These dependencies get remapped to your current MCP mappings - // deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev' - - // For more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html - -} - -// Example for how to get properties into the manifest for reading by the runtime.. -jar { - manifest { - attributes([ - "Specification-Title": "itemtransformhelper", - "Specification-Vendor": "tgg", - "Specification-Version": "1", // We are version 1 of ourselves - "Implementation-Title": project.name, - "Implementation-Version": "${version}", - "Implementation-Vendor" :"tgg", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -// Example configuration to allow publishing using the maven-publish task -// This is the preferred method to reobfuscate your jar file -jar.finalizedBy('reobfJar') -// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing -//publish.dependsOn('reobfJar') - -publishing { - publications { - mavenJava(MavenPublication) { - artifact jar - } - } - repositories { - maven { - url "file:///${project.projectDir}/mcmodsrepo" - } - } -} +plugins { + id "architectury-plugin" version "3.4-SNAPSHOT" + id "dev.architectury.loom" version "0.12.0-SNAPSHOT" apply false +} + +architectury { + minecraft = rootProject.minecraft_version +} + +subprojects { + apply plugin: "dev.architectury.loom" + + loom { + silentMojangMappingsLicense() + } + + dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + // The following line declares the mojmap mappings, you may use other mappings as well + mappings loom.officialMojangMappings() + // The following line declares the yarn mappings you may select this one as well. + // mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" + } +} + +allprojects { + apply plugin: "java" + apply plugin: "architectury-plugin" + apply plugin: "maven-publish" + + archivesBaseName = rootProject.archives_base_name + version = rootProject.mod_version + group = rootProject.maven_group + + repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. + } + + tasks.withType(JavaCompile) { + options.encoding = "UTF-8" + options.release = 17 + } + + java { + withSourcesJar() + } +} diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 00000000..e79b62ba --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,25 @@ +architectury { + common(rootProject.enabled_platforms.split(",")) +} + +dependencies { + // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies + // Do NOT use other classes from fabric loader + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + // Remove the next line if you don't want to depend on the API + modApi "dev.architectury:architectury:${rootProject.architectury_version}" +} + +publishing { + publications { + mavenCommon(MavenPublication) { + artifactId = rootProject.archives_base_name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} diff --git a/common/src/main/java/itemtransformhelper/ClientTickHandler.java b/common/src/main/java/itemtransformhelper/ClientTickHandler.java new file mode 100644 index 00000000..29c3684b --- /dev/null +++ b/common/src/main/java/itemtransformhelper/ClientTickHandler.java @@ -0,0 +1,49 @@ +package itemtransformhelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; + +/** + * User: The Grey Ghost + * Date: 2/11/13 + * Every tick, check all the items in the hotbar to see if any are the camera If so, apply the transform + * override to the held item. + */ +public class ClientTickHandler { + + public void clientTickEvent() { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return; + + boolean foundCamera = false; + Inventory inventory = player.getInventory(); + for (int i = 0; i < Inventory.getSelectionSize(); ++i) { + ItemStack stack = inventory.items.get(i); + if (stack.getItem() == StartupCommon.ITEM_CAMERA.get()) { + foundCamera = true; + break; + } + } + StartupClientOnly.menuItemCameraTransforms.changeMenuVisible(foundCamera); + + BakedModel bakedModel = null; + if (foundCamera) { + ItemStack heldItemStack = player.getItemInHand(InteractionHand.MAIN_HAND); + if (heldItemStack.isEmpty()) { + heldItemStack = player.getItemInHand(InteractionHand.OFF_HAND); + } + if (!heldItemStack.isEmpty()) { + bakedModel = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getItemModel(heldItemStack); + } + } + + ItemModelFlexibleCamera.UpdateLink link = StartupClientOnly.modelBakeEventHandler.getItemOverrideLink(); + link.itemModelToOverride = bakedModel; + link.forcedTransform = StartupClientOnly.menuItemCameraTransforms.getItemCameraTransforms(); + } + +} diff --git a/common/src/main/java/itemtransformhelper/HUDTextRenderer.java b/common/src/main/java/itemtransformhelper/HUDTextRenderer.java new file mode 100644 index 00000000..474dad51 --- /dev/null +++ b/common/src/main/java/itemtransformhelper/HUDTextRenderer.java @@ -0,0 +1,262 @@ +package itemtransformhelper; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; +import java.util.ArrayList; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.client.renderer.block.model.ItemTransforms; + +/** + * User: The Grey Ghost + * Date: 20/01/2015 + * Class to draw the menu on the screen + */ +public class HUDTextRenderer { + + private static final HUDInfoUpdateLink.SelectedField NOT_SELECTABLE = null; + private static final int MED_GRAY_HALF_TRANSPARENT = 0x6FAFAFB0; + private static final int GREEN_HALF_TRANSPARENT = 0x6F00FF00; + private static final int LIGHT_GRAY = 0xE0E0E0; + private static final int BLACK = 0x000000; + + private final HUDInfoUpdateLink hudInfoUpdateLink; + + /** + * Create the HUDTextRenderer; displayHUDText needs to be called on RenderGameOverlayEvent.Text + * + * @param hudInfoUpdateLink the menu state information needed to draw the Heads Up Display + */ + public HUDTextRenderer(HUDInfoUpdateLink hudInfoUpdateLink) { + this.hudInfoUpdateLink = hudInfoUpdateLink; + } + + /** + * Draw the Head Up Display menu on screen. + * The information is taken from the hudInfoUpdateLink which is updated by other classes. + */ + public void displayHUDText(PoseStack poseStack) { + if (hudInfoUpdateLink == null || !hudInfoUpdateLink.menuVisible || hudInfoUpdateLink.itemCameraTransforms == null) + return; + ArrayList displayText = new ArrayList<>(); + ArrayList selectableField = new ArrayList<>(); + + displayText.add("======"); + selectableField.add(NOT_SELECTABLE); + displayText.add("VIEW "); + selectableField.add(NOT_SELECTABLE); + ItemTransform transformation; + + switch (hudInfoUpdateLink.selectedTransform) { + case THIRD_LEFT -> { + displayText.add("3rd-L"); + transformation = hudInfoUpdateLink.itemCameraTransforms.thirdPersonLeftHand; + } + case THIRD_RIGHT -> { + displayText.add("3rd-R"); + transformation = hudInfoUpdateLink.itemCameraTransforms.thirdPersonRightHand; + } + case FIRST_LEFT -> { + displayText.add("1st-L"); + transformation = hudInfoUpdateLink.itemCameraTransforms.firstPersonLeftHand; + } + case FIRST_RIGHT -> { + displayText.add("1st-R"); + transformation = hudInfoUpdateLink.itemCameraTransforms.firstPersonRightHand; + } + case GUI -> { + displayText.add("gui"); + transformation = hudInfoUpdateLink.itemCameraTransforms.gui; + } + case HEAD -> { + displayText.add("head"); + transformation = hudInfoUpdateLink.itemCameraTransforms.head; + } + case FIXED -> { + displayText.add("fixed"); + transformation = hudInfoUpdateLink.itemCameraTransforms.fixed; + } + case GROUND -> { + displayText.add("grnd"); + transformation = hudInfoUpdateLink.itemCameraTransforms.ground; + } + default -> + throw new IllegalArgumentException("Unknown cameraTransformType:" + hudInfoUpdateLink.selectedTransform); + } + selectableField.add(HUDInfoUpdateLink.SelectedField.TRANSFORM); + + displayText.add("======"); + selectableField.add(NOT_SELECTABLE); + displayText.add("SCALE"); + selectableField.add(NOT_SELECTABLE); + displayText.add("X:" + String.format("%.2f", transformation.scale.x())); + selectableField.add(HUDInfoUpdateLink.SelectedField.SCALE_X); + displayText.add("Y:" + String.format("%.2f", transformation.scale.y())); + selectableField.add(HUDInfoUpdateLink.SelectedField.SCALE_Y); + displayText.add("Z:" + String.format("%.2f", transformation.scale.z())); + selectableField.add(HUDInfoUpdateLink.SelectedField.SCALE_Z); + + displayText.add("======"); + selectableField.add(NOT_SELECTABLE); + displayText.add("ROTATE"); + selectableField.add(NOT_SELECTABLE); + displayText.add("X:" + String.format("%3.0f", transformation.rotation.x())); + selectableField.add(HUDInfoUpdateLink.SelectedField.ROTATE_X); + displayText.add("Y:" + String.format("%3.0f", transformation.rotation.y())); + selectableField.add(HUDInfoUpdateLink.SelectedField.ROTATE_Y); + displayText.add("Z:" + String.format("%3.0f", transformation.rotation.z())); + selectableField.add(HUDInfoUpdateLink.SelectedField.ROTATE_Z); + + final double TRANSLATE_MULTIPLIER = 1 / 0.0625; // see Transformation.Deserializer::deserialize + displayText.add("======"); + selectableField.add(NOT_SELECTABLE); + displayText.add("TRANSL"); + selectableField.add(NOT_SELECTABLE); + displayText.add("X:" + String.format("%.2f", transformation.translation.x() * TRANSLATE_MULTIPLIER)); + selectableField.add(HUDInfoUpdateLink.SelectedField.TRANSLATE_X); + displayText.add("Y:" + String.format("%.2f", transformation.translation.y() * TRANSLATE_MULTIPLIER)); + selectableField.add(HUDInfoUpdateLink.SelectedField.TRANSLATE_Y); + displayText.add("Z:" + String.format("%.2f", transformation.translation.z() * TRANSLATE_MULTIPLIER)); + selectableField.add(HUDInfoUpdateLink.SelectedField.TRANSLATE_Z); + + displayText.add("======"); + selectableField.add(NOT_SELECTABLE); + displayText.add("RESET"); + selectableField.add(HUDInfoUpdateLink.SelectedField.RESTORE_DEFAULT); + displayText.add("RSTALL"); + selectableField.add(HUDInfoUpdateLink.SelectedField.RESTORE_DEFAULT_ALL); + displayText.add("PRINT"); + selectableField.add(HUDInfoUpdateLink.SelectedField.PRINT); + displayText.add("======"); + selectableField.add(NOT_SELECTABLE); + + Font textRenderer = Minecraft.getInstance().font; + int yPos = 2; + int xPos = 2; + for (int i = 0; i < displayText.size(); ++i) { + String msg = displayText.get(i); + yPos += textRenderer.lineHeight; + if (msg == null) continue; + boolean fieldIsSelected = hudInfoUpdateLink.selectedField == selectableField.get(i); + int highlightColour = fieldIsSelected ? GREEN_HALF_TRANSPARENT : MED_GRAY_HALF_TRANSPARENT; + GuiComponent.fill(poseStack, xPos - 1, yPos - 1, + xPos + textRenderer.width(msg) + 1, yPos + textRenderer.lineHeight - 1, highlightColour); + int stringColour = fieldIsSelected ? BLACK : LIGHT_GRAY; + textRenderer.draw(poseStack, msg, xPos, yPos, stringColour); + } + } + + /** + * Used to provide the information that the HUDTextRenderer needs to draw the menu + */ + public static class HUDInfoUpdateLink { + + private static final Vector3f ROTATION_DEFAULT = new Vector3f(0.0F, 0.0F, 0.0F); + private static final Vector3f TRANSLATION_DEFAULT = new Vector3f(0.0F, 0.0F, 0.0F); + private static final Vector3f SCALE_DEFAULT = new Vector3f(1.0F, 1.0F, 1.0F); + + public ItemTransforms itemCameraTransforms; + public SelectedField selectedField; + public TransformName selectedTransform; + public boolean menuVisible; + + public HUDInfoUpdateLink() { + ItemTransform trThirdLeft = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + ItemTransform trThirdRight = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + ItemTransform trFirstLeft = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + ItemTransform trFirstRight = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + ItemTransform trHead = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + ItemTransform trGui = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + ItemTransform trGround = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + ItemTransform trFixed = new ItemTransform(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); + itemCameraTransforms = new ItemTransforms(trThirdLeft, trThirdRight, trFirstLeft, trFirstRight, + trHead, trGui, trGround, trFixed); + + selectedField = SelectedField.TRANSFORM; + selectedTransform = TransformName.FIRST_RIGHT; + menuVisible = false; + } + + public enum TransformName { + + THIRD_LEFT(ItemTransforms.TransformType.THIRD_PERSON_LEFT_HAND), + THIRD_RIGHT(ItemTransforms.TransformType.THIRD_PERSON_RIGHT_HAND), + FIRST_LEFT(ItemTransforms.TransformType.FIRST_PERSON_LEFT_HAND), + FIRST_RIGHT(ItemTransforms.TransformType.FIRST_PERSON_RIGHT_HAND), + HEAD(ItemTransforms.TransformType.HEAD), + GUI(ItemTransforms.TransformType.GUI), + GROUND(ItemTransforms.TransformType.GROUND), + FIXED(ItemTransforms.TransformType.FIXED); + + public static final TransformName[] VALUES = TransformName.values(); + + private final ItemTransforms.TransformType vanillaType; + + public TransformName getNext() { + for (TransformName transformName : VALUES) { + if (transformName.ordinal() == this.ordinal() + 1) return transformName; + } + return THIRD_LEFT; + } + + public TransformName getPrevious() { + for (TransformName transformName : VALUES) { + if (transformName.ordinal() == this.ordinal() - 1) return transformName; + } + return FIXED; + } + + public ItemTransforms.TransformType getVanillaTransformType() { + return vanillaType; + } + + TransformName(ItemTransforms.TransformType vanillaType) { + this.vanillaType = vanillaType; + } + + } + + public enum SelectedField { + + TRANSFORM(0), + SCALE_X(1), SCALE_Y(2), SCALE_Z(3), + ROTATE_X(4), ROTATE_Y(5), ROTATE_Z(6), + TRANSLATE_X(7), TRANSLATE_Y(8), TRANSLATE_Z(9), + RESTORE_DEFAULT(10), RESTORE_DEFAULT_ALL(11), PRINT(12); + + public static final SelectedField[] VALUES = SelectedField.values(); + private static final SelectedField FIRST_FIELD = TRANSFORM; + private static final SelectedField LAST_FIELD = PRINT; + + public final int fieldIndex; + + SelectedField(int index) { + fieldIndex = index; + } + + public static SelectedField getFieldName(int indexToFind) { + for (SelectedField checkField : VALUES) { + if (checkField.fieldIndex == indexToFind) return checkField; + } + return null; + } + + public SelectedField getNextField() { + SelectedField nextField = getFieldName(fieldIndex + 1); + if (nextField == null) nextField = FIRST_FIELD; + return nextField; + } + + public SelectedField getPreviousField() { + SelectedField previousField = getFieldName(fieldIndex - 1); + if (previousField == null) previousField = LAST_FIELD; + return previousField; + } + + } + + } + +} diff --git a/common/src/main/java/itemtransformhelper/ItemCamera.java b/common/src/main/java/itemtransformhelper/ItemCamera.java new file mode 100644 index 00000000..ca26ca35 --- /dev/null +++ b/common/src/main/java/itemtransformhelper/ItemCamera.java @@ -0,0 +1,33 @@ +package itemtransformhelper; + +import java.util.List; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: The Grey Ghost + * Date: 26/01/2015 + * ItemCamera is very simple item used to activate the ItemCameraTransforms override when it is held in the hotbar. + * See the Notes. + */ +public class ItemCamera extends Item { + + public ItemCamera() { + super(new Properties().stacksTo(1).tab(StartupCommon.ITH_ITEM_GROUP)); + } + + @Override + public void appendHoverText(@NotNull ItemStack itemStack, @Nullable Level level, List list, + @NotNull TooltipFlag tooltipFlag) { + list.add(Component.literal("1) Place the camera in your hotbar")); + list.add(Component.literal("2) Hold an item in your hand")); + list.add(Component.literal("3) Use the cursor keys to")); + list.add(Component.literal(" modify the item transform.")); + } + +} diff --git a/common/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java b/common/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java new file mode 100644 index 00000000..2700c73e --- /dev/null +++ b/common/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java @@ -0,0 +1,97 @@ +package itemtransformhelper; + + +import dev.architectury.injectables.annotations.ExpectPlatform; +import java.util.List; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: The Grey Ghost + * Date: 20/01/2015 + * This class is a simple wrapper to substitute a new set of camera transforms for an existing item + * Usage: + * 1) Construct a new ItemModelFlexibleCamera with the model to wrap and an UpdateLink using getWrappedModel() + * 2) Replace the ItemModelFlexibleCamera into the modelRegistry in place of the model to wrap + * 3) Alter the UpdateLink to control the ItemCameraTransform of a given model: + * a) itemModelToOverride selects the item to be overridden + * b) forcedTransform is the transform to apply + * Models which don't match itemModelToOverride will use their original transform + *

+ * NB Starting with Forge 1.8-11.14.4.1563, it appears that all items now implement IPerspectiveAwareModel + */ +public abstract class ItemModelFlexibleCamera implements BakedModel { + + protected final BakedModel originalModel; + protected final UpdateLink updateLink; + + protected ItemModelFlexibleCamera(BakedModel originalModel, UpdateLink updateLink) { + this.originalModel = originalModel; + this.updateLink = updateLink; + } + + @ExpectPlatform + public static ItemModelFlexibleCamera create(BakedModel originalModel, UpdateLink updateLink) { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public ItemTransforms getTransforms() { + return (updateLink.itemModelToOverride == this) + ? updateLink.forcedTransform + : originalModel.getTransforms(); + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) { + return originalModel.getQuads(state, side, rand); + } + + @Override + public boolean useAmbientOcclusion() { + return originalModel.useAmbientOcclusion(); + } + + @Override + public boolean isGui3d() { + return originalModel.isGui3d(); + } + + @Override + public boolean usesBlockLight() { + return originalModel.usesBlockLight(); + } + + @Override + public boolean isCustomRenderer() { + return originalModel.isCustomRenderer(); + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return originalModel.getParticleIcon(); + } + + @Override + public ItemOverrides getOverrides() { + return originalModel.getOverrides(); + } + + public static class UpdateLink { + + public BakedModel itemModelToOverride; + + public ItemTransforms forcedTransform; + + } + +} diff --git a/common/src/main/java/itemtransformhelper/ItemTransformHelper.java b/common/src/main/java/itemtransformhelper/ItemTransformHelper.java new file mode 100644 index 00000000..8aada8f4 --- /dev/null +++ b/common/src/main/java/itemtransformhelper/ItemTransformHelper.java @@ -0,0 +1,16 @@ +package itemtransformhelper; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class ItemTransformHelper { + + public static final String MODID = "itemtransformhelper"; + + public static final Logger logger = LogManager.getLogger(MODID); + + public static void init() { + StartupCommon.init(); + } + +} diff --git a/common/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java b/common/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java new file mode 100644 index 00000000..84410278 --- /dev/null +++ b/common/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java @@ -0,0 +1,246 @@ +package itemtransformhelper; + +import dev.architectury.injectables.annotations.ExpectPlatform; +import java.util.Locale; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.lwjgl.glfw.GLFW; + + +/** + * The menu used to select and alter the different parts of the ItemCameraTransform for the currently selected item. + * The menu state is rendered on the screen by HUDTextRenderer. + * The class registers its components on the Forge and FML event buses. + * Created by TheGreyGhost on 22/01/15. + */ +public class MenuItemCameraTransforms { + + private static final Logger LOGGER = LogManager.getLogger(); + + private final HUDTextRenderer.HUDInfoUpdateLink linkToHudRenderer; + + public MenuItemCameraTransforms() { + linkToHudRenderer = new HUDTextRenderer.HUDInfoUpdateLink(); + registerListeners(new HUDTextRenderer(linkToHudRenderer), + new MenuKeyHandler(this.new KeyPressCallback())); + } + + @ExpectPlatform + public static void registerListeners(HUDTextRenderer hudTextRenderer, MenuKeyHandler menuKeyHandler) { + throw new UnsupportedOperationException(); + } + + /** + * get the current ItemCameraTransforms + * + * @return the transform + */ + public ItemTransforms getItemCameraTransforms() { + return linkToHudRenderer.itemCameraTransforms; + } + + /** + * turn menu on or off + * + * @param visible true = make visible + */ + public void changeMenuVisible(boolean visible) { + linkToHudRenderer.menuVisible = visible; + } + + public class KeyPressCallback { + + void keyPressed(MenuKeyHandler.ArrowKeys whichKey) { + if (!linkToHudRenderer.menuVisible) return; + + switch (whichKey) { + case DOWN -> linkToHudRenderer.selectedField = linkToHudRenderer.selectedField.getNextField(); + case UP -> linkToHudRenderer.selectedField = linkToHudRenderer.selectedField.getPreviousField(); + case RIGHT, LEFT -> alterField(whichKey == MenuKeyHandler.ArrowKeys.RIGHT); + default -> { + } + } + } + + } + + private void alterField(boolean increase) { + ItemTransform transformVec3f = getItemTransformRef(linkToHudRenderer, linkToHudRenderer.selectedTransform); + if (transformVec3f == null) return; // should never happen + + final float SCALE_INCREMENT = 0.01F; + final float ROTATION_INCREMENT = 2F; + final float TRANSLATION_INCREMENT = 0.25F * 0.0625F; // 1/4 of a block, with multiplier from + // Transformation.Deserializer::deserialize + switch (linkToHudRenderer.selectedField) { + case TRANSFORM -> linkToHudRenderer.selectedTransform = increase ? linkToHudRenderer.selectedTransform.getNext() + : linkToHudRenderer.selectedTransform.getPrevious(); + case SCALE_X -> transformVec3f.scale.add(increase ? SCALE_INCREMENT : -SCALE_INCREMENT, 0, 0); + case SCALE_Y -> transformVec3f.scale.add(0, increase ? SCALE_INCREMENT : -SCALE_INCREMENT, 0); + case SCALE_Z -> transformVec3f.scale.add(0, 0, increase ? SCALE_INCREMENT : -SCALE_INCREMENT); + case ROTATE_X -> { + float newAngle = transformVec3f.rotation.x() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT); + newAngle = Mth.wrapDegrees(newAngle - 180) + 180; + transformVec3f.rotation.set(newAngle, transformVec3f.rotation.y(), transformVec3f.rotation.z()); + } + case ROTATE_Y -> { + float newAngle = transformVec3f.rotation.y() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT); + newAngle = Mth.wrapDegrees(newAngle - 180) + 180; + transformVec3f.rotation.set(transformVec3f.rotation.x(), newAngle, transformVec3f.rotation.z()); + } + case ROTATE_Z -> { + float newAngle = transformVec3f.rotation.z() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT); + newAngle = Mth.wrapDegrees(newAngle - 180) + 180; + transformVec3f.rotation.set(transformVec3f.rotation.x(), transformVec3f.rotation.y(), newAngle); + } + case TRANSLATE_X -> transformVec3f.translation + .add(increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT, 0, 0); + case TRANSLATE_Y -> transformVec3f.translation + .add(0, increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT, 0); + case TRANSLATE_Z -> transformVec3f.translation + .add(0, 0, increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT); + case RESTORE_DEFAULT_ALL, RESTORE_DEFAULT -> { + ItemModelFlexibleCamera.UpdateLink link = StartupClientOnly.modelBakeEventHandler.getItemOverrideLink(); + BakedModel savedModel = link.itemModelToOverride; + if (savedModel != null) { // not sure why this would ever be null, but it was (in a bug report), so just + // check to make sure. + link.itemModelToOverride = null; + if (linkToHudRenderer.selectedField == HUDTextRenderer.HUDInfoUpdateLink.SelectedField.RESTORE_DEFAULT) { + copySingleTransform(linkToHudRenderer, savedModel, linkToHudRenderer.selectedTransform); + } else { + for (HUDTextRenderer.HUDInfoUpdateLink.TransformName transformName + : HUDTextRenderer.HUDInfoUpdateLink.TransformName.VALUES) { + copySingleTransform(linkToHudRenderer, savedModel, transformName); + } + } + } + link.itemModelToOverride = savedModel; + } + case PRINT -> { + StringBuilder output = new StringBuilder(); + output.append("\n\"display\": {\n"); + printTransform(output, "thirdperson_righthand", + linkToHudRenderer.itemCameraTransforms.thirdPersonRightHand); + output.append(",\n"); + printTransform(output, "thirdperson_lefthand", linkToHudRenderer.itemCameraTransforms.thirdPersonLeftHand); + output.append(",\n"); + printTransform(output, "firstperson_righthand", + linkToHudRenderer.itemCameraTransforms.firstPersonRightHand); + output.append(",\n"); + printTransform(output, "firstperson_lefthand", linkToHudRenderer.itemCameraTransforms.firstPersonLeftHand); + output.append(",\n"); + printTransform(output, "gui", linkToHudRenderer.itemCameraTransforms.gui); + output.append(",\n"); + printTransform(output, "head", linkToHudRenderer.itemCameraTransforms.head); + output.append(",\n"); + printTransform(output, "fixed", linkToHudRenderer.itemCameraTransforms.fixed); + output.append(",\n"); + printTransform(output, "ground", linkToHudRenderer.itemCameraTransforms.ground); + output.append("\n}"); + LOGGER.info(output); + Component text = Component.literal("\"display\" JSON section printed to console (LOGGER.info)..."); + Minecraft.getInstance().gui.getChat().addMessage(text); + } + } + } + + // points to the appropriate transform based on which transform has been selected. + private static ItemTransform getItemTransformRef(HUDTextRenderer.HUDInfoUpdateLink linkToHUDRenderer, + HUDTextRenderer.HUDInfoUpdateLink.TransformName transformName) { + return switch (transformName) { + case THIRD_LEFT -> linkToHUDRenderer.itemCameraTransforms.thirdPersonLeftHand; + case THIRD_RIGHT -> linkToHUDRenderer.itemCameraTransforms.thirdPersonRightHand; + case FIRST_LEFT -> linkToHUDRenderer.itemCameraTransforms.firstPersonLeftHand; + case FIRST_RIGHT -> linkToHUDRenderer.itemCameraTransforms.firstPersonRightHand; + case GUI -> linkToHUDRenderer.itemCameraTransforms.gui; + case HEAD -> linkToHUDRenderer.itemCameraTransforms.head; + case FIXED -> linkToHUDRenderer.itemCameraTransforms.fixed; + case GROUND -> linkToHUDRenderer.itemCameraTransforms.ground; + }; + } + + private void copySingleTransform(HUDTextRenderer.HUDInfoUpdateLink linkToHUDRenderer, BakedModel savedModel, + HUDTextRenderer.HUDInfoUpdateLink.TransformName transformToBeCopied) { + ItemTransform transformation = getItemTransformRef(linkToHUDRenderer, transformToBeCopied); + ItemTransforms.TransformType currentType = transformToBeCopied.getVanillaTransformType(); + ItemTransform transform = savedModel.getTransforms().getTransform(currentType); + copyTransforms(transform, transformation); + } + + private static void printTransform(StringBuilder output, String transformView, ItemTransform transformation) { + output.append(" \"").append(transformView).append("\": {\n"); + output.append(" \"rotation\": [ "); + output.append(String.format(Locale.US, "%.0f, ", transformation.rotation.x())); + output.append(String.format(Locale.US, "%.0f, ", transformation.rotation.y())); + output.append(String.format(Locale.US, "%.0f ],", transformation.rotation.z())); + output.append("\n"); + + final double TRANSLATE_MULTIPLIER = 1 / 0.0625; // see Transformation.Deserializer::deserialize + output.append(" \"translation\": [ "); + output.append(String.format(Locale.US, "%.2f, ", transformation.translation.x() * TRANSLATE_MULTIPLIER)); + output.append(String.format(Locale.US, "%.2f, ", transformation.translation.y() * TRANSLATE_MULTIPLIER)); + output.append(String.format(Locale.US, "%.2f ],", transformation.translation.z() * TRANSLATE_MULTIPLIER)); + output.append("\n"); + output.append(" \"scale\": [ "); + output.append(String.format(Locale.US, "%.2f, ", transformation.scale.x())); + output.append(String.format(Locale.US, "%.2f, ", transformation.scale.y())); + output.append(String.format(Locale.US, "%.2f ]", transformation.scale.z())); + output.append("\n }"); + } + + private static void copyTransforms(ItemTransform from, ItemTransform to) { + to.translation.load(from.translation); + to.scale.load(from.scale); + to.rotation.load(from.rotation); + } + + /** + * Intercept arrow keys and handle repeats + */ + public static class MenuKeyHandler { + + private final KeyPressCallback keyPressCallback; + private long keyDownTimeTicks = 0; + private ArrowKeys lastKey = ArrowKeys.NONE; + + public MenuKeyHandler(KeyPressCallback keyPressCallback) { + this.keyPressCallback = keyPressCallback; + } + + public void clientTick() { + ArrowKeys keyPressed = ArrowKeys.NONE; + if (isKeyDown(GLFW.GLFW_KEY_LEFT)) keyPressed = ArrowKeys.LEFT; + if (isKeyDown(GLFW.GLFW_KEY_RIGHT)) keyPressed = ArrowKeys.RIGHT; + if (isKeyDown(GLFW.GLFW_KEY_DOWN)) keyPressed = ArrowKeys.DOWN; + if (isKeyDown(GLFW.GLFW_KEY_UP)) keyPressed = ArrowKeys.UP; + + if (keyPressed == ArrowKeys.NONE) { + lastKey = ArrowKeys.NONE; + return; + } + if (keyPressed != lastKey) { + lastKey = keyPressed; + keyDownTimeTicks = 0; + } else { + ++keyDownTimeTicks; + final int INITIAL_PAUSE_TICKS = 10; // wait 10 ticks before repeating + if (keyDownTimeTicks < INITIAL_PAUSE_TICKS) return; + } + keyPressCallback.keyPressed(keyPressed); + } + + static boolean isKeyDown(int key) { + return GLFW.glfwGetKey(Minecraft.getInstance().getWindow().getWindow(), key) == GLFW.GLFW_PRESS; + } + + public enum ArrowKeys {NONE, UP, DOWN, LEFT, RIGHT} + + } + +} diff --git a/common/src/main/java/itemtransformhelper/ModelBakeEventHandler.java b/common/src/main/java/itemtransformhelper/ModelBakeEventHandler.java new file mode 100644 index 00000000..68cabc72 --- /dev/null +++ b/common/src/main/java/itemtransformhelper/ModelBakeEventHandler.java @@ -0,0 +1,51 @@ +package itemtransformhelper; + +import java.util.Map; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.resources.ResourceLocation; + +/** + * User: The Grey Ghost + * Date: 20/01/2015 + * We use the ModelBakeEvent to iterate through all the registered models, wrap each one in an + * ItemModelFlexibleCamera, and write it + * back into the registry. + * Each wrapped model gets a reference to ModelBakeEventHandler::itemOverrideLink. + * Later, we can alter the members of itemOverrideLink to change the ItemCameraTransforms for a desired Item + */ +public class ModelBakeEventHandler { + + private final ItemModelFlexibleCamera.UpdateLink itemOverrideLink = new ItemModelFlexibleCamera.UpdateLink(); + + public ModelBakeEventHandler() { + itemOverrideLink.forcedTransform = new ItemTransforms( + ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM, + ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM, + ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM, + ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM); + } + + public void modelBakeEvent(Map modelRegistry) { + for (ResourceLocation modelKey : modelRegistry.keySet()) { + BakedModel bakedModel = modelRegistry.get(modelKey); + ItemModelFlexibleCamera wrappedModel = ItemModelFlexibleCamera.create(bakedModel, itemOverrideLink); + modelRegistry.put(modelKey, wrappedModel); + } + + ItemTransformHelper.logger.warn("Warning - The Item Transform Helper replaces your BakedModels with a " + + "wrapped version, this"); + ItemTransformHelper.logger.warn(" is done even when the helper is not in your hotbar, and might cause " + + "problems if your"); + ItemTransformHelper.logger.warn(" BakedModel implements an interface ItemTransformHelper doesn't know about" + + "."); + ItemTransformHelper.logger.warn(" I recommend you disable the mod when you're not actively using it to " + + "transform your items."); + } + + public ItemModelFlexibleCamera.UpdateLink getItemOverrideLink() { + return itemOverrideLink; + } + +} diff --git a/common/src/main/java/itemtransformhelper/StartupClientOnly.java b/common/src/main/java/itemtransformhelper/StartupClientOnly.java new file mode 100644 index 00000000..1f87de88 --- /dev/null +++ b/common/src/main/java/itemtransformhelper/StartupClientOnly.java @@ -0,0 +1,29 @@ +package itemtransformhelper; + +import dev.architectury.injectables.annotations.ExpectPlatform; + +/** + * User: The Grey Ghost + * Date: 24/12/2014 + *

+ * The Startup classes for this example are called during startup, in the following order: + * preInitCommon + * preInitClientOnly + * initCommon + * initClientOnly + * postInitCommon + * postInitClientOnly + * See MinecraftByExample class for more information + */ +public class StartupClientOnly { + + public static final ModelBakeEventHandler modelBakeEventHandler = new ModelBakeEventHandler(); + public static final ClientTickHandler clientTickHandler = new ClientTickHandler(); + public static final MenuItemCameraTransforms menuItemCameraTransforms = new MenuItemCameraTransforms(); + + @ExpectPlatform + public static void clientSetup() { + throw new UnsupportedOperationException(); + } + +} diff --git a/common/src/main/java/itemtransformhelper/StartupCommon.java b/common/src/main/java/itemtransformhelper/StartupCommon.java new file mode 100644 index 00000000..92696c48 --- /dev/null +++ b/common/src/main/java/itemtransformhelper/StartupCommon.java @@ -0,0 +1,43 @@ +package itemtransformhelper; + +import dev.architectury.registry.CreativeTabRegistry; +import dev.architectury.registry.registries.DeferredRegister; +import dev.architectury.registry.registries.RegistrySupplier; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import static itemtransformhelper.ItemTransformHelper.MODID; + +/** + * User: The Grey Ghost + * Date: 24/12/2014 + *

+ * The Startup classes for this example are called during startup, in the following order: + * preInitCommon + * preInitClientOnly + * initCommon + * initClientOnly + * postInitCommon + * postInitClientOnly + * See MinecraftByExample class for more information + */ +public class StartupCommon { + + // Registries + public static final DeferredRegister ITEMS = DeferredRegister.create(MODID, Registry.ITEM_REGISTRY); + + // Items + public static final RegistrySupplier ITEM_CAMERA = ITEMS.register("item_camera", ItemCamera::new); + + // Item Groups + public static final CreativeModeTab ITH_ITEM_GROUP = + CreativeTabRegistry.create(new ResourceLocation(MODID, "items"), () -> new ItemStack(ITEM_CAMERA.get())); + + public static void init() { + ITEMS.register(); + } + +} diff --git a/src/main/java/itemtransformhelper/Notes.txt b/common/src/main/resources/Notes.txt similarity index 59% rename from src/main/java/itemtransformhelper/Notes.txt rename to common/src/main/resources/Notes.txt index 8ac0cf56..ca4b195a 100644 --- a/src/main/java/itemtransformhelper/Notes.txt +++ b/common/src/main/resources/Notes.txt @@ -1,20 +1,20 @@ -ITEM_TRANSFORM_HELPER +Item Transform Helper -When you create a custom item, you need to provide ItemCameraTransforms for it. This example is an interactive - tool to help you get the transforms right. +When you create a custom item, you need to provide ItemCameraTransforms for it. This project is an interactive + tool to help you get the transforms right by interactively adjusting them. How to use: -1) Place the ItemCamera somewhere in the player's hotbar +1) Place the Camera item somewhere in the player's hotbar 2) Hold the Item you want to modify in the player's hand 3) Use the up/down keys to move up and down the menu. -4) Use the left/right keys to edit the value (eg scaleX) -5) To select a different view (eg first person, third person) use left/right to change the VIEW menu item. +4) Use the left/right keys to edit the value (e.g. scaleX) +5) To select a different view (e.g. first person, third person) use left/right to change the VIEW menu item. 6) To modify the transform for an item on the ground: - a) throw your Item onto the ground, and then put another copy of your Item into the player's hand + a) Throw your Item onto the ground, and then put another copy of your Item into the player's hand b) Use left/right to change the VIEW menu item to grnd Use the same technique for items in the gui, on your head (eg pumpkin), fixed (in picture frames), or in the player's left hand. -7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views. +7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views. You can also copy parameters from a vanilla item to your custom item: a) Hold the vanilla item in your hand b) Select RESET or RSTALL, press left or right. @@ -25,7 +25,7 @@ How to use: The item will appear in the Helpers tab in the creative inventory. For background information on -- items: see here http://greyminecraftcoder.blogspot.com/2013/12/items.html -- rendering items: see here http://greyminecraftcoder.blogspot.com.au/2014/12/item-rendering-18.html +- Items: see here https://greyminecraftcoder.blogspot.com/2013/12/items.html +- Rendering items: see here https://greyminecraftcoder.blogspot.com/2014/12/item-rendering-18.html - This link describes the structure of the JSON Item Model file (see the Item Models section halfway down): - http://minecraft.gamepedia.com/Block_models + https://minecraft.fandom.com/wiki/Model#Item_models diff --git a/common/src/main/resources/assets/itemtransformhelper/lang/en_us.json b/common/src/main/resources/assets/itemtransformhelper/lang/en_us.json new file mode 100644 index 00000000..3dfc125b --- /dev/null +++ b/common/src/main/resources/assets/itemtransformhelper/lang/en_us.json @@ -0,0 +1,4 @@ +{ + "item.itemtransformhelper.item_camera": "Item Transform Helper", + "itemGroup.itemtransformhelper.items": "Item Transform Helper" +} diff --git a/common/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json b/common/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json new file mode 100644 index 00000000..464edba8 --- /dev/null +++ b/common/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json @@ -0,0 +1,144 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "itemtransformhelper:items/item_camera_icon" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ + 0, + 0, + 0 + ], + "translation": [ + 0.00, + 3.00, + 1.00 + ], + "scale": [ + 0.55, + 0.55, + 0.55 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 0, + 0, + 0 + ], + "translation": [ + 0.00, + 3.00, + 1.00 + ], + "scale": [ + 0.55, + 0.55, + 0.55 + ] + }, + "firstperson_righthand": { + "rotation": [ + -25, + -90, + 0 + ], + "translation": [ + 1.13, + 3.20, + 1.13 + ], + "scale": [ + 0.68, + 0.68, + 0.68 + ] + }, + "firstperson_lefthand": { + "rotation": [ + -25, + -90, + 0 + ], + "translation": [ + 1.13, + 3.20, + 1.13 + ], + "scale": [ + 0.68, + 0.68, + 0.68 + ] + }, + "gui": { + "rotation": [ + 0, + 0, + 0 + ], + "translation": [ + 0.00, + 0.00, + 0.00 + ], + "scale": [ + 1.00, + 1.00, + 1.00 + ] + }, + "head": { + "rotation": [ + -180, + -0, + -180 + ], + "translation": [ + -0.00, + 13.00, + 7.00 + ], + "scale": [ + 1.00, + 1.00, + 1.00 + ] + }, + "fixed": { + "rotation": [ + 0, + 0, + 0 + ], + "translation": [ + 0.00, + 0.00, + 0.00 + ], + "scale": [ + 1.00, + 1.00, + 1.00 + ] + }, + "ground": { + "rotation": [ + 0, + 0, + 0 + ], + "translation": [ + 0.00, + 2.00, + 0.00 + ], + "scale": [ + 0.50, + 0.50, + 0.50 + ] + } + } +} diff --git a/src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png b/common/src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png similarity index 100% rename from src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png rename to common/src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png diff --git a/fabric-like/build.gradle b/fabric-like/build.gradle new file mode 100644 index 00000000..ef34aacc --- /dev/null +++ b/fabric-like/build.gradle @@ -0,0 +1,12 @@ +architectury { + common(rootProject.enabled_platforms.split(",")) +} + +dependencies { + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" + // Remove the next line if you don't want to depend on the API + modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" + + compileClasspath(project(path: ":common", configuration: "namedElements")) { transitive false } +} diff --git a/fabric-like/src/main/java/itemtransformhelper.fabriclike/ItemTransformHelperFabricLike.java b/fabric-like/src/main/java/itemtransformhelper.fabriclike/ItemTransformHelperFabricLike.java new file mode 100644 index 00000000..5ce92428 --- /dev/null +++ b/fabric-like/src/main/java/itemtransformhelper.fabriclike/ItemTransformHelperFabricLike.java @@ -0,0 +1,13 @@ +package itemtransformhelper.fabriclike; + +import itemtransformhelper.ItemTransformHelper; +import itemtransformhelper.StartupClientOnly; + +public class ItemTransformHelperFabricLike { + + public static void init() { + ItemTransformHelper.init(); + StartupClientOnly.clientSetup(); + } + +} diff --git a/fabric/build.gradle b/fabric/build.gradle new file mode 100644 index 00000000..3c8f1520 --- /dev/null +++ b/fabric/build.gradle @@ -0,0 +1,77 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +architectury { + platformSetupLoomIde() + fabric() +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentFabric.extendsFrom common +} + +dependencies { + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" + // Remove the next line if you don't want to depend on the API + modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } + common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":fabric-like", configuration: "transformProductionFabric")) { transitive false } +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +shadowJar { + configurations = [project.configurations.shadowCommon] + classifier "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar + classifier null +} + +jar { + classifier "dev" +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenFabric(MavenPublication) { + artifactId = rootProject.archives_base_name + "-" + project.name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} diff --git a/fabric/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java b/fabric/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java new file mode 100644 index 00000000..088913b1 --- /dev/null +++ b/fabric/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java @@ -0,0 +1,17 @@ +package itemtransformhelper.fabric; + +import itemtransformhelper.ItemModelFlexibleCamera; +import net.minecraft.client.resources.model.BakedModel; + +public class ItemModelFlexibleCameraImpl extends ItemModelFlexibleCamera { + + public ItemModelFlexibleCameraImpl(BakedModel originalModel, UpdateLink updateLink) { + super(originalModel, updateLink); + } + + public static ItemModelFlexibleCamera create(BakedModel originalModel, + ItemModelFlexibleCamera.UpdateLink updateLink) { + return new ItemModelFlexibleCameraImpl(originalModel, updateLink); + } + +} diff --git a/fabric/src/main/java/itemtransformhelper/fabric/ItemTransformHelperFabric.java b/fabric/src/main/java/itemtransformhelper/fabric/ItemTransformHelperFabric.java new file mode 100644 index 00000000..333f8a66 --- /dev/null +++ b/fabric/src/main/java/itemtransformhelper/fabric/ItemTransformHelperFabric.java @@ -0,0 +1,13 @@ +package itemtransformhelper.fabric; + +import itemtransformhelper.fabriclike.ItemTransformHelperFabricLike; +import net.fabricmc.api.ModInitializer; + +public class ItemTransformHelperFabric implements ModInitializer { + + @Override + public void onInitialize() { + ItemTransformHelperFabricLike.init(); + } + +} diff --git a/fabric/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java b/fabric/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java new file mode 100644 index 00000000..3db5b742 --- /dev/null +++ b/fabric/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java @@ -0,0 +1,19 @@ +package itemtransformhelper.fabric; + +import itemtransformhelper.HUDTextRenderer; +import itemtransformhelper.MenuItemCameraTransforms; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class MenuItemCameraTransformsImpl { + + public static Queue RENDERERS = new ConcurrentLinkedQueue<>(); + public static Queue HANDLERS = new ConcurrentLinkedQueue<>(); + + public static void registerListeners(HUDTextRenderer hudTextRenderer, + MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) { + RENDERERS.offer(hudTextRenderer); + HANDLERS.offer(menuKeyHandler); + } + +} diff --git a/fabric/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java b/fabric/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java new file mode 100644 index 00000000..2ffd9ac4 --- /dev/null +++ b/fabric/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java @@ -0,0 +1,11 @@ +package itemtransformhelper.fabric; + +public class StartupClientOnlyImpl { + + public static void clientSetup() { + // Nothing to do here as this handled by these mixins: + // BakedModelManagerMixin + // MinecraftClientMixin + } + +} diff --git a/fabric/src/main/java/itemtransformhelper/fabric/mixin/GuiMixin.java b/fabric/src/main/java/itemtransformhelper/fabric/mixin/GuiMixin.java new file mode 100644 index 00000000..236503be --- /dev/null +++ b/fabric/src/main/java/itemtransformhelper/fabric/mixin/GuiMixin.java @@ -0,0 +1,21 @@ +package itemtransformhelper.fabric.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.Gui; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static itemtransformhelper.fabric.MenuItemCameraTransformsImpl.RENDERERS; + +@Mixin(Gui.class) +public class GuiMixin { + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;renderEffects" + + "(Lcom/mojang/blaze3d/vertex/PoseStack;)V")) + public void render(PoseStack matrices, float tickDelta, CallbackInfo ci) { + RENDERERS.forEach(r -> r.displayHUDText(matrices)); + } + +} diff --git a/fabric/src/main/java/itemtransformhelper/fabric/mixin/MinecraftMixin.java b/fabric/src/main/java/itemtransformhelper/fabric/mixin/MinecraftMixin.java new file mode 100644 index 00000000..0dad52d4 --- /dev/null +++ b/fabric/src/main/java/itemtransformhelper/fabric/mixin/MinecraftMixin.java @@ -0,0 +1,24 @@ +package itemtransformhelper.fabric.mixin; + +import itemtransformhelper.MenuItemCameraTransforms; +import net.minecraft.client.Minecraft; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static itemtransformhelper.StartupClientOnly.clientTickHandler; +import static itemtransformhelper.fabric.MenuItemCameraTransformsImpl.HANDLERS; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Inject(method = "tick", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;" + + ")V")) + public void tick(CallbackInfo ci) { + clientTickHandler.clientTickEvent(); + HANDLERS.forEach(MenuItemCameraTransforms.MenuKeyHandler::clientTick); + } + +} diff --git a/fabric/src/main/java/itemtransformhelper/fabric/mixin/ModelManagerMixin.java b/fabric/src/main/java/itemtransformhelper/fabric/mixin/ModelManagerMixin.java new file mode 100644 index 00000000..c44b7aae --- /dev/null +++ b/fabric/src/main/java/itemtransformhelper/fabric/mixin/ModelManagerMixin.java @@ -0,0 +1,33 @@ +package itemtransformhelper.fabric.mixin; + +import java.util.Map; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static itemtransformhelper.StartupClientOnly.modelBakeEventHandler; + +@Mixin(ModelManager.class) +public class ModelManagerMixin { + + @Shadow + private Map bakedRegistry; + + @Inject(method = "apply(Lnet/minecraft/client/resources/model/ModelBakery;" + + "Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush" + + "(Ljava/lang/String;)V")) + public void apply(ModelBakery modelLoader, ResourceManager resourceManager, ProfilerFiller profiler, + CallbackInfo ci) { + modelBakeEventHandler.modelBakeEvent(bakedRegistry); + } + +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..ef9c522c --- /dev/null +++ b/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,34 @@ +{ + "schemaVersion": 1, + "id": "itemtransformhelper", + "version": "${version}", + "name": "Item Transform Helper", + "description": "Interactively change the position, scale, and rotation of an item.", + "authors": [ + "TGG", + "ThexXTURBOXx", + "Romejanic", + "lehjr" + ], + "contact": { + "homepage": "https://www.planetminecraft.com/mod/item-transform-helper---interactively-rotate-scale-translate/", + "sources": "https://github.com/TheGreyGhost/ItemTransformHelper", + "issues": "https://github.com/TheGreyGhost/ItemTransformHelper/issues" + }, + "license": "All rights reserved", + "environment": "*", + "entrypoints": { + "main": [ + "itemtransformhelper.fabric.ItemTransformHelperFabric" + ] + }, + "mixins": [ + "itemtransformhelper.mixins.json" + ], + "depends": { + "minecraft": ">=1.19", + "fabricloader": ">=0.14.7", + "fabric": "*", + "architectury": ">=5.6.22" + } +} diff --git a/fabric/src/main/resources/itemtransformhelper.mixins.json b/fabric/src/main/resources/itemtransformhelper.mixins.json new file mode 100644 index 00000000..adf02d3b --- /dev/null +++ b/fabric/src/main/resources/itemtransformhelper.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "itemtransformhelper.fabric.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + "GuiMixin", + "MinecraftMixin", + "ModelManagerMixin" + ], + "mixins": [], + "server": [], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/forge/build.gradle b/forge/build.gradle new file mode 100644 index 00000000..8b93a128 --- /dev/null +++ b/forge/build.gradle @@ -0,0 +1,76 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +architectury { + platformSetupLoomIde() + forge() +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentForge.extendsFrom common +} + +dependencies { + forge "net.minecraftforge:forge:${rootProject.forge_version}" + // Remove the next line if you don't want to depend on the API + modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}" + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } +} + +processResources { + inputs.property "version", project.version + + filesMatching("META-INF/mods.toml") { + expand "version": project.version + } +} + +shadowJar { + exclude "fabric.mod.json" + + configurations = [project.configurations.shadowCommon] + classifier "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar + classifier null +} + +jar { + classifier "dev" +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenForge(MavenPublication) { + artifactId = rootProject.archives_base_name + "-" + project.name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} diff --git a/forge/gradle.properties b/forge/gradle.properties new file mode 100644 index 00000000..a58ba141 --- /dev/null +++ b/forge/gradle.properties @@ -0,0 +1 @@ +loom.platform = forge diff --git a/forge/src/main/java/itemtransformhelper/forge/ItemModelFlexibleCameraImpl.java b/forge/src/main/java/itemtransformhelper/forge/ItemModelFlexibleCameraImpl.java new file mode 100644 index 00000000..bcba8366 --- /dev/null +++ b/forge/src/main/java/itemtransformhelper/forge/ItemModelFlexibleCameraImpl.java @@ -0,0 +1,39 @@ +package itemtransformhelper.forge; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Transformation; +import itemtransformhelper.ItemModelFlexibleCamera; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraftforge.common.model.TransformationHelper; +import org.jetbrains.annotations.NotNull; + +public class ItemModelFlexibleCameraImpl extends ItemModelFlexibleCamera { + + public ItemModelFlexibleCameraImpl(BakedModel originalModel, UpdateLink updateLink) { + super(originalModel, updateLink); + } + + public static ItemModelFlexibleCamera create(BakedModel originalModel, + ItemModelFlexibleCamera.UpdateLink updateLink) { + return new ItemModelFlexibleCameraImpl(originalModel, updateLink); + } + + @NotNull + @Override + @SuppressWarnings("deprecation") + public BakedModel handlePerspective(@NotNull ItemTransforms.TransformType cameraTransformType, + @NotNull PoseStack poseStack) { + if (updateLink.itemModelToOverride == this) { + Transformation tr = + TransformationHelper.toTransformation(getTransforms().getTransform(cameraTransformType)); + if (!tr.isIdentity()) { + tr.push(poseStack); + } + return this; + } else { + return super.handlePerspective(cameraTransformType, poseStack); + } + } + +} diff --git a/src/main/java/itemtransformhelper/ItemTransformHelper.java b/forge/src/main/java/itemtransformhelper/forge/ItemTransformHelperForge.java similarity index 66% rename from src/main/java/itemtransformhelper/ItemTransformHelper.java rename to forge/src/main/java/itemtransformhelper/forge/ItemTransformHelperForge.java index f99b0d05..a4a4a1b2 100644 --- a/src/main/java/itemtransformhelper/ItemTransformHelper.java +++ b/forge/src/main/java/itemtransformhelper/forge/ItemTransformHelperForge.java @@ -1,20 +1,22 @@ -package itemtransformhelper; +package itemtransformhelper.forge; +import dev.architectury.platform.forge.EventBuses; +import itemtransformhelper.ItemTransformHelper; +import itemtransformhelper.StartupClientOnly; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -@Mod(ItemTransformHelper.MODID) -public class ItemTransformHelper { - public static final String MODID = "itemtransformhelper"; - public static final Logger logger = LogManager.getLogger(MODID); +import static itemtransformhelper.ItemTransformHelper.MODID; - public ItemTransformHelper() { +@Mod(MODID) +public class ItemTransformHelperForge { + + public ItemTransformHelperForge() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + EventBuses.registerModEventBus(MODID, modEventBus); // Register the setup method for modloading modEventBus.addListener(this::setup); @@ -22,7 +24,7 @@ public ItemTransformHelper() { // Register the doClientStuff method for modloading modEventBus.addListener(this::clientSetup); - StartupCommon.ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus()); + ItemTransformHelper.init(); } private void setup(final FMLCommonSetupEvent event) { @@ -32,4 +34,5 @@ private void setup(final FMLCommonSetupEvent event) { public void clientSetup(final FMLClientSetupEvent event) { StartupClientOnly.clientSetup(); } + } diff --git a/forge/src/main/java/itemtransformhelper/forge/MenuItemCameraTransformsImpl.java b/forge/src/main/java/itemtransformhelper/forge/MenuItemCameraTransformsImpl.java new file mode 100644 index 00000000..a0ddbe65 --- /dev/null +++ b/forge/src/main/java/itemtransformhelper/forge/MenuItemCameraTransformsImpl.java @@ -0,0 +1,38 @@ +package itemtransformhelper.forge; + +import itemtransformhelper.HUDTextRenderer; +import itemtransformhelper.MenuItemCameraTransforms; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class MenuItemCameraTransformsImpl { + + private final HUDTextRenderer hudTextRenderer; + private final MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler; + + public MenuItemCameraTransformsImpl(HUDTextRenderer hudTextRenderer, + MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) { + this.hudTextRenderer = hudTextRenderer; + this.menuKeyHandler = menuKeyHandler; + } + + public static void registerListeners(HUDTextRenderer hudTextRenderer, + MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) { + MinecraftForge.EVENT_BUS.register(new MenuItemCameraTransformsImpl(hudTextRenderer, menuKeyHandler)); + } + + @SubscribeEvent + public void displayHUDText(RenderGameOverlayEvent.Text event) { + hudTextRenderer.displayHUDText(event.getPoseStack()); + } + + @SubscribeEvent + public void clientTick(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + menuKeyHandler.clientTick(); + } + } + +} diff --git a/forge/src/main/java/itemtransformhelper/forge/StartupClientOnlyImpl.java b/forge/src/main/java/itemtransformhelper/forge/StartupClientOnlyImpl.java new file mode 100644 index 00000000..70fba62e --- /dev/null +++ b/forge/src/main/java/itemtransformhelper/forge/StartupClientOnlyImpl.java @@ -0,0 +1,32 @@ +package itemtransformhelper.forge; + +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import static itemtransformhelper.StartupClientOnly.clientTickHandler; +import static itemtransformhelper.StartupClientOnly.modelBakeEventHandler; + +public class StartupClientOnlyImpl { + + public static void clientSetup() { + StartupClientOnlyImpl instance = new StartupClientOnlyImpl(); + FMLJavaModLoadingContext.get().getModEventBus().addListener(instance::modelBakeEvent); + MinecraftForge.EVENT_BUS.register(instance); + } + + @SubscribeEvent + public void modelBakeEvent(ModelBakeEvent event) { + modelBakeEventHandler.modelBakeEvent(event.getModelRegistry()); + } + + @SubscribeEvent + public void clientTickEvent(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + clientTickHandler.clientTickEvent(); + } + } + +} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..ba0f2e8c --- /dev/null +++ b/forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,34 @@ +modLoader = "javafml" +loaderVersion = "[41,)" +issueTrackerURL = "https://github.com/TheGreyGhost/ItemTransformHelper" +license = "All rights reserved" + +[[mods]] +modId = "itemtransformhelper" +version = "${version}" +displayName = "Item Transform Helper" +authors = "TGG, ThexXTURBOXx, Romejanic, lehjr" +description = ''' +Interactively change the position, scale, and rotation of an item. +''' + +[[dependencies.itemtransformhelper]] +modId = "forge" +mandatory = true +versionRange = "[41,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.itemtransformhelper]] +modId = "minecraft" +mandatory = true +versionRange = "[1.19,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.itemtransformhelper]] +modId = "architectury" +mandatory = true +versionRange = "[5.6.22,)" +ordering = "AFTER" +side = "BOTH" diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..276f749e --- /dev/null +++ b/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "ItemTransformHelper resources", + "pack_format": 9 + } +} diff --git a/gradle.properties b/gradle.properties index 878bf1f7..15f13887 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,18 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -# This is required to provide enough memory for the Minecraft decompilation process. -org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false \ No newline at end of file +org.gradle.jvmargs = -Xmx4G + +minecraft_version = 1.19 +enabled_platforms = quilt,fabric,forge + +archives_base_name = itemtransformhelper +mod_version = 1.0 +maven_group = thegreyghost + +architectury_version = 5.6.22 + +fabric_loader_version = 0.14.7 +fabric_api_version = 0.55.3+1.19 + +forge_version = 1.19-41.0.17 + +quilt_loader_version = 0.17.0 +quilt_fabric_api_version = 2.0.0-alpha.2+0.55.3-1.19 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7a3265ee..41d9927a 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1d5b29fb..aa991fce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip diff --git a/gradlew b/gradlew index cccdd3d5..1b6c7873 100755 --- a/gradlew +++ b/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/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 UN*X -## +# +# 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 -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +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 -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +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="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +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 - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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 @@ -89,84 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +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 -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# 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" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + 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 - i=$((i+1)) + # 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 - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -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 index e95643d6..ac1b06f9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@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 @@ -13,15 +29,18 @@ 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= +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 init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :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 %CMD_LINE_ARGS% +"%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 diff --git a/quilt/build.gradle b/quilt/build.gradle new file mode 100644 index 00000000..3fb1bf54 --- /dev/null +++ b/quilt/build.gradle @@ -0,0 +1,88 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +repositories { + maven { url "https://maven.quiltmc.org/repository/release/" } +} + +architectury { + platformSetupLoomIde() + loader("quilt") +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentQuilt.extendsFrom common +} + +dependencies { + modImplementation "org.quiltmc:quilt-loader:${rootProject.quilt_loader_version}" + modApi "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${rootProject.quilt_fabric_api_version}" + // Remove the next few lines if you don't want to depend on the API + modApi("dev.architectury:architectury-fabric:${rootProject.architectury_version}") { + // We must not pull Fabric Loader from Architectury Fabric + exclude group: "net.fabricmc" + exclude group: "net.fabricmc.fabric-api" + } + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionQuilt")) { transitive false } + common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":fabric-like", configuration: "transformProductionQuilt")) { transitive false } +} + +processResources { + inputs.property "group", rootProject.maven_group + inputs.property "version", project.version + + filesMatching("quilt.mod.json") { + expand "group": rootProject.maven_group, + "version": project.version + } +} + +shadowJar { + configurations = [project.configurations.shadowCommon] + classifier "dev-shadow" +} + +remapJar { + injectAccessWidener = true + input.set shadowJar.archiveFile + dependsOn shadowJar + classifier null +} + +jar { + classifier "dev" +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenQuilt(MavenPublication) { + artifactId = rootProject.archives_base_name + "-" + project.name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} diff --git a/quilt/gradle.properties b/quilt/gradle.properties new file mode 100644 index 00000000..96758ce8 --- /dev/null +++ b/quilt/gradle.properties @@ -0,0 +1 @@ +loom.platform=quilt \ No newline at end of file diff --git a/quilt/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java b/quilt/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java new file mode 100644 index 00000000..2781dda2 --- /dev/null +++ b/quilt/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java @@ -0,0 +1,17 @@ +package itemtransformhelper.fabric; + +import itemtransformhelper.ItemModelFlexibleCamera; +import net.minecraft.client.resources.model.BakedModel; + +public class ItemModelFlexibleCameraImpl extends ItemModelFlexibleCamera { + + public ItemModelFlexibleCameraImpl(BakedModel originalModel, UpdateLink updateLink) { + super(originalModel, updateLink); + } + + public static ItemModelFlexibleCamera create(BakedModel originalModel, + UpdateLink updateLink) { + return new ItemModelFlexibleCameraImpl(originalModel, updateLink); + } + +} diff --git a/quilt/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java b/quilt/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java new file mode 100644 index 00000000..3db5b742 --- /dev/null +++ b/quilt/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java @@ -0,0 +1,19 @@ +package itemtransformhelper.fabric; + +import itemtransformhelper.HUDTextRenderer; +import itemtransformhelper.MenuItemCameraTransforms; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class MenuItemCameraTransformsImpl { + + public static Queue RENDERERS = new ConcurrentLinkedQueue<>(); + public static Queue HANDLERS = new ConcurrentLinkedQueue<>(); + + public static void registerListeners(HUDTextRenderer hudTextRenderer, + MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) { + RENDERERS.offer(hudTextRenderer); + HANDLERS.offer(menuKeyHandler); + } + +} diff --git a/quilt/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java b/quilt/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java new file mode 100644 index 00000000..2ffd9ac4 --- /dev/null +++ b/quilt/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java @@ -0,0 +1,11 @@ +package itemtransformhelper.fabric; + +public class StartupClientOnlyImpl { + + public static void clientSetup() { + // Nothing to do here as this handled by these mixins: + // BakedModelManagerMixin + // MinecraftClientMixin + } + +} diff --git a/quilt/src/main/java/itemtransformhelper/quilt/ItemTransformHelperQuilt.java b/quilt/src/main/java/itemtransformhelper/quilt/ItemTransformHelperQuilt.java new file mode 100644 index 00000000..ef8f7284 --- /dev/null +++ b/quilt/src/main/java/itemtransformhelper/quilt/ItemTransformHelperQuilt.java @@ -0,0 +1,14 @@ +package itemtransformhelper.quilt; + +import itemtransformhelper.fabriclike.ItemTransformHelperFabricLike; +import org.quiltmc.loader.api.ModContainer; +import org.quiltmc.qsl.base.api.entrypoint.ModInitializer; + +public class ItemTransformHelperQuilt implements ModInitializer { + + @Override + public void onInitialize(ModContainer mod) { + ItemTransformHelperFabricLike.init(); + } + +} diff --git a/quilt/src/main/java/itemtransformhelper/quilt/mixin/GuiMixin.java b/quilt/src/main/java/itemtransformhelper/quilt/mixin/GuiMixin.java new file mode 100644 index 00000000..1c3583f5 --- /dev/null +++ b/quilt/src/main/java/itemtransformhelper/quilt/mixin/GuiMixin.java @@ -0,0 +1,20 @@ +package itemtransformhelper.quilt.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; +import itemtransformhelper.fabric.MenuItemCameraTransformsImpl; +import net.minecraft.client.gui.Gui; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Gui.class) +public class GuiMixin { + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;renderEffects" + + "(Lcom/mojang/blaze3d/vertex/PoseStack;)V")) + public void render(PoseStack matrices, float tickDelta, CallbackInfo ci) { + MenuItemCameraTransformsImpl.RENDERERS.forEach(r -> r.displayHUDText(matrices)); + } + +} diff --git a/quilt/src/main/java/itemtransformhelper/quilt/mixin/MinecraftMixin.java b/quilt/src/main/java/itemtransformhelper/quilt/mixin/MinecraftMixin.java new file mode 100644 index 00000000..96848541 --- /dev/null +++ b/quilt/src/main/java/itemtransformhelper/quilt/mixin/MinecraftMixin.java @@ -0,0 +1,24 @@ +package itemtransformhelper.quilt.mixin; + +import itemtransformhelper.MenuItemCameraTransforms; +import net.minecraft.client.Minecraft; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static itemtransformhelper.StartupClientOnly.clientTickHandler; +import static itemtransformhelper.fabric.MenuItemCameraTransformsImpl.HANDLERS; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Inject(method = "tick", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;" + + ")V")) + public void tick(CallbackInfo ci) { + clientTickHandler.clientTickEvent(); + HANDLERS.forEach(MenuItemCameraTransforms.MenuKeyHandler::clientTick); + } + +} diff --git a/quilt/src/main/java/itemtransformhelper/quilt/mixin/ModelManagerMixin.java b/quilt/src/main/java/itemtransformhelper/quilt/mixin/ModelManagerMixin.java new file mode 100644 index 00000000..c77ddfbb --- /dev/null +++ b/quilt/src/main/java/itemtransformhelper/quilt/mixin/ModelManagerMixin.java @@ -0,0 +1,33 @@ +package itemtransformhelper.quilt.mixin; + +import java.util.Map; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static itemtransformhelper.StartupClientOnly.modelBakeEventHandler; + +@Mixin(ModelManager.class) +public class ModelManagerMixin { + + @Shadow + private Map bakedRegistry; + + @Inject(method = "apply(Lnet/minecraft/client/resources/model/ModelBakery;" + + "Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush" + + "(Ljava/lang/String;)V")) + public void apply(ModelBakery modelLoader, ResourceManager resourceManager, ProfilerFiller profiler, + CallbackInfo ci) { + modelBakeEventHandler.modelBakeEvent(bakedRegistry); + } + +} diff --git a/quilt/src/main/resources/itemtransformhelper.mixins.json b/quilt/src/main/resources/itemtransformhelper.mixins.json new file mode 100644 index 00000000..0c0f20f9 --- /dev/null +++ b/quilt/src/main/resources/itemtransformhelper.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "itemtransformhelper.quilt.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + "GuiMixin", + "MinecraftMixin", + "ModelManagerMixin" + ], + "mixins": [], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/quilt/src/main/resources/quilt.mod.json b/quilt/src/main/resources/quilt.mod.json new file mode 100644 index 00000000..0ceb591a --- /dev/null +++ b/quilt/src/main/resources/quilt.mod.json @@ -0,0 +1,50 @@ +{ + "schema_version": 1, + "mixin": [ + "itemtransformhelper.mixins.json" + ], + "quilt_loader": { + "group": "${group}", + "id": "itemtransformhelper", + "version": "${version}", + "name": "Item Transform Helper", + "description": "Interactively change the position, scale, and rotation of an item.", + "authors": [ + "TGG", + "ThexXTURBOXx", + "Romejanic", + "lehjr" + ], + "contact": { + "homepage": "https://www.planetminecraft.com/mod/item-transform-helper---interactively-rotate-scale-translate/", + "sources": "https://github.com/TheGreyGhost/ItemTransformHelper", + "issues": "https://github.com/TheGreyGhost/ItemTransformHelper/issues" + }, + "license": "All rights reserved", + "intermediate_mappings": "net.fabricmc:intermediary", + "environment": "*", + "entrypoints": { + "init": [ + "itemtransformhelper.quilt.ItemTransformHelperQuilt" + ] + }, + "depends": [ + { + "id": "quilt_loader", + "version": "*" + }, + { + "id": "quilt_base", + "version": "*" + }, + { + "id": "minecraft", + "version": ">=1.19" + }, + { + "id": "architectury", + "version": ">=5.6.22" + } + ] + } +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..169cca43 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + maven { url "https://maven.fabricmc.net/" } + maven { url "https://maven.architectury.dev/" } + maven { url "https://maven.minecraftforge.net/" } + gradlePluginPortal() + } +} + +include("common") +include("fabric-like") +include("fabric") +include("quilt") +include("forge") + +rootProject.name = "itemtransformhelper" diff --git a/src/main/java/itemtransformhelper/ClientTickHandler.java b/src/main/java/itemtransformhelper/ClientTickHandler.java deleted file mode 100644 index 9c14aab9..00000000 --- a/src/main/java/itemtransformhelper/ClientTickHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -package itemtransformhelper; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Hand; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -/** - * User: The Grey Ghost - * Date: 2/11/13 - * Every tick, check all the items in the hotbar to see if any are the camera If so, apply the transform - * override to the held item. - */ -@SuppressWarnings("deprecation") -public class ClientTickHandler { - @SubscribeEvent - public void clientTickEvent(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.START) { - return; - } - - ClientPlayerEntity player = Minecraft.getInstance().player; - if (player == null) return; - - boolean foundCamera = false; - PlayerInventory inventoryPlayer = player.inventory; - for (int i = 0; i < PlayerInventory.getHotbarSize(); ++i) { - ItemStack slotItemStack = inventoryPlayer.mainInventory.get(i); - if (slotItemStack.getItem() == StartupCommon.ITEM_CAMERA.get()) { - foundCamera = true; - break; - } - } - StartupClientOnly.menuItemCameraTransforms.changeMenuVisible(foundCamera); - - IBakedModel ibakedmodel = null; - if (foundCamera) { - ItemStack heldItemStack = player.getHeldItem(Hand.MAIN_HAND); - if (heldItemStack.isEmpty()) { - heldItemStack = player.getHeldItem(Hand.OFF_HAND); - } - if (!heldItemStack.isEmpty()) { - ibakedmodel = Minecraft.getInstance().getItemRenderer().getItemModelMesher().getItemModel(heldItemStack); - } - } - - ItemModelFlexibleCamera.UpdateLink link = StartupClientOnly.modelBakeEventHandler.getItemOverrideLink(); - link.itemModelToOverride = ibakedmodel; - link.forcedTransform = StartupClientOnly.menuItemCameraTransforms.getItemCameraTransforms(); - } -} diff --git a/src/main/java/itemtransformhelper/CreativeTabITH.java b/src/main/java/itemtransformhelper/CreativeTabITH.java deleted file mode 100644 index 833596f8..00000000 --- a/src/main/java/itemtransformhelper/CreativeTabITH.java +++ /dev/null @@ -1,22 +0,0 @@ -package itemtransformhelper; - -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -/** - * User: The Grey Ghost - * Date: 26/01/2015 - */ -public class CreativeTabITH extends ItemGroup { - public CreativeTabITH(String unlocalizedName) { - super(unlocalizedName); - } - - @OnlyIn(Dist.CLIENT) - @Override - public ItemStack createIcon() { - return new ItemStack(StartupCommon.ITEM_CAMERA.get()); - } -} \ No newline at end of file diff --git a/src/main/java/itemtransformhelper/HUDtextRenderer.java b/src/main/java/itemtransformhelper/HUDtextRenderer.java deleted file mode 100644 index 85f1eff6..00000000 --- a/src/main/java/itemtransformhelper/HUDtextRenderer.java +++ /dev/null @@ -1,300 +0,0 @@ -package itemtransformhelper; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.model.ItemTransformVec3f; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -import java.util.ArrayList; - -/** - * User: The Grey Ghost - * Date: 20/01/2015 - * Class to draw the menu on the screen - */ -@SuppressWarnings("deprecation") -public class HUDtextRenderer { - /** - * Create the HUDtextRenderer; caller needs to register this class on the forge event bus - * - * @param i_HUDinfoUpdateLink the menu state information needed to draw the Heads Up Display - */ - public HUDtextRenderer(HUDinfoUpdateLink i_HUDinfoUpdateLink) { - huDinfoUpdateLink = i_HUDinfoUpdateLink; - } - - /** - * Draw the Head Up Display menu on screen. - * The information is taken from the hudInfoUpdateLink which is updated by other classes. - * - * @param event - */ - @SubscribeEvent - public void displayHUDtext(RenderGameOverlayEvent.Text event) { - if (huDinfoUpdateLink == null || !huDinfoUpdateLink.menuVisible || huDinfoUpdateLink.itemCameraTransforms == null) - return; - ArrayList displayText = new ArrayList<>(); - ArrayList selectableField = new ArrayList<>(); - - final HUDinfoUpdateLink.SelectedField NOT_SELECTABLE = null; - - displayText.add("======"); - selectableField.add(NOT_SELECTABLE); - displayText.add("VIEW "); - selectableField.add(NOT_SELECTABLE); - ItemTransformVec3f transformVec3f = huDinfoUpdateLink.itemCameraTransforms.thirdperson_right; - - switch (huDinfoUpdateLink.selectedTransform) { - case THIRD_LEFT: { - displayText.add("3rd-L"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.thirdperson_left; - break; - } - case THIRD_RIGHT: { - displayText.add("3rd-R"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.thirdperson_right; - break; - } - case FIRST_LEFT: { - displayText.add("1st-L"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.firstperson_left; - break; - } - case FIRST_RIGHT: { - displayText.add("1st-R"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.firstperson_right; - break; - } - case GUI: { - displayText.add("gui"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.gui; - break; - } - case HEAD: { - displayText.add("head"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.head; - break; - } - case FIXED: { - displayText.add("fixed"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.fixed; - break; - } - case GROUND: { - displayText.add("grnd"); - transformVec3f = huDinfoUpdateLink.itemCameraTransforms.ground; - break; - } - default: { - throw new IllegalArgumentException("Unknown cameraTransformType:" + huDinfoUpdateLink.selectedTransform); - } - } - selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSFORM); - - displayText.add("======"); - selectableField.add(NOT_SELECTABLE); - displayText.add("SCALE"); - selectableField.add(NOT_SELECTABLE); - displayText.add("X:" + String.format("%.2f", transformVec3f.scale.getX())); - selectableField.add(HUDinfoUpdateLink.SelectedField.SCALE_X); - displayText.add("Y:" + String.format("%.2f", transformVec3f.scale.getY())); - selectableField.add(HUDinfoUpdateLink.SelectedField.SCALE_Y); - displayText.add("Z:" + String.format("%.2f", transformVec3f.scale.getZ())); - selectableField.add(HUDinfoUpdateLink.SelectedField.SCALE_Z); - - displayText.add("======"); - selectableField.add(NOT_SELECTABLE); - displayText.add("ROTATE"); - selectableField.add(NOT_SELECTABLE); - displayText.add("X:" + String.format("%3.0f", transformVec3f.rotation.getX())); - selectableField.add(HUDinfoUpdateLink.SelectedField.ROTATE_X); - displayText.add("Y:" + String.format("%3.0f", transformVec3f.rotation.getY())); - selectableField.add(HUDinfoUpdateLink.SelectedField.ROTATE_Y); - displayText.add("Z:" + String.format("%3.0f", transformVec3f.rotation.getZ())); - selectableField.add(HUDinfoUpdateLink.SelectedField.ROTATE_Z); - - final double TRANSLATE_MULTIPLIER = 1 / 0.0625; // see ItemTransformVec3f::deserialize0() - displayText.add("======"); - selectableField.add(NOT_SELECTABLE); - displayText.add("TRANSL"); - selectableField.add(NOT_SELECTABLE); - displayText.add("X:" + String.format("%.2f", transformVec3f.translation.getX() * TRANSLATE_MULTIPLIER)); - selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSLATE_X); - displayText.add("Y:" + String.format("%.2f", transformVec3f.translation.getY() * TRANSLATE_MULTIPLIER)); - selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSLATE_Y); - displayText.add("Z:" + String.format("%.2f", transformVec3f.translation.getZ() * TRANSLATE_MULTIPLIER)); - selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSLATE_Z); - - displayText.add("======"); - selectableField.add(NOT_SELECTABLE); - displayText.add("RESET"); - selectableField.add(HUDinfoUpdateLink.SelectedField.RESTORE_DEFAULT); - displayText.add("RSTALL"); - selectableField.add(HUDinfoUpdateLink.SelectedField.RESTORE_DEFAULT_ALL); - displayText.add("PRINT"); - selectableField.add(HUDinfoUpdateLink.SelectedField.PRINT); - displayText.add("======"); - selectableField.add(NOT_SELECTABLE); - - FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; - int ypos = 2; - int xpos = 2; - for (int i = 0; i < displayText.size(); ++i) { - String msg = displayText.get(i); - ypos += fontRenderer.FONT_HEIGHT; - if (msg == null) continue; - final int MED_GRAY_HALF_TRANSPARENT = 0x6FAFAFB0; - final int GREEN_HALF_TRANSPARENT = 0x6F00FF00; - boolean fieldIsSelected = (huDinfoUpdateLink.selectedField == selectableField.get(i)); - int highlightColour = fieldIsSelected ? GREEN_HALF_TRANSPARENT : MED_GRAY_HALF_TRANSPARENT; - drawRect(event.getMatrixStack(), xpos - 1, ypos - 1, xpos + fontRenderer.getStringWidth(msg) + 1, ypos + fontRenderer.FONT_HEIGHT - 1, highlightColour); - final int LIGHT_GRAY = 0xE0E0E0; - final int BLACK = 0x000000; - int stringColour = fieldIsSelected ? BLACK : LIGHT_GRAY; - fontRenderer.drawString(event.getMatrixStack(), msg, xpos, ypos, stringColour); - } - } - - /** - * Used to provide the information that the HUDtextRenderer needs to draw the menu - */ - public static class HUDinfoUpdateLink { - public ItemCameraTransforms itemCameraTransforms; - public SelectedField selectedField; - public TransformName selectedTransform; - public boolean menuVisible; - - public HUDinfoUpdateLink() { - final Vector3f ROTATION_DEFAULT = new Vector3f(0.0F, 0.0F, 0.0F); - final Vector3f TRANSLATION_DEFAULT = new Vector3f(0.0F, 0.0F, 0.0F); - final Vector3f SCALE_DEFAULT = new Vector3f(1.0F, 1.0F, 1.0F); - - ItemTransformVec3f itvThirdLeft = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - ItemTransformVec3f itvThirdRight = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - ItemTransformVec3f itvFirstLeft = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - ItemTransformVec3f itvFirstRight = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - ItemTransformVec3f itvHead = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - ItemTransformVec3f itvGui = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - ItemTransformVec3f itvGround = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - ItemTransformVec3f itvFixed = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT); - itemCameraTransforms = new ItemCameraTransforms(itvThirdLeft, itvThirdRight, itvFirstLeft, itvFirstRight, itvHead, itvGui, itvGround, itvFixed); - - selectedField = SelectedField.TRANSFORM; - selectedTransform = TransformName.FIRST_RIGHT; - menuVisible = false; - } - - public enum TransformName { - THIRD_LEFT(ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND), - THIRD_RIGHT(ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND), - FIRST_LEFT(ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND), - FIRST_RIGHT(ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND), - HEAD(ItemCameraTransforms.TransformType.HEAD), - GUI(ItemCameraTransforms.TransformType.GUI), - GROUND(ItemCameraTransforms.TransformType.GROUND), - FIXED(ItemCameraTransforms.TransformType.FIXED); - - public TransformName getNext() { - for (TransformName transformName : TransformName.values()) { - if (transformName.ordinal() == this.ordinal() + 1) return transformName; - } - return THIRD_LEFT; - } - - public TransformName getPrevious() { - for (TransformName transformName : TransformName.values()) { - if (transformName.ordinal() == this.ordinal() - 1) return transformName; - } - return FIXED; - } - - public ItemCameraTransforms.TransformType getVanillaTransformType() { - return vanillaType; - } - - TransformName(ItemCameraTransforms.TransformType i_type) { - vanillaType = i_type; - } - - private ItemCameraTransforms.TransformType vanillaType; - } - - public enum SelectedField { - TRANSFORM(0), SCALE_X(1), SCALE_Y(2), SCALE_Z(3), ROTATE_X(4), ROTATE_Y(5), ROTATE_Z(6), TRANSLATE_X(7), - TRANSLATE_Y(8), TRANSLATE_Z(9), RESTORE_DEFAULT(10), RESTORE_DEFAULT_ALL(11), PRINT(12); - - SelectedField(int index) { - fieldIndex = index; - } - - public final int fieldIndex; - private static final SelectedField FIRST_FIELD = TRANSFORM; - private static final SelectedField LAST_FIELD = PRINT; - - public static SelectedField getFieldName(int indexToFind) { - for (SelectedField checkField : SelectedField.values()) { - if (checkField.fieldIndex == indexToFind) return checkField; - } - return null; - } - - public SelectedField getNextField() { - SelectedField nextField = getFieldName(fieldIndex + 1); - if (nextField == null) nextField = FIRST_FIELD; - return nextField; - } - - public SelectedField getPreviousField() { - SelectedField previousField = getFieldName(fieldIndex - 1); - if (previousField == null) previousField = LAST_FIELD; - return previousField; - } - } - - } - - private HUDinfoUpdateLink huDinfoUpdateLink; - - // copied straight from vanilla ForgeIngameGui - private static void drawRect(MatrixStack matrixStackIn, int left, int top, int right, int bottom, int color) { - if (left < right) { - int i = left; - left = right; - right = i; - } - - if (top < bottom) { - int j = top; - top = bottom; - bottom = j; - } - - float alpha = (float) (color >> 24 & 255) / 255.0F; - float red = (float) (color >> 16 & 255) / 255.0F; - float green = (float) (color >> 8 & 255) / 255.0F; - float blue = (float) (color & 255) / 255.0F; - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder builder = tessellator.getBuffer(); - GlStateManager.enableBlend(); - RenderSystem.disableTexture(); - builder.begin(7, DefaultVertexFormats.POSITION_COLOR); - Matrix4f matrix = matrixStackIn.getLast().getMatrix(); - builder.pos(matrix, (float) left, (float) bottom, 0F).color(red, green, blue, alpha).endVertex(); - builder.pos(matrix, (float) right, (float) bottom, 0F).color(red, green, blue, alpha).endVertex(); - builder.pos(matrix, (float) right, (float) top, 0F).color(red, green, blue, alpha).endVertex(); - builder.pos(matrix, (float) left, (float) top, 0F).color(red, green, blue, alpha).endVertex(); - tessellator.draw(); - RenderSystem.enableTexture(); - GlStateManager.disableBlend(); - } -} \ No newline at end of file diff --git a/src/main/java/itemtransformhelper/ItemCamera.java b/src/main/java/itemtransformhelper/ItemCamera.java deleted file mode 100644 index 9c98dcea..00000000 --- a/src/main/java/itemtransformhelper/ItemCamera.java +++ /dev/null @@ -1,31 +0,0 @@ -package itemtransformhelper; - -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; - -import javax.annotation.Nullable; -import java.util.List; - -/** - * User: The Grey Ghost - * Date: 26/01/2015 - * ItemCamera is very simple item used to activate the ItemCameraTransforms override when it is held in the hotbar. - * See the Notes. - */ -public class ItemCamera extends Item { - public ItemCamera(Properties properties) { - super(properties); - } - - @Override - public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) { - tooltip.add(new StringTextComponent("1) Place the camera in your hotbar")); - tooltip.add(new StringTextComponent("2) Hold an item in your hand")); - tooltip.add(new StringTextComponent("3) Use the cursor keys to ")); - tooltip.add(new StringTextComponent(" modify the item transform.")); - } -} diff --git a/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java b/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java deleted file mode 100644 index dffc044f..00000000 --- a/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java +++ /dev/null @@ -1,65 +0,0 @@ -package itemtransformhelper; - - -import com.mojang.blaze3d.matrix.MatrixStack; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.model.BakedQuad; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.util.Direction; -import net.minecraft.util.math.vector.TransformationMatrix; -import net.minecraftforge.client.model.BakedModelWrapper; -import net.minecraftforge.client.model.data.EmptyModelData; -import net.minecraftforge.common.model.TransformationHelper; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; -import java.util.Random; - -/** - * User: The Grey Ghost - * Date: 20/01/2015 - * This class is a simple wrapper to substitute a new set of camera transforms for an existing item - * Usage: - * 1) Construct a new ItemModelFlexibleCamera with the model to wrap and an UpdateLink using getWrappedModel() - * 2) Replace the ItemModelFlexibleCamera into the modelRegistry in place of the model to wrap - * 3) Alter the UpdateLink to control the ItemCameraTransform of a given model: - * a) itemModelToOverride selects the item to be overridden - * b) forcedTransform is the transform to apply - * Models which don't match itemModelToOverride will use their original transform - *

- * NB Starting with Forge 1.8-11.14.4.1563, it appears that all items now implement IPerspectiveAwareModel - */ -@SuppressWarnings({"deprecation", "unchecked"}) -public class ItemModelFlexibleCamera extends BakedModelWrapper { - protected final UpdateLink updateLink; - - public ItemModelFlexibleCamera(IBakedModel i_modelToWrap, UpdateLink linkToCurrentInformation) { - super(i_modelToWrap); - updateLink = linkToCurrentInformation; - } - - @Override - public ItemCameraTransforms getItemCameraTransforms() { - return (updateLink.itemModelToOverride == this) ? updateLink.forcedTransform : originalModel.getItemCameraTransforms(); - } - - @Override - public IBakedModel handlePerspective(ItemCameraTransforms.TransformType cameraTransformType, MatrixStack mat) { - if (updateLink.itemModelToOverride == this) { - TransformationMatrix tr = TransformationHelper.toTransformation(getItemCameraTransforms().getTransform(cameraTransformType)); - if (!tr.isIdentity()) { - tr.push(mat); - } - return this; - } else { - return super.handlePerspective(cameraTransformType, mat); - } - } - - public static class UpdateLink { - public IBakedModel itemModelToOverride; - public ItemCameraTransforms forcedTransform; - } -} \ No newline at end of file diff --git a/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java b/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java deleted file mode 100644 index 026d3b77..00000000 --- a/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java +++ /dev/null @@ -1,299 +0,0 @@ -package itemtransformhelper; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.model.ItemTransformVec3f; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.lwjgl.glfw.GLFW; - -import java.util.Locale; - - -/** - * The menu used to select and alter the different parts of the ItemCameraTransform for the currently selected item. - * The menu state is rendered on the screen by HUDtextRenderer. - * The class registers its components on the Forge and FML event buses. - * Created by TheGreyGhost on 22/01/15. - */ -@SuppressWarnings("deprecation") -public class MenuItemCameraTransforms { - public MenuItemCameraTransforms() { - linkToHUDrenderer = new HUDtextRenderer.HUDinfoUpdateLink(); - MinecraftForge.EVENT_BUS.register(new HUDtextRenderer(linkToHUDrenderer)); - menuKeyHandler = new MenuKeyHandler(this.new KeyPressCallback()); - MinecraftForge.EVENT_BUS.register(menuKeyHandler); - } - - /** - * get the current ItemCameraTransforms - * - * @return the transform - */ - public ItemCameraTransforms getItemCameraTransforms() { - return linkToHUDrenderer.itemCameraTransforms; - } - - /** - * turn menu on or off - * - * @param visible true = make visible - */ - public void changeMenuVisible(boolean visible) { - linkToHUDrenderer.menuVisible = visible; - } - - public class KeyPressCallback { - void keyPressed(MenuKeyHandler.ArrowKeys whichKey) { - if (!linkToHUDrenderer.menuVisible) return; - - switch (whichKey) { - case DOWN: { - linkToHUDrenderer.selectedField = linkToHUDrenderer.selectedField.getNextField(); - break; - } - case UP: { - linkToHUDrenderer.selectedField = linkToHUDrenderer.selectedField.getPreviousField(); - break; - } - case RIGHT: - case LEFT: { - alterField(whichKey == MenuKeyHandler.ArrowKeys.RIGHT); - break; - } - case NONE: - } - } - } - - private void alterField(boolean increase) { - ItemTransformVec3f transformVec3f = getItemTransformRef(linkToHUDrenderer, linkToHUDrenderer.selectedTransform); - if (transformVec3f == null) return; // should never happen - - final float SCALE_INCREMENT = 0.01F; - final float ROTATION_INCREMENT = 2F; - final float TRANSLATION_INCREMENT = 0.25F * 0.0625F; // 1/4 of a block, with multiplier from ItemTransformVec3f::deserialize0() - switch (linkToHUDrenderer.selectedField) { - case TRANSFORM: { - linkToHUDrenderer.selectedTransform = increase ? linkToHUDrenderer.selectedTransform.getNext() - : linkToHUDrenderer.selectedTransform.getPrevious(); - break; - } - case SCALE_X: { - transformVec3f.scale.setX(transformVec3f.scale.getX() + (increase ? SCALE_INCREMENT : -SCALE_INCREMENT)); - break; - } - case SCALE_Y: { - transformVec3f.scale.setY(transformVec3f.scale.getY() + (increase ? SCALE_INCREMENT : -SCALE_INCREMENT)); - break; - } - case SCALE_Z: { - transformVec3f.scale.setZ(transformVec3f.scale.getZ() + (increase ? SCALE_INCREMENT : -SCALE_INCREMENT)); - break; - } - case ROTATE_X: { - float newAngle = transformVec3f.rotation.getX() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT); - newAngle = MathHelper.wrapDegrees(newAngle - 180) + 180; - transformVec3f.rotation.setX(newAngle); - break; - } - case ROTATE_Y: { - float newAngle = transformVec3f.rotation.getY() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT); - newAngle = MathHelper.wrapDegrees(newAngle - 180) + 180; - transformVec3f.rotation.setY(newAngle); - break; - } - case ROTATE_Z: { - float newAngle = transformVec3f.rotation.getZ() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT); - newAngle = MathHelper.wrapDegrees(newAngle - 180) + 180; - transformVec3f.rotation.setZ(newAngle); - break; - } - case TRANSLATE_X: { - transformVec3f.translation.setX(transformVec3f.translation.getX() + (increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT)); - break; - } - case TRANSLATE_Y: { - transformVec3f.translation.setY(transformVec3f.translation.getY() + (increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT)); - break; - } - case TRANSLATE_Z: { - transformVec3f.translation.setZ(transformVec3f.translation.getZ() + (increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT)); - break; - } - case RESTORE_DEFAULT_ALL: - case RESTORE_DEFAULT: { - ItemModelFlexibleCamera.UpdateLink link = StartupClientOnly.modelBakeEventHandler.getItemOverrideLink(); - IBakedModel savedModel = link.itemModelToOverride; - if (savedModel != null) { // not sure why this would ever be null, but it was (in a bug report), so just check to make sure. - link.itemModelToOverride = null; - if (linkToHUDrenderer.selectedField == HUDtextRenderer.HUDinfoUpdateLink.SelectedField.RESTORE_DEFAULT) { - copySingleTransform(linkToHUDrenderer, savedModel, linkToHUDrenderer.selectedTransform); - } else { - for (HUDtextRenderer.HUDinfoUpdateLink.TransformName transformName - : HUDtextRenderer.HUDinfoUpdateLink.TransformName.values()) { - copySingleTransform(linkToHUDrenderer, savedModel, transformName); - } - } - } - link.itemModelToOverride = savedModel; - break; - } - case PRINT: { - StringBuilder output = new StringBuilder(); - output.append("\n\"display\": {\n"); - printTransform(output, "thirdperson_righthand", linkToHUDrenderer.itemCameraTransforms.thirdperson_right); - output.append(",\n"); - printTransform(output, "thirdperson_lefthand", linkToHUDrenderer.itemCameraTransforms.thirdperson_left); - output.append(",\n"); - printTransform(output, "firstperson_righthand", linkToHUDrenderer.itemCameraTransforms.firstperson_right); - output.append(",\n"); - printTransform(output, "firstperson_lefthand", linkToHUDrenderer.itemCameraTransforms.firstperson_left); - output.append(",\n"); - printTransform(output, "gui", linkToHUDrenderer.itemCameraTransforms.gui); - output.append(",\n"); - printTransform(output, "head", linkToHUDrenderer.itemCameraTransforms.head); - output.append(",\n"); - printTransform(output, "fixed", linkToHUDrenderer.itemCameraTransforms.fixed); - output.append(",\n"); - printTransform(output, "ground", linkToHUDrenderer.itemCameraTransforms.ground); - output.append("\n}"); - LOGGER.info(output); - StringTextComponent text = new StringTextComponent(" \"display\" JSON section printed to console (LOGGER.info)..."); - Minecraft.getInstance().ingameGUI.getChatGUI().printChatMessage(text); - break; - } - } - } - - // points to the appropriate transform based on which transform has been selected. - private static ItemTransformVec3f getItemTransformRef(HUDtextRenderer.HUDinfoUpdateLink linkToHUDrenderer, - HUDtextRenderer.HUDinfoUpdateLink.TransformName transformName) { - switch (transformName) { - case THIRD_LEFT: { - return linkToHUDrenderer.itemCameraTransforms.thirdperson_left; - } - case THIRD_RIGHT: { - return linkToHUDrenderer.itemCameraTransforms.thirdperson_right; - } - case FIRST_LEFT: { - return linkToHUDrenderer.itemCameraTransforms.firstperson_left; - } - case FIRST_RIGHT: { - return linkToHUDrenderer.itemCameraTransforms.firstperson_right; - } - case GUI: { - return linkToHUDrenderer.itemCameraTransforms.gui; - } - case HEAD: { - return linkToHUDrenderer.itemCameraTransforms.head; - } - case FIXED: { - return linkToHUDrenderer.itemCameraTransforms.fixed; - } - case GROUND: { - return linkToHUDrenderer.itemCameraTransforms.ground; - } - } - return null; - } - - private void copySingleTransform(HUDtextRenderer.HUDinfoUpdateLink linkToHUDrenderer, - IBakedModel savedModel, - HUDtextRenderer.HUDinfoUpdateLink.TransformName transformToBeCopied - ) { - ItemTransformVec3f transformVec3f = getItemTransformRef(linkToHUDrenderer, transformToBeCopied); - ItemCameraTransforms.TransformType currentType = transformToBeCopied.getVanillaTransformType(); - ItemTransformVec3f transform = savedModel.getItemCameraTransforms().getTransform(currentType); - copyTransforms(transform, transformVec3f); - } - - private static void printTransform(StringBuilder output, String transformView, ItemTransformVec3f itemTransformVec3f) { - output.append(" \"" + transformView + "\": {\n"); - output.append(" \"rotation\": [ "); - output.append(String.format(Locale.US, "%.0f, ", itemTransformVec3f.rotation.getX())); - output.append(String.format(Locale.US, "%.0f, ", itemTransformVec3f.rotation.getY())); - output.append(String.format(Locale.US, "%.0f ],", itemTransformVec3f.rotation.getZ())); - output.append("\n"); - - final double TRANSLATE_MULTIPLIER = 1 / 0.0625; // see ItemTransformVec3f::deserialize0() - output.append(" \"translation\": [ "); - output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.translation.getX() * TRANSLATE_MULTIPLIER)); - output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.translation.getY() * TRANSLATE_MULTIPLIER)); - output.append(String.format(Locale.US, "%.2f ],", itemTransformVec3f.translation.getZ() * TRANSLATE_MULTIPLIER)); - output.append("\n"); - output.append(" \"scale\": [ "); - output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.scale.getX())); - output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.scale.getY())); - output.append(String.format(Locale.US, "%.2f ]", itemTransformVec3f.scale.getZ())); - output.append("\n }"); - } - - private static void copyTransforms(ItemTransformVec3f from, ItemTransformVec3f to) { - to.translation.setX(from.translation.getX()); - to.scale.setX(from.scale.getX()); - to.rotation.setX(from.rotation.getX()); - to.translation.setY(from.translation.getY()); - to.scale.setY(from.scale.getY()); - to.rotation.setY(from.rotation.getY()); - to.translation.setZ(from.translation.getZ()); - to.scale.setZ(from.scale.getZ()); - to.rotation.setZ(from.rotation.getZ()); - } - - private HUDtextRenderer.HUDinfoUpdateLink linkToHUDrenderer; - private MenuKeyHandler menuKeyHandler; - - /** - * Intercept arrow keys and handle repeats - */ - public static class MenuKeyHandler { - public MenuKeyHandler(KeyPressCallback i_keyPressCallback) { - keyPressCallback = i_keyPressCallback; - } - - @SubscribeEvent - public void clientTick(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.START) { - return; - } - - ArrowKeys keyPressed = ArrowKeys.NONE; - if (isKeyDown(GLFW.GLFW_KEY_LEFT)) keyPressed = ArrowKeys.LEFT; - if (isKeyDown(GLFW.GLFW_KEY_RIGHT)) keyPressed = ArrowKeys.RIGHT; - if (isKeyDown(GLFW.GLFW_KEY_DOWN)) keyPressed = ArrowKeys.DOWN; - if (isKeyDown(GLFW.GLFW_KEY_UP)) keyPressed = ArrowKeys.UP; - - if (keyPressed == ArrowKeys.NONE) { - lastKey = keyPressed; - return; - } - if (keyPressed != lastKey) { - lastKey = keyPressed; - keyDownTimeTicks = 0; - } else { - ++keyDownTimeTicks; - final int INITIAL_PAUSE_TICKS = 10; // wait 10 ticks before repeating - if (keyDownTimeTicks < INITIAL_PAUSE_TICKS) return; - } - keyPressCallback.keyPressed(keyPressed); - } - - static boolean isKeyDown(int key) { - return GLFW.glfwGetKey(Minecraft.getInstance().getMainWindow().getHandle(), key) == GLFW.GLFW_PRESS; - } - - public enum ArrowKeys {NONE, UP, DOWN, LEFT, RIGHT} - - private long keyDownTimeTicks = 0; - private ArrowKeys lastKey = ArrowKeys.NONE; - private KeyPressCallback keyPressCallback; - } - private static final Logger LOGGER = LogManager.getLogger(); -} diff --git a/src/main/java/itemtransformhelper/ModelBakeEventHandler.java b/src/main/java/itemtransformhelper/ModelBakeEventHandler.java deleted file mode 100644 index be9ef9c7..00000000 --- a/src/main/java/itemtransformhelper/ModelBakeEventHandler.java +++ /dev/null @@ -1,48 +0,0 @@ -package itemtransformhelper; - -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.model.ItemTransformVec3f; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -import java.util.Map; - -/** - * User: The Grey Ghost - * Date: 20/01/2015 - * We use the ModelBakeEvent to iterate through all the registered models, wrap each one in an ItemModelFlexibleCamera, and write it - * back into the registry. - * Each wrapped model gets a reference to ModelBakeEventHandler::itemOverrideLink. - * Later, we can alter the members of itemOverrideLink to change the ItemCameraTransforms for a desired Item - */ -@SuppressWarnings("deprecation") -public class ModelBakeEventHandler { - public ModelBakeEventHandler() { - itemOverrideLink.forcedTransform = new ItemCameraTransforms(ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT, - ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT, - ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT, - ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT); - } - - @SubscribeEvent - public void modelBakeEvent(ModelBakeEvent event) { - Map modelRegistry = event.getModelRegistry(); - for (ResourceLocation modelKey : modelRegistry.keySet()) { - IBakedModel iBakedModel = event.getModelRegistry().get(modelKey); - ItemModelFlexibleCamera wrappedModel = new ItemModelFlexibleCamera(iBakedModel, itemOverrideLink); - event.getModelRegistry().put(modelKey, wrappedModel); - } - ItemTransformHelper.logger.warn("Warning - The Item Transform Helper replaces your IBakedModels with a wrapped version, this"); - ItemTransformHelper.logger.warn(" is done even when the helper is not in your hotbar, and might cause problems if your"); - ItemTransformHelper.logger.warn(" IBakedModel implements an interface ItemTransformHelper doesn't know about."); - ItemTransformHelper.logger.warn(" I recommend you disable the mod when you're not actively using it to transform your items."); - } - - public ItemModelFlexibleCamera.UpdateLink getItemOverrideLink() { - return itemOverrideLink; - } - - private ItemModelFlexibleCamera.UpdateLink itemOverrideLink = new ItemModelFlexibleCamera.UpdateLink(); -} diff --git a/src/main/java/itemtransformhelper/StartupClientOnly.java b/src/main/java/itemtransformhelper/StartupClientOnly.java deleted file mode 100644 index 34d22002..00000000 --- a/src/main/java/itemtransformhelper/StartupClientOnly.java +++ /dev/null @@ -1,29 +0,0 @@ -package itemtransformhelper; - -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; - -/** - * User: The Grey Ghost - * Date: 24/12/2014 - *

- * The Startup classes for this example are called during startup, in the following order: - * preInitCommon - * preInitClientOnly - * initCommon - * initClientOnly - * postInitCommon - * postInitClientOnly - * See MinecraftByExample class for more information - */ -public class StartupClientOnly { - public final static ModelBakeEventHandler modelBakeEventHandler = new ModelBakeEventHandler(); - public final static ClientTickHandler clientTickHandler = new ClientTickHandler(); - public static MenuItemCameraTransforms menuItemCameraTransforms; - - public static void clientSetup() { - FMLJavaModLoadingContext.get().getModEventBus().addListener(modelBakeEventHandler::modelBakeEvent); - MinecraftForge.EVENT_BUS.register(clientTickHandler); - menuItemCameraTransforms = new MenuItemCameraTransforms(); - } -} \ No newline at end of file diff --git a/src/main/java/itemtransformhelper/StartupCommon.java b/src/main/java/itemtransformhelper/StartupCommon.java deleted file mode 100644 index 948a3d26..00000000 --- a/src/main/java/itemtransformhelper/StartupCommon.java +++ /dev/null @@ -1,30 +0,0 @@ -package itemtransformhelper; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraftforge.fml.RegistryObject; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; - -import static itemtransformhelper.ItemTransformHelper.MODID; - -/** - * User: The Grey Ghost - * Date: 24/12/2014 - *

- * The Startup classes for this example are called during startup, in the following order: - * preInitCommon - * preInitClientOnly - * initCommon - * initClientOnly - * postInitCommon - * postInitClientOnly - * See MinecraftByExample class for more information - */ -public class StartupCommon { - public static ItemGroup tabITH = new CreativeTabITH("itemtransformhelper"); - - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); - public static final RegistryObject ITEM_CAMERA = ITEMS.register("item_camera", () -> new ItemCamera( - new Item.Properties().group(tabITH).maxStackSize(1))); -} \ 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 f94e7f5c..00000000 --- a/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,24 +0,0 @@ -modLoader="javafml" -loaderVersion="[32,)" -# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. -# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. -license="All rights reserved" -[[mods]] -modId="itemtransformhelper" -version="${file.jarVersion}" -displayName="Item Transform Helper" -credits="The Forge, MCP, and FML guys. Maruohon" -authors="TGG, Romejanic, lehjr" -description="Interactively change the position, scale, and rotation of an item" -[[dependencies.itemtransformhelper]] - modId="forge" - mandatory=true - versionRange="[32,)" - ordering="NONE" - side="BOTH" -[[dependencies.itemtransformhelper]] - modId="minecraft" - mandatory=true - versionRange="[1.16.1]" - ordering="NONE" - side="BOTH" diff --git a/src/main/resources/assets/itemtransformhelper/lang/en_us.json b/src/main/resources/assets/itemtransformhelper/lang/en_us.json deleted file mode 100644 index 19bde922..00000000 --- a/src/main/resources/assets/itemtransformhelper/lang/en_us.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "item.itemtransformhelper.item_camera": "Item Transform Helper", - "itemGroup.itemtransformhelper": "Item Transform Helper" -} \ No newline at end of file diff --git a/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json b/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json deleted file mode 100644 index 0573f6f2..00000000 --- a/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "parent": "builtin/generated", - "textures": { - "layer0": "itemtransformhelper:items/item_camera_icon" - }, - "display": { - "thirdperson_righthand": { - "rotation": [ 0, 0, 0 ], - "translation": [ 0.00, 3.00, 1.00 ], - "scale": [ 0.55, 0.55, 0.55 ] - }, - "thirdperson_lefthand": { - "rotation": [ 0, 0, 0 ], - "translation": [ 0.00, 3.00, 1.00 ], - "scale": [ 0.55, 0.55, 0.55 ] - }, - "firstperson_righthand": { - "rotation": [ -25, -90, 0 ], - "translation": [ 1.13, 3.20, 1.13 ], - "scale": [ 0.68, 0.68, 0.68 ] - }, - "firstperson_lefthand": { - "rotation": [ -25, -90, 0 ], - "translation": [ 1.13, 3.20, 1.13 ], - "scale": [ 0.68, 0.68, 0.68 ] - }, - "gui": { - "rotation": [ 0, 0, 0 ], - "translation": [ 0.00, 0.00, 0.00 ], - "scale": [ 1.00, 1.00, 1.00 ] - }, - "head": { - "rotation": [ -180, -0, -180 ], - "translation": [ -0.00, 13.00, 7.00 ], - "scale": [ 1.00, 1.00, 1.00 ] - }, - "fixed": { - "rotation": [ 0, 0, 0 ], - "translation": [ 0.00, 0.00, 0.00 ], - "scale": [ 1.00, 1.00, 1.00 ] - }, - "ground": { - "rotation": [ 0, 0, 0 ], - "translation": [ 0.00, 2.00, 0.00 ], - "scale": [ 0.50, 0.50, 0.50 ] - } - }} diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta deleted file mode 100644 index 148fbf9c..00000000 --- a/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,7 +0,0 @@ -{ - "pack": { - "description": "itemtransformhelper resources", - "pack_format": 5, - "_comment": "A pack_format of 5 requires json lang files and some texture changes from 1.15. Note: we require v5 pack meta for all mods." - } -}