diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c37caf --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Cache of project +.gradletasknamecache + +**/build/ + +# Common working directory +run/ + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar diff --git a/LICENSE b/LICENSE index 599cd04..e93d94b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,2 @@ -The MIT License (MIT) - -Copyright (c) 2021 Floris0106 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -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 OR COPYRIGHT HOLDERS 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. +Copyright (c) 2022 +All rights reserved. diff --git a/README.md b/README.md deleted file mode 100644 index 5327d9a..0000000 --- a/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Rereskillable Rereforked - -Rereskillable Rereforked is a fork of Rereskillable, which is a fork of Reskillable, which is a fork of Skillable. - -This mod allows you to lock: -- Items (using, wearing) -- Blocks (breaking, placing) -- Entities (mounting, loot tables) -Behid levels in 8 different skills. - -## Configuration - -Config options include: -- Disabling sheep wool drops -- Changing the starting upgrade cost in XP levels -- Changing the maximum skill level -- Specifying whether Skill Fragments should be used to level up skills instead of XP levels -- Changing how many Skill Fragments can be obtained from different kinds of advancements -- Specifying a list of skill locks - -## Skill Locks - -A new lock can be added by adding a string to the skillLocks list: -``` -"mod:id skill:level" -``` -For example: -``` -"minecraft:ender_pearl magic:5" -"minecraft:bow attack:3 agility:2" -"minecraft:horse agility:10" -``` - -## Commands - -To set a skill level: -``` -/skills [player] set [skill] [level] -``` -To get a skill level: -``` -/skills [player] get [skill] -``` -To reset all skill levels: -``` -/skills [player] reset -``` - -## Known Issues - -- You can't lock the Totem of Undying from being used. -- You can block items from being used regardless of skill only by setting the requirement to a level above max skill level (example: "minecraft:shield magic:69") -- Locking loot tables is not implemented - -## Support - -I forked this mod to use in a modpack i'm working on, so updates won't be frequent, but feel free to report issues or submit pull requests if you want ot help with development! - -## Modpacks - -Please, go ahead and use this mod in your modpack! It's what the mod was designed for! - -## Credits - -Credits go to Vazkii (author of Skillable), lanse505 (author of Reskillable, among others) and majik (author of Rereskillable). diff --git a/build.gradle b/build.gradle index b8a70bb..5805091 100644 --- a/build.gradle +++ b/build.gradle @@ -1,45 +1,108 @@ -buildscript { - repositories { - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - } +plugins { + id 'net.minecraftforge.gradle' version '5.1.+' } -apply plugin: 'net.minecraftforge.gradle' group = 'floris0106' -version = '2.0.2' +version = '2.1.0' -archivesBaseName = 'rereskillablerereforked' -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java { + archivesBaseName = 'rereskillablerereforked' + toolchain.languageVersion = JavaLanguageVersion.of(17) +} minecraft { - mappings channel: 'official', version: '1.18.2' + // The mappings can be changed at any time and must be in the following format. + // Channel: Version: + // official MCVersion Official field/method names from Mojang mapping files + // parchment YYYY.MM.DD-MCVersion Open community-sourced parameter names and javadocs layered on top of official + // + // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. + // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md + // + // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge + // Additional setup is needed to use their mappings: https://github.com/ParchmentMC/Parchment/wiki/Getting-Started + // + // 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: 'official', version: '1.19.2' // 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 + // The markers can be added/remove as needed separated by commas. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. property 'forge.logging.markers', 'REGISTRIES' + + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + property 'forge.enabledGameTestNamespaces', 'rereskillablerereforked' + mods { rereskillablerereforked { source sourceSets.main } } } + server { workingDirectory project.file('run') property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + property 'forge.enabledGameTestNamespaces', 'rereskillablerereforked' + + mods { + rereskillablerereforked { + source sourceSets.main + } + } + } + + // This run config launches GameTestServer and runs all registered gametests, then exits. + // By default, the server will crash when no gametests are provided. + // The gametest system is also enabled by default for other run configs under the /test command. + gameTestServer { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + + property 'forge.logging.console.level', 'debug' + + property 'forge.enabledGameTestNamespaces', 'rereskillablerereforked' + + mods { + rereskillablerereforked { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + + property 'forge.logging.console.level', 'debug' + + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + args '--mod', 'rereskillablerereforked', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + mods { rereskillablerereforked { source sourceSets.main @@ -49,33 +112,60 @@ minecraft { } } +// Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { + // Put repositories for dependencies here + // ForgeGradle automatically adds the Forge maven and Maven Central for you + + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // flatDir { + // dir 'libs' + // } maven { url = 'https://maven.theillusivec4.top/' } } dependencies { - minecraft 'net.minecraftforge:forge:1.18.2-40.1.0' - - runtimeOnly fg.deobf('top.theillusivec4.curios:curios-forge:1.18.2-5.0.7.0') - compileOnly fg.deobf('top.theillusivec4.curios:curios-forge:1.18.2-5.0.7.0:api') + // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft' it is assumed + // that the dep is a ForgeGradle 'patcher' dependency, and its 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.19.2-43.1.52' + + runtimeOnly fg.deobf('top.theillusivec4.curios:curios-forge:1.19.2-5.1.1.0') + compileOnly fg.deobf('top.theillusivec4.curios:curios-forge:1.19.2-5.1.1.0:api') + // Real mod deobf dependency examples - these get remapped to your current mappings + // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency + // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency + // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency + + // Examples using mod jars from ./libs + // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") + + // 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 at runtime. jar { manifest { attributes([ "Specification-Title" : "rereskillablerereforked", - "Specification-Vendor" : "Floris0106", - "Specification-Version" : "1", + //"Specification-Vendor": "rereskillablerereforked authors", + "Specification-Version" : "1", // We are version 1 of ourselves "Implementation-Title" : project.name, "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "Floris0106", + //"Implementation-Vendor": "rereskillablerereforked authors", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) } } -jar.finalizedBy('reobfJar') \ No newline at end of file +jar.finalizedBy('reobfJar') + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +} diff --git a/gradle.properties b/gradle.properties index a18e445..29b2ac4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -org.gradle.jvmargs=-Xmx8G -org.gradle.daemon=false \ No newline at end of file +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180..41d9927 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 ffed3a2..aa991fc 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.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index c53aefa..1b6c787 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# 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. @@ -32,10 +32,10 @@ # 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». +# * 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: # diff --git a/settings.gradle b/settings.gradle index 8d163d3..949d0e1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,8 @@ -rootProject.name = 'rereskillablerereforked' \ No newline at end of file +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.minecraftforge.net/' } + } +} + +rootProject.name = 'rereskillablerereforked' diff --git a/src/main/java/floris0106/rereskillablerereforked/client/Keybind.java b/src/main/java/floris0106/rereskillablerereforked/client/Keybind.java index cf8a410..861b83d 100644 --- a/src/main/java/floris0106/rereskillablerereforked/client/Keybind.java +++ b/src/main/java/floris0106/rereskillablerereforked/client/Keybind.java @@ -1,29 +1,29 @@ package floris0106.rereskillablerereforked.client; -import com.mojang.blaze3d.platform.InputConstants; import floris0106.rereskillablerereforked.client.screen.SkillScreen; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; -import net.minecraftforge.client.ClientRegistry; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.client.settings.KeyConflictContext; +import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import org.lwjgl.glfw.GLFW; public class Keybind { - private final KeyMapping openKey = new KeyMapping("key.skills", KeyConflictContext.IN_GAME, InputConstants.Type.KEYSYM, 71, "Rereskillable"); + public static final KeyMapping openKey = new KeyMapping("key.skills", GLFW.GLFW_KEY_G, "Rereskillable"); - public Keybind() - { - ClientRegistry.registerKeyBinding(openKey); - } + public Keybind() {} @SubscribeEvent - public void onKeyInput(InputEvent.KeyInputEvent event) + public void onKeyInput(TickEvent.ClientTickEvent evt) { + if (evt.phase != TickEvent.Phase.END) { + return; + } + Minecraft minecraft = Minecraft.getInstance(); - if (openKey.consumeClick() && minecraft.screen == null) + if (openKey.consumeClick() && minecraft.screen == null) { minecraft.setScreen(new SkillScreen()); + } } } \ No newline at end of file diff --git a/src/main/java/floris0106/rereskillablerereforked/client/Overlay.java b/src/main/java/floris0106/rereskillablerereforked/client/Overlay.java index c1e66be..e5b7a8c 100644 --- a/src/main/java/floris0106/rereskillablerereforked/client/Overlay.java +++ b/src/main/java/floris0106/rereskillablerereforked/client/Overlay.java @@ -1,7 +1,7 @@ package floris0106.rereskillablerereforked.client; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.*; import floris0106.rereskillablerereforked.common.Config; import floris0106.rereskillablerereforked.client.screen.SkillScreen; import floris0106.rereskillablerereforked.common.capabilities.SkillCapability; @@ -9,10 +9,14 @@ import floris0106.rereskillablerereforked.common.skills.Requirement; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderGuiEvent; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.eventbus.api.SubscribeEvent; import org.lwjgl.opengl.GL11; @@ -25,52 +29,84 @@ public class Overlay extends GuiComponent private static int showTicks = 0; @SubscribeEvent - public void onRenderOverlay(RenderGameOverlayEvent.Post event) + public void onRenderOverlay(RenderGuiOverlayEvent.Post event) { - if (event.getType() == RenderGameOverlayEvent.ElementType.ALL && showTicks > 0) + if (event.getResult() != Event.Result.DENY && showTicks > 0) { Minecraft minecraft = Minecraft.getInstance(); - - if (minecraft.player.getCapability(SkillCapability.INSTANCE).isPresent()) - { - PoseStack stack = event.getMatrixStack(); + + if (minecraft.player.getCapability(SkillCapability.INSTANCE).isPresent()) { + Tesselator tessellator = Tesselator.getInstance(); + + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 0.1f); // I set the opacity of the draw here RenderSystem.setShaderTexture(0, SkillScreen.RESOURCES); - GL11.glEnable(GL11.GL_BLEND); - + + // Base coordinates for background (top left) + int width = 150; + int height = 40; int cx = event.getWindow().getGuiScaledWidth() / 2; int cy = event.getWindow().getGuiScaledHeight() / 4; - - String message = new TranslatableComponent("overlay.message").getString(); - minecraft.font.drawShadow(stack, message, cx - minecraft.font.width(message) / 2f, cy, 0xFF5555); - + int tlx = cx - (width / 2); + int tly = cy; + + float unit = 1.0f / 255.0f; + + // Do a blit + BufferBuilder builder = tessellator.getBuilder(); + builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + builder.vertex(tlx, tly + height, -90.0D).uv(0.0F, 233.0f / 255.0f).endVertex(); // bottom left + builder.vertex(tlx + width, tly + height, -90.0D).uv((141.0F / 255.0F) + unit, 233.0f / 255.0f).endVertex(); // bottom right + builder.vertex(tlx + width, tly, -90.0D).uv((141.0F / 255.0F) + unit, (194.0F / 255.0F) - unit).endVertex(); // top right + builder.vertex(tlx, tly, -90.0D).uv(0.0F, (194.0F / 255.0F) - unit).endVertex(); // top left + tessellator.end(); + + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + RenderSystem.disableBlend(); + + // Background drawn, time or text or other textures + PoseStack stack = event.getPoseStack(); + + // Draw the "You can't use this item yet!" text + String message = Component.translatable("overlay.message").getString(); + minecraft.font.drawShadow(stack, message, cx - minecraft.font.width(message) / 2f, cy+2, 0xFF5555); + + // Draw the icon and required level text, shouldn't need to do it the RenderSystem/Tessellator way, but that would be cleaner for (int i = 0; i < requirements.size(); i++) { Requirement requirement = requirements.get(i); int maxLevel = Config.getMaxLevel(); - + int x = cx + i * 20 - requirements.size() * 10 + 2; - int y = cy + 15; + int y = cy + 12; int u = Math.min(requirement.level, maxLevel - 1) / (maxLevel / 4) * 16 + 176; int v = requirement.skill.index * 16 + 128; + RenderSystem.setShaderTexture(0, SkillScreen.RESOURCES); blit(stack, x, y, u, v, 16, 16); - + String level = Integer.toString(requirement.level); boolean met = SkillModel.get().getSkillLevel(requirement.skill) >= requirement.level; - minecraft.font.drawShadow(stack, level, x + 17 - minecraft.font.width(level), y + 9, met ? 0x55FF55 : 0xFF5555); + minecraft.font.drawShadow(stack, level, x + 17 - minecraft.font.width(level), y + 17, met ? 0x55FF55 : 0xFF5555); } } } } - + @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { if (showTicks > 0) showTicks--; } - + public static void showWarning(ResourceLocation resource) { requirements = Arrays.asList(Config.getRequirements(resource)); diff --git a/src/main/java/floris0106/rereskillablerereforked/client/Tooltip.java b/src/main/java/floris0106/rereskillablerereforked/client/Tooltip.java index fb45b4b..227bea0 100644 --- a/src/main/java/floris0106/rereskillablerereforked/client/Tooltip.java +++ b/src/main/java/floris0106/rereskillablerereforked/client/Tooltip.java @@ -5,9 +5,8 @@ import floris0106.rereskillablerereforked.common.skills.Requirement; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -20,18 +19,18 @@ public void onTooltipDisplay(ItemTooltipEvent event) { if (Minecraft.getInstance().player != null) { - Requirement[] requirements = Config.getRequirements(event.getItemStack().getItem().getRegistryName()); + Requirement[] requirements = Config.getRequirements(Registry.ITEM.getKey(event.getItemStack().getItem())); if (requirements != null) { List tooltips = event.getToolTip(); - tooltips.add(TextComponent.EMPTY); - tooltips.add(new TranslatableComponent("tooltip.requirements").append(":").withStyle(ChatFormatting.GRAY)); + tooltips.add(Component.empty()); + tooltips.add(Component.translatable("tooltip.requirements").append(":").withStyle(ChatFormatting.GRAY)); for (Requirement requirement : requirements) { ChatFormatting colour = SkillModel.get().getSkillLevel(requirement.skill) >= requirement.level ? ChatFormatting.GREEN : ChatFormatting.RED; - tooltips.add(new TranslatableComponent(requirement.skill.displayName).append(" " + requirement.level).withStyle(colour)); + tooltips.add(Component.translatable(requirement.skill.displayName).append(" " + requirement.level).withStyle(colour)); } } } diff --git a/src/main/java/floris0106/rereskillablerereforked/client/screen/InventoryTabs.java b/src/main/java/floris0106/rereskillablerereforked/client/screen/InventoryTabs.java index 8a9478f..35d5d70 100644 --- a/src/main/java/floris0106/rereskillablerereforked/client/screen/InventoryTabs.java +++ b/src/main/java/floris0106/rereskillablerereforked/client/screen/InventoryTabs.java @@ -10,7 +10,7 @@ public class InventoryTabs { @SubscribeEvent - public void onInitGui(ScreenEvent.InitScreenEvent event) + public void onInitGui(ScreenEvent.Init event) { Screen screen = event.getScreen(); diff --git a/src/main/java/floris0106/rereskillablerereforked/client/screen/SkillScreen.java b/src/main/java/floris0106/rereskillablerereforked/client/screen/SkillScreen.java index b7460d4..4887c8b 100644 --- a/src/main/java/floris0106/rereskillablerereforked/client/screen/SkillScreen.java +++ b/src/main/java/floris0106/rereskillablerereforked/client/screen/SkillScreen.java @@ -5,7 +5,7 @@ import floris0106.rereskillablerereforked.client.screen.buttons.SkillButton; import floris0106.rereskillablerereforked.common.skills.Skill; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; public class SkillScreen extends Screen @@ -14,7 +14,7 @@ public class SkillScreen extends Screen public SkillScreen() { - super(new TranslatableComponent("container.skills")); + super(Component.translatable("container.skills")); } @Override diff --git a/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/SkillButton.java b/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/SkillButton.java index 8708c5b..3ec88a3 100644 --- a/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/SkillButton.java +++ b/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/SkillButton.java @@ -11,8 +11,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.chat.Component; import net.minecraft.world.ContainerHelper; public class SkillButton extends AbstractButton @@ -21,7 +20,7 @@ public class SkillButton extends AbstractButton public SkillButton(int x, int y, Skill skill) { - super(x, y, 79, 32, TextComponent.EMPTY); + super(x, y, 79, 32, Component.empty()); this.skill = skill; } @@ -41,7 +40,7 @@ public void render(PoseStack stack, int mouseX, int mouseY, float partialTicks) blit(stack, x, y, 176, (level == maxLevel ? 64 : 0) + (isMouseOver(mouseX, mouseY) ? 32 : 0), width, height); blit(stack, x + 6, y + 8, u, v, 16, 16); - minecraft.font.draw(stack, new TranslatableComponent(skill.displayName), x + 25, y + 7, 0xFFFFFF); + minecraft.font.draw(stack, Component.translatable(skill.displayName), x + 25, y + 7, 0xFFFFFF); minecraft.font.draw(stack, level + "/" + maxLevel, x + 25, y + 18, 0xBEBEBE); if (isMouseOver(mouseX, mouseY) && level < maxLevel) diff --git a/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/TabButton.java b/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/TabButton.java index 22ff2d2..d8655de 100644 --- a/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/TabButton.java +++ b/src/main/java/floris0106/rereskillablerereforked/client/screen/buttons/TabButton.java @@ -7,7 +7,7 @@ import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.Component; public class TabButton extends AbstractButton { @@ -16,7 +16,7 @@ public class TabButton extends AbstractButton public TabButton(int x, int y, TabType type, boolean selected) { - super(x, y, 31, 28, TextComponent.EMPTY); + super(x, y, 31, 28, Component.empty()); this.type = type; this.selected = selected; diff --git a/src/main/java/floris0106/rereskillablerereforked/common/EventHandler.java b/src/main/java/floris0106/rereskillablerereforked/common/EventHandler.java index 8d50c59..5bb18a1 100644 --- a/src/main/java/floris0106/rereskillablerereforked/common/EventHandler.java +++ b/src/main/java/floris0106/rereskillablerereforked/common/EventHandler.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import floris0106.rereskillablerereforked.RereskillableRereforked; +import floris0106.rereskillablerereforked.client.Keybind; import floris0106.rereskillablerereforked.common.capabilities.SkillCapability; import floris0106.rereskillablerereforked.common.capabilities.SkillModel; import floris0106.rereskillablerereforked.common.capabilities.SkillProvider; @@ -19,6 +20,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.RegisterCommandsEvent; @@ -37,9 +39,9 @@ public class EventHandler @SubscribeEvent(priority = EventPriority.HIGHEST) public void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { - Player player = event.getPlayer(); + Player player = event.getEntity(); ItemStack item = event.getItemStack(); - Block block = event.getWorld().getBlockState(event.getPos()).getBlock(); + Block block = event.getLevel().getBlockState(event.getPos()).getBlock(); SkillModel model = SkillModel.get(player); if (!player.isCreative() && (!model.canUseItem(player, item) || !model.canUseBlock(player, block))) @@ -47,13 +49,18 @@ public void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) event.setCanceled(true); } } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onRegisterKeybindingsEvent(RegisterKeyMappingsEvent event){ + event.register(Keybind.openKey); + } @SubscribeEvent(priority = EventPriority.HIGHEST) public void onRightClickBlock(PlayerInteractEvent.RightClickBlock event) { - Player player = event.getPlayer(); + Player player = event.getEntity(); ItemStack item = event.getItemStack(); - Block block = event.getWorld().getBlockState(event.getPos()).getBlock(); + Block block = event.getLevel().getBlockState(event.getPos()).getBlock(); SkillModel model = SkillModel.get(player); if (!player.isCreative() && (!model.canUseItem(player, item) || !model.canUseBlock(player, block))) @@ -65,7 +72,7 @@ public void onRightClickBlock(PlayerInteractEvent.RightClickBlock event) @SubscribeEvent(priority = EventPriority.HIGHEST) public void onRightClickItem(PlayerInteractEvent.RightClickItem event) { - Player player = event.getPlayer(); + Player player = event.getEntity(); ItemStack item = event.getItemStack(); if (!player.isCreative() && !SkillModel.get(player).canUseItem(player, item)) @@ -77,7 +84,7 @@ public void onRightClickItem(PlayerInteractEvent.RightClickItem event) @SubscribeEvent(priority = EventPriority.HIGHEST) public void onRightClickEntity(PlayerInteractEvent.EntityInteract event) { - Player player = event.getPlayer(); + Player player = event.getEntity(); Entity entity = event.getTarget(); ItemStack item = event.getItemStack(); @@ -93,7 +100,7 @@ public void onRightClickEntity(PlayerInteractEvent.EntityInteract event) @SubscribeEvent(priority = EventPriority.HIGHEST) public void onAttackEntity(AttackEntityEvent event) { - Player player = event.getPlayer(); + Player player = event.getEntity(); if (player != null) { @@ -185,7 +192,7 @@ public void onAdvancement(AdvancementEvent event) case GOAL -> Config.getSkillFragmentsFromGoalAdvancements(); }; - event.getPlayer().addItem(new ItemStack(Items.SKILL_FRAGMENT.get(), fragments)); + event.getEntity().addItem(new ItemStack(Items.SKILL_FRAGMENT.get(), fragments)); } } @@ -200,26 +207,26 @@ public void onRegisterCommands(RegisterCommandsEvent event) @SubscribeEvent public void onPlayerClone(PlayerEvent.Clone event) { - SkillModel.get(event.getPlayer()).skillLevels = SkillModel.get(event.getOriginal()).skillLevels; + SkillModel.get(event.getEntity()).skillLevels = SkillModel.get(event.getOriginal()).skillLevels; event.getOriginal().getCapability(SkillCapability.INSTANCE).invalidate(); } @SubscribeEvent public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e) { - SyncSkills.send(e.getPlayer()); - SyncConfig.send(e.getPlayer()); + SyncSkills.send(e.getEntity()); + SyncConfig.send(e.getEntity()); } @SubscribeEvent public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent e) { - SyncSkills.send(e.getPlayer()); + SyncSkills.send(e.getEntity()); } @SubscribeEvent public void onChangeDimension(PlayerEvent.PlayerChangedDimensionEvent e) { - SyncSkills.send(e.getPlayer()); + SyncSkills.send(e.getEntity()); } } diff --git a/src/main/java/floris0106/rereskillablerereforked/common/capabilities/SkillModel.java b/src/main/java/floris0106/rereskillablerereforked/common/capabilities/SkillModel.java index c6a1b0f..b4937de 100644 --- a/src/main/java/floris0106/rereskillablerereforked/common/capabilities/SkillModel.java +++ b/src/main/java/floris0106/rereskillablerereforked/common/capabilities/SkillModel.java @@ -5,6 +5,7 @@ import floris0106.rereskillablerereforked.common.skills.Requirement; import floris0106.rereskillablerereforked.common.skills.Skill; import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -35,17 +36,17 @@ public void increaseSkillLevel(Skill skill) public boolean canUseItem(Player player, ItemStack item) { - return canUse(player, item.getItem().getRegistryName()); + return canUse(player, Registry.ITEM.getKey(item.getItem())); } public boolean canUseBlock(Player player, Block block) { - return canUse(player, block.getRegistryName()); + return canUse(player, Registry.BLOCK.getKey(block)); } public boolean canUseEntity(Player player, Entity entity) { - return canUse(player, entity.getType().getRegistryName()); + return canUse(player, Registry.ENTITY_TYPE.getKey(entity.getType())); } private boolean canUse(Player player, ResourceLocation resource) diff --git a/src/main/java/floris0106/rereskillablerereforked/common/commands/GetCommand.java b/src/main/java/floris0106/rereskillablerereforked/common/commands/GetCommand.java index c7f605a..dfb9bd5 100644 --- a/src/main/java/floris0106/rereskillablerereforked/common/commands/GetCommand.java +++ b/src/main/java/floris0106/rereskillablerereforked/common/commands/GetCommand.java @@ -9,7 +9,7 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.server.command.EnumArgument; @@ -31,7 +31,7 @@ public int run(CommandContext context) throws CommandSyntaxE Skill skill = context.getArgument("skill", Skill.class); int level = SkillModel.get(player).getSkillLevel(skill); - context.getSource().sendSuccess(new TranslatableComponent(skill.displayName).append(" " + level), true); + context.getSource().sendSuccess(Component.translatable(skill.displayName).append(" " + level), true); return 1; } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index a8e4cb0..4785081 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,36 +1,66 @@ -modLoader = "javafml" -loaderVersion = "[40.0,)" -license = "MIT" +# This is an example mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader="javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the forge version +loaderVersion="[43,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +# 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" +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="http://my.issue.tracker/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId="rereskillablerereforked" #mandatory +# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it +# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata +# see the associated build.gradle script for how to populate this completely automatically during a build +version="${file.jarVersion}" #mandatory +# A display name for the mod +displayName="RereskillableRereforked" #mandatory +# A URL to query for updates for this mod. See the JSON update specification +#updateJSONURL="http://myurl.me/" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="http://example.com/" #optional +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="rereskillablerereforked.png" #optional +# A text field displayed in the mod UI +#credits="Thanks for this example mod goes to Java" #optional +# A text field displayed in the mod UI +#authors="Love, Cheese and small house plants" #optional +# Display Test controls the display for your mod in the server connection screen +# MATCH_VERSION means that your mod will cause a red X if the versions on client and server differ. This is the default behaviour and should be what you choose if you have server and client elements to your mod. +# IGNORE_SERVER_VERSION means that your mod will not cause a red X if it's present on the server but not on the client. This is what you should use if you're a server only mod. +# IGNORE_ALL_VERSION means that your mod will not cause a red X if it's present on the client or the server. This is a special case and should only be used if your mod has no server component. +# NONE means that no display test is set on your mod. You need to do this yourself, see IExtensionPoint.DisplayTest for more information. You can define any scheme you wish with this value. +# IMPORTANT NOTE: this is NOT an instruction as to which environments (CLIENT or DEDICATED SERVER) your mod loads on. Your mod should load (and maybe do nothing!) whereever it finds itself. +#displayTest="MATCH_VERSION" # MATCH_VERSION is the default if nothing is specified (#optional) -[[mods]] - modId = "rereskillablerereforked" - version = "${file.jarVersion}" - displayName = "Rereskillable Rereforked" - displayURL = "https://www.curseforge.com/minecraft/mc-mods/rereskillable-rereforked" - logoFile = "icon.png" - credits = "Credits go to Vazkii (author of Skillable), lanse505 (author of Reskillable, among others) and majik (author of Rereskillable)." - authors = "Floris0106" - description = ''' -Rereskillable Rereforked is a fork of Rereskillable, which is a fork of Reskillable, which is a fork of Skillable. -''' - -[[dependencies.rereskillablerereforked]] - modId = "forge" - mandatory = true - versionRange = "[40.0,)" - ordering = "NONE" - side = "BOTH" - -[[dependencies.rereskillablerereforked]] - modId = "minecraft" - mandatory = true - versionRange = "[1.18.2]" - ordering = "NONE" - side = "BOTH" +# The description text for the mod (multi line!) (#mandatory) +description=''' +''' +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.rereskillablerereforked]] #optional + # the modid of the dependency + modId="forge" #mandatory + # Does this dependency have to exist - if not, ordering below must be specified + mandatory=true #mandatory + # The version range of the dependency + versionRange="[43,)" #mandatory + # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT or SERVER + side="BOTH" +# Here's another dependency [[dependencies.rereskillablerereforked]] - modId = "curios" - mandatory = false - versionRange = "[1.18.2-5.0.6.3,)" - ordering = "AFTER" - side = "BOTH" \ No newline at end of file + modId="minecraft" + mandatory=true + # This version range declares a minimum of the current minecraft version up to but not including the next major version + versionRange="[1.19.2,1.20)" + ordering="NONE" + side="BOTH" diff --git a/src/main/resources/assets/rereskillablerereforked/lang/en_us.json b/src/main/resources/assets/rereskillablerereforked/lang/en_us.json index 6b78b29..cbb93e9 100644 --- a/src/main/resources/assets/rereskillablerereforked/lang/en_us.json +++ b/src/main/resources/assets/rereskillablerereforked/lang/en_us.json @@ -11,5 +11,6 @@ "container.skills": "Skills", "overlay.message": "You can't use this item yet!", "tooltip.requirements": "Requirements", - "key.skills": "Open Skills" + "key.skills": "Open Skills", + "Rereskillable": "Rereskillable" } \ No newline at end of file