Simply invoke `./gradlew build` in the mod directory and after some time the
finished jar will be saved at
-`build/libs/TurnBasedMinecraft-Forge-1.25.0-all.jar`
+`build/libs/TurnBasedMinecraft-Forge-1.25.1-all.jar`
# Reproducibility
id 'net.minecraftforge.gradle' version '[6.0.16,6.2)'
}
-version = "1.25.0"
-group = "com.burnedkirby.TurnBasedMinecraft"
+version = mod_version
+group = mod_group_id
archivesBaseName = "TurnBasedMinecraft-Forge"
java.toolchain.languageVersion = JavaLanguageVersion.of(17)
// Default run configurations.
// These can be tweaked, removed, or duplicated as needed.
runs {
- client {
+ // applies to all the run configs below
+ configureEach {
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'
+ }
+ client {
// Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
- property 'forge.enabledGameTestNamespaces', 'TurnBasedMinecraftMod'
-
- mods {
- TurnBasedMinecraftMod {
- source sourceSets.main
- }
- }
+ property 'forge.enabledGameTestNamespaces', mod_id
}
server {
- workingDirectory project.file('run')
-
- // Recommended logging data for a userdev environment
- property 'forge.logging.markers', 'REGISTRIES'
-
- // Recommended logging level for the console
- property 'forge.logging.console.level', 'debug'
-
- // Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
- property 'forge.enabledGameTestNamespaces', 'TurnBasedMinecraftMod'
-
- mods {
- TurnBasedMinecraftMod {
- source sourceSets.main
- }
- }
+ property 'forge.enabledGameTestNamespaces', mod_id
+ args '--nogui'
}
// 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')
-
- // 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', 'TurnBasedMinecraftMod'
-
- mods {
- TurnBasedMinecraftMod {
- source sourceSets.main
- }
- }
+ property 'forge.enabledGameTestNamespaces', mod_id
}
data {
- workingDirectory project.file('run')
+ // example of overriding the workingDirectory set in configureEach above
+ workingDirectory project.file('run-data')
- // Recommended logging data for a userdev environment
- property 'forge.logging.markers', 'REGISTRIES'
-
- // Recommended logging level for the console
- property 'forge.logging.console.level', 'debug'
-
- args '--mod', 'TurnBasedMinecraftMod', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources')
-
- mods {
- TurnBasedMinecraftMod {
- source sourceSets.main
- }
- }
+ // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
+ args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')
}
}
}
// 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'
-// // }
-// mavenCentral()
-// jcenter()
-//
-// dependencies {
-// classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.4'
-// }
-//}
-
repositories {
flatDir {
dir 'libs'
}
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.
+ // Specify the version of Minecraft to use.
+ // Any artifact can be supplied so long as it has a "userdev" classifier artifact and is a compatible patcher artifact.
+ // The "userdev" classifier will be requested and setup by ForgeGradle.
+ // If the group id is "net.minecraft" and the artifact id is one of ["client", "server", "joined"],
+ // then special handling is done to allow a setup of a vanilla dependency without the use of an external repository.
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
- // 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
- //implementation files('libs/javamp3-1.0.3.jar')
implementation 'fr.delthas:javamp3:1.0.3'
implementation 'com.github.stephengold:j-ogg-vorbis:1.0.4'
}
}
-// Example for how to get properties into the manifest for reading by the runtime..
-jar {
- archiveClassifier = 'slim'
+// Example for how to get properties into the manifest for reading at runtime.
+tasks.named('jar', Jar).configure {
manifest {
attributes([
- "Specification-Title": "TurnBasedMinecraftMod",
- "Specification-Vendor": "TurnBasedMinecraftMod_BK",
- "Specification-Version": "1", // We are version 1 of ourselves
- "Implementation-Title": "TurnBasedMinecraftMod",
- "Implementation-Version": "${version}",
- "Implementation-Vendor" :"TurnBasedMinecraftMod_BK",
- // Do not place timestamp for the sake of reproducible builds
-// "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
-// "ContainedDeps": "javamp3-1.0.3.jar"
+ 'Specification-Title' : mod_id,
+ 'Specification-Vendor' : mod_authors,
+ 'Specification-Version' : '1', // We are version 1 of ourselves
+ 'Implementation-Title' : "TurnBasedMinecraftMod",
+ 'Implementation-Version' : project.jar.archiveVersion,
+ 'Implementation-Vendor' : mod_authors
])
}
+
+ // This is the preferred method to reobfuscate your jar file
+ finalizedBy 'reobfJar'
}
// Reproducible Builds
reproducibleFileOrder = true
}
-// Example configuration to allow publishing using the maven-publish task
-// we define a custom artifact that is sourced from the reobfJar output task
-// and then declare that to be published
-// Note you'll need to add a repository here
-//def reobfFile = file("$buildDir/reobfJar/output.jar")
-//def reobfArtifact = artifacts.add('default', reobfFile) {
-// type 'jar'
-// builtBy 'reobfJar'
-//}
-//publishing {
-// publications {
-// mavenJava(MavenPublication) {
-// artifact reobfArtifact
-// }
-// }
-// repositories {
-// maven {
-// url "file:///${project.projectDir}/mcmodsrepo"
-// }
-// }
-//}
+tasks.withType(JavaCompile).configureEach {
+ options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
+}
+
+// Merge the resources and classes into the same directory.
+// This is done because java expects modules to be in a single directory.
+// And if we have it in multiple we have to do performance intensive hacks like having the UnionFileSystem
+// This will eventually be migrated to ForgeGradle so modders don't need to manually do it. But that is later.
+sourceSets.each {
+ def dir = layout.buildDirectory.dir("sourcesSets/$it.name")
+ it.output.resourcesDir = dir
+ it.java.destinationDirectory = dir
+}
## Environment Properties
# The Minecraft version must agree with the Forge version to get a valid artifact
-minecraft_version=1.20.2
+minecraft_version=1.20.4
# The Minecraft version range can use any release version of Minecraft as bounds.
# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly
# as they do not follow standard versioning conventions.
-minecraft_version_range=[1.20.2,1.21)
+minecraft_version_range=[1.20.4,1.21)
# The Forge version must agree with the Minecraft version to get a valid artifact
-forge_version=48.1.0
+forge_version=49.0.19
# The Forge version range can use any version of Forge as bounds or match the loader version range
-forge_version_range=[48,)
+forge_version_range=[0,)
# The loader version range can only use the major version of Forge/FML as bounds
-loader_version_range=[48,)
+loader_version_range=[0,)
# The mapping channel to use for mappings.
# The default set of supported mapping channels are ["official", "snapshot", "snapshot_nodoc", "stable", "stable_nodoc"].
# Additional mapping channels can be registered through the "channelProviders" extension in a Gradle plugin.
mapping_channel=official
# The mapping version to query from the mapping channel.
# This must match the format required by the mapping channel.
-mapping_version=1.20.2
+mapping_version=1.20.4
## Mod Properties
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=MIT
# The mod version. See https://semver.org/
-mod_version=1.25.0
+mod_version=1.25.1
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
-#mod_group_id=com.example.examplemod
+mod_group_id=com.burnedkirby.TurnBasedMinecraft
# The authors of the mod. This is a simple text string that is used for display purposes in the mod list.
mod_authors=BurnedKirby a.k.a. Stephen Seo
# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list.
.getSideAEntrySet()) {
if (e.getValue().entity != null) {
addRenderableWidget(new EntitySelectionButton(width / 4 - 60, y, 120, 20, e.getValue().entity.getDisplayName(), e.getKey(), true, (button) -> {
- buttonActionEvent(button, ButtonAction.ATTACK_TARGET);
+ entityButtonActionEvent(button, ButtonAction.ATTACK_TARGET);
}));
} else {
addRenderableWidget(new EntitySelectionButton(width / 4 - 60, y, 120, 20, "Unknown", e.getKey(), true, (button) -> {
- buttonActionEvent(button, ButtonAction.ATTACK_TARGET);
+ entityButtonActionEvent(button, ButtonAction.ATTACK_TARGET);
}));
}
y += 20;
.getSideBEntrySet()) {
if (e.getValue().entity != null) {
addRenderableWidget(new EntitySelectionButton(width * 3 / 4 - 60, y, 120, 20, e.getValue().entity.getDisplayName(), e.getKey(), false, (button) -> {
- buttonActionEvent(button, ButtonAction.ATTACK_TARGET);
+ entityButtonActionEvent(button, ButtonAction.ATTACK_TARGET);
}));
} else {
addRenderableWidget(new EntitySelectionButton(width * 3 / 4 - 60, y, 120, 20, "Unknown", e.getKey(), false, (button) -> {
- buttonActionEvent(button, ButtonAction.ATTACK_TARGET);
+ entityButtonActionEvent(button, ButtonAction.ATTACK_TARGET);
}));
}
y += 20;
case SWITCH_ITEM:
info = "To which item will you switch to?";
for (int i = 0; i < 9; ++i) {
- addRenderableWidget(new ItemSelectionButton(width / 2 - 88 + i * 20, height - 19, 16, 16, "", i, (button) -> {
- buttonActionEvent(button, ButtonAction.DO_ITEM_SWITCH);
+ addRenderableWidget(new ItemSelectionButton(width / 2 - 88 + i * 20, height - 19, 16, 16, i, (button) -> {
+ itemButtonActionEvent(button, ButtonAction.DO_ITEM_SWITCH);
}));
}
addRenderableWidget(Button.builder(Component.literal("Cancel"), (button) -> {
case USE_ITEM:
info = "Which item will you use?";
for (int i = 0; i < 9; ++i) {
- addRenderableWidget(new ItemSelectionButton(width / 2 - 88 + i * 20, height - 19, 16, 16, "", i, (button) -> {
- buttonActionEvent(button, ButtonAction.DO_USE_ITEM);
+ addRenderableWidget(new ItemSelectionButton(width / 2 - 88 + i * 20, height - 19, 16, 16, i, (button) -> {
+ itemButtonActionEvent(button, ButtonAction.DO_USE_ITEM);
}));
}
addRenderableWidget(Button.builder(Component.literal("Cancel"), (button) -> {
drawString(guiGraphics, info, width / 2 - stringWidth / 2, 20, 0xFFFFFFFF);
}
- @Override
- public void renderBackground(GuiGraphics p_283688_, int p_299421_, int p_298679_, float p_297268_) {
- }
-
protected void buttonActionEvent(AbstractButton button, ButtonAction action) {
switch (action) {
case ATTACK:
setState(MenuState.WAITING);
break;
case ATTACK_TARGET:
- if (button instanceof EntitySelectionButton) {
- TurnBasedMinecraftMod.getHandler().send(new PacketBattleDecision(
- TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.ATTACK, ((EntitySelectionButton) button).getID()),
- PacketDistributor.SERVER.noArg());
- setState(MenuState.WAITING);
- } else {
- setState(MenuState.MAIN_MENU);
- }
+ // Invalid but set to main menu anyways.
+ setState(MenuState.MAIN_MENU);
break;
case SWITCH_HELD_ITEM:
setState(MenuState.SWITCH_ITEM);
setState(MenuState.MAIN_MENU);
break;
case DO_ITEM_SWITCH:
- if (button instanceof ItemSelectionButton) {
- TurnBasedMinecraftMod.getHandler().send(new PacketBattleDecision(
- TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.SWITCH_ITEM, ((ItemSelectionButton) button).getID()),
+ // Invalid but set to main menu anyways.
+ setState(MenuState.MAIN_MENU);
+ break;
+ case DO_USE_ITEM:
+ // Invalid, but set menu to main menu anyways.
+ setState(MenuState.MAIN_MENU);
+ break;
+ }
+ }
+
+ protected void entityButtonActionEvent(EntitySelectionButton button, ButtonAction action) {
+ if (action.equals(ButtonAction.ATTACK_TARGET)) {
+ TurnBasedMinecraftMod.getHandler().send(new PacketBattleDecision(
+ TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.ATTACK, button.getID()),
+ PacketDistributor.SERVER.noArg());
+ setState(MenuState.WAITING);
+ } else {
+ setState(MenuState.MAIN_MENU);
+ }
+ }
+
+ protected void itemButtonActionEvent(ItemSelectionButton button, ButtonAction action) {
+ switch (action) {
+ case DO_ITEM_SWITCH:
+ TurnBasedMinecraftMod.getHandler().send(
+ new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.SWITCH_ITEM, button.getID()),
PacketDistributor.SERVER.noArg());
- if (((ItemSelectionButton) button).getID() >= 0 && ((ItemSelectionButton) button).getID() < 9) {
- Minecraft.getInstance().player.getInventory().selected = ((ItemSelectionButton) button).getID();
+ if (button.getID() >= 0 && button.getID() < 9) {
+ Minecraft.getInstance().player.getInventory().selected = button.getID();
}
setState(MenuState.WAITING);
- } else {
- setState(MenuState.MAIN_MENU);
- }
- break;
- case DO_USE_ITEM:
- if (button instanceof ItemSelectionButton) {
- TurnBasedMinecraftMod.getHandler().send(new PacketBattleDecision(
- TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.USE_ITEM, ((ItemSelectionButton) button).getID()),
+ break;
+ case DO_USE_ITEM:
+ TurnBasedMinecraftMod.getHandler().send(
+ new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.USE_ITEM, button.getID()),
PacketDistributor.SERVER.noArg());
setState(MenuState.WAITING);
- } else {
+ break;
+ default:
setState(MenuState.MAIN_MENU);
- }
- break;
+ break;
}
}
return false; // TODO verify return value
}
+ @Override
+ public void renderBackground(GuiGraphics p_283688_, int p_299421_, int p_298679_, float p_297268_) {
+ // Left blank to not render background.
+ }
+
@Override
public boolean keyReleased(int a, int b, int c) {
if (getMinecraft().player.isCreative()) {
package com.burnedkirby.TurnBasedMinecraft.client;
-import com.burnedkirby.TurnBasedMinecraft.common.CommonProxy;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
-import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.client.gui.components.AbstractButton;
+import net.minecraft.client.gui.components.Button;
+import net.minecraft.client.gui.components.Renderable;
+import net.minecraft.client.gui.components.events.GuiEventListener;
+import net.minecraft.client.gui.narration.NarratableEntry;
import net.minecraft.client.gui.narration.NarratedElementType;
import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
-public class EntitySelectionButton extends AbstractButton {
- TBMButtonPress onPress;
+public class EntitySelectionButton implements Renderable, GuiEventListener, NarratableEntry {
+ private int x;
+ private int y;
+ private int width;
+ private int height;
+ private boolean focused;
+ private Button nestedButton;
+ TBMEntityButtonPress onPress;
private int entityID;
private boolean isSideA;
- public EntitySelectionButton(int x, int y, int widthIn, int heightIn, String buttonText, int entityID, boolean isSideA, TBMButtonPress onPress) {
- super(x, y, widthIn, heightIn, Component.literal(buttonText));
+ public EntitySelectionButton(int x, int y, int widthIn, int heightIn, String buttonText, int entityID, boolean isSideA, TBMEntityButtonPress onPress) {
+ this.x = x;
+ this.y = y;
+ this.width = widthIn;
+ this.height = heightIn;
this.onPress = onPress;
this.entityID = entityID;
this.isSideA = isSideA;
+ this.nestedButton = Button.builder(Component.literal(buttonText), (unused) -> {}).pos(x, y).size(widthIn, heightIn).build();
}
- public EntitySelectionButton(int x, int y, int widthIn, int heightIn, Component buttonTextComponent, int entityID, boolean isSideA, TBMButtonPress onPress) {
- super(x, y, widthIn, heightIn, buttonTextComponent);
+ public EntitySelectionButton(int x, int y, int widthIn, int heightIn, Component buttonTextComponent, int entityID, boolean isSideA, TBMEntityButtonPress onPress) {
+ this.x = x;
+ this.y = y;
+ this.width = widthIn;
+ this.height = heightIn;
this.onPress = onPress;
this.entityID = entityID;
this.isSideA = isSideA;
+ this.nestedButton = Button.builder(buttonTextComponent, (unused) -> {}).pos(x, y).size(widthIn, heightIn).build();
}
public int getID() {
@Override
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
- super.render(guiGraphics, mouseX, mouseY, partialTicks);
+ this.nestedButton.render(guiGraphics, mouseX, mouseY, partialTicks);
Entity e = Minecraft.getInstance().level.getEntity(entityID);
if (e != null && e instanceof LivingEntity && ((LivingEntity) e).isAlive()) {
int health = (int) (((LivingEntity) e).getHealth() + 0.5f);
- int xpos = getX();
+ int xpos = this.x;
int xoffset;
if (isSideA) {
- xpos += getWidth() + 4;
+ xpos += this.width + 4;
xoffset = 4;
} else {
xpos -= 6;
xoffset = -4;
}
if (health > 200) {
- guiGraphics.fill(xpos, getY() + getHeight() * 4 / 5, xpos + 2, getY() + getHeight(), 0xFFFF0000);
- guiGraphics.fill(xpos, getY() + getHeight() * 3 / 5, xpos + 2, getY() + getHeight() * 4 / 5, 0xFFFFFF00);
- guiGraphics.fill(xpos, getY() + getHeight() * 2 / 5, xpos + 2, getY() + getHeight() * 3 / 5, 0xFF00FF00);
- guiGraphics.fill(xpos, getY() + getHeight() / 5, xpos + 2, getY() + getHeight() * 2 / 5, 0xFF00FFFF);
- guiGraphics.fill(xpos, getY(), xpos + 2, getY() + getHeight() / 5, 0xFF0000FF);
- int healthHeight = ((health - 200) * getHeight() / 100);
- guiGraphics.fill(xpos + xoffset, getY() + getHeight() - healthHeight, xpos + xoffset + 2, getY() + getHeight(), 0xFFFFFFFF);
+ guiGraphics.fill(xpos, this.y + this.height * 4 / 5, xpos + 2, this.y + this.height, 0xFFFF0000);
+ guiGraphics.fill(xpos, this.y + this.height * 3 / 5, xpos + 2, this.y + this.height * 4 / 5, 0xFFFFFF00);
+ guiGraphics.fill(xpos, this.y + this.height * 2 / 5, xpos + 2, this.y + this.height * 3 / 5, 0xFF00FF00);
+ guiGraphics.fill(xpos, this.y + this.height / 5, xpos + 2, this.y + this.height * 2 / 5, 0xFF00FFFF);
+ guiGraphics.fill(xpos, this.y, xpos + 2, this.y + this.height / 5, 0xFF0000FF);
+ int healthHeight = ((health - 200) * this.height / 100);
+ guiGraphics.fill(xpos + xoffset, this.y + this.height - healthHeight, xpos + xoffset + 2, this.y + this.height, 0xFFFFFFFF);
} else if (health > 100) {
- guiGraphics.fill(xpos, getY() + getHeight() * 4 / 5, xpos + 2, getY() + getHeight(), 0xFFFF0000);
- guiGraphics.fill(xpos, getY() + getHeight() * 3 / 5, xpos + 2, getY() + getHeight() * 4 / 5, 0xFFFFFF00);
- guiGraphics.fill(xpos, getY() + getHeight() * 2 / 5, xpos + 2, getY() + getHeight() * 3 / 5, 0xFF00FF00);
- guiGraphics.fill(xpos, getY() + getHeight() / 5, xpos + 2, getY() + getHeight() * 2 / 5, 0xFF00FFFF);
- int healthHeight = ((health - 100) * getHeight() / 100);
- guiGraphics.fill(xpos + xoffset, getY() + getHeight() - healthHeight, xpos + xoffset + 2, getY() + getHeight(), 0xFF0000FF);
+ guiGraphics.fill(xpos, this.y + this.height * 4 / 5, xpos + 2, this.y + this.height, 0xFFFF0000);
+ guiGraphics.fill(xpos, this.y + this.height * 3 / 5, xpos + 2, this.y + this.height * 4 / 5, 0xFFFFFF00);
+ guiGraphics.fill(xpos, this.y + this.height * 2 / 5, xpos + 2, this.y + this.height * 3 / 5, 0xFF00FF00);
+ guiGraphics.fill(xpos, this.y + this.height / 5, xpos + 2, this.y + this.height * 2 / 5, 0xFF00FFFF);
+ int healthHeight = ((health - 100) * this.height / 100);
+ guiGraphics.fill(xpos + xoffset, this.y + this.height - healthHeight, xpos + xoffset + 2, this.y + this.height, 0xFF0000FF);
} else if (health > 50) {
- guiGraphics.fill(xpos, getY() + getHeight() * 4 / 5, xpos + 2, getY() + getHeight(), 0xFFFF0000);
- guiGraphics.fill(xpos, getY() + getHeight() * 3 / 5, xpos + 2, getY() + getHeight() * 4 / 5, 0xFFFFFF00);
- guiGraphics.fill(xpos, getY() + getHeight() * 2 / 5, xpos + 2, getY() + getHeight() * 3 / 5, 0xFF00FF00);
- int healthHeight = ((health - 50) * getHeight() / 50);
- guiGraphics.fill(xpos + xoffset, getY() + getHeight() - healthHeight, xpos + xoffset + 2, getY() + getHeight(), 0xFF00FFFF);
+ guiGraphics.fill(xpos, this.y + this.height * 4 / 5, xpos + 2, this.y + this.height, 0xFFFF0000);
+ guiGraphics.fill(xpos, this.y + this.height * 3 / 5, xpos + 2, this.y + this.height * 4 / 5, 0xFFFFFF00);
+ guiGraphics.fill(xpos, this.y + this.height * 2 / 5, xpos + 2, this.y + this.height * 3 / 5, 0xFF00FF00);
+ int healthHeight = ((health - 50) * this.height / 50);
+ guiGraphics.fill(xpos + xoffset, this.y + this.height - healthHeight, xpos + xoffset + 2, this.y + this.height, 0xFF00FFFF);
} else if (health > 20) {
- guiGraphics.fill(xpos, getY() + getHeight() * 4 / 5, xpos + 2, getY() + getHeight(), 0xFFFF0000);
- guiGraphics.fill(xpos, getY() + getHeight() * 3 / 5, xpos + 2, getY() + getHeight() * 4 / 5, 0xFFFFFF00);
- int healthHeight = ((health - 20) * getHeight() / 30);
- guiGraphics.fill(xpos + xoffset, getY() + getHeight() - healthHeight, xpos + xoffset + 2, getY() + getHeight(), 0xFF00FF00);
+ guiGraphics.fill(xpos, this.y + this.height * 4 / 5, xpos + 2, this.y + this.height, 0xFFFF0000);
+ guiGraphics.fill(xpos, this.y + this.height * 3 / 5, xpos + 2, this.y + this.height * 4 / 5, 0xFFFFFF00);
+ int healthHeight = ((health - 20) * this.height / 30);
+ guiGraphics.fill(xpos + xoffset, this.y + this.height - healthHeight, xpos + xoffset + 2, this.y + this.height, 0xFF00FF00);
} else if (health > 10) {
- guiGraphics.fill(xpos, getY() + getHeight() * 4 / 5, xpos + 2, getY() + getHeight(), 0xFFFF0000);
- int healthHeight = ((health - 10) * getHeight() / 10);
- guiGraphics.fill(xpos + xoffset, getY() + getHeight() - healthHeight, xpos + xoffset + 2, getY() + getHeight(), 0xFFFFFF00);
+ guiGraphics.fill(xpos, this.y + this.height * 4 / 5, xpos + 2, this.y + this.height, 0xFFFF0000);
+ int healthHeight = ((health - 10) * this.height / 10);
+ guiGraphics.fill(xpos + xoffset, this.y + this.height - healthHeight, xpos + xoffset + 2, this.y + this.height, 0xFFFFFF00);
} else {
- int healthHeight = (health * getHeight() / 10);
- guiGraphics.fill(xpos + xoffset, getY() + getHeight() - healthHeight, xpos + xoffset + 2, getY() + getHeight(), 0xFFFF0000);
+ int healthHeight = (health * this.height / 10);
+ guiGraphics.fill(xpos + xoffset, this.y + this.height - healthHeight, xpos + xoffset + 2, this.y + this.height, 0xFFFF0000);
}
}
}
+ public void onPress() {
+ onPress.onPress(this);
+ }
+
@Override
- protected void updateWidgetNarration(NarrationElementOutput p_259858_) {
- p_259858_.add(NarratedElementType.HINT, TurnBasedMinecraftMod.proxy.getEntity(entityID, Minecraft.getInstance().level.dimension()).getName());
+ public void setFocused(boolean b) {
+ this.focused = b;
}
@Override
- public void onPress() {
- onPress.onPress(this);
+ public boolean isFocused() {
+ return focused;
+ }
+
+ @Override
+ public NarrationPriority narrationPriority() {
+ return NarrationPriority.FOCUSED;
+ }
+
+ @Override
+ public void updateNarration(NarrationElementOutput narrationElementOutput) {
+ narrationElementOutput.add(NarratedElementType.HINT, TurnBasedMinecraftMod.proxy.getEntity(entityID, Minecraft.getInstance().level.dimension()).getName());
+ }
+
+ @Override
+ public boolean mouseClicked(double x, double y, int unknown) {
+ if (unknown == 0 && x >= this.x && y >= this.y && x <= (double)(this.x + this.width) && y <= (double)(this.y + this.height)) {
+ onPress();
+ return true;
+ }
+ return false;
}
}
package com.burnedkirby.TurnBasedMinecraft.client;
-import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.client.gui.components.AbstractButton;
+import net.minecraft.client.gui.components.Renderable;
+import net.minecraft.client.gui.components.events.GuiEventListener;
+import net.minecraft.client.gui.narration.NarratableEntry;
import net.minecraft.client.gui.narration.NarratedElementType;
import net.minecraft.client.gui.narration.NarrationElementOutput;
-import net.minecraft.network.chat.Component;
-public class ItemSelectionButton extends AbstractButton {
-
- TBMButtonPress onPress;
+public class ItemSelectionButton implements Renderable, GuiEventListener, NarratableEntry {
+ private int x;
+ private int y;
+ private int width;
+ private int height;
+ TBMItemButtonPress onPress;
private int itemStackID;
+ private boolean focused;
- public ItemSelectionButton(int x, int y, int widthIn, int heightIn, String buttonText, int itemStackID, TBMButtonPress onPress) {
- super(x, y, widthIn, heightIn, Component.literal(buttonText));
+ public ItemSelectionButton(int x, int y, int widthIn, int heightIn, int itemStackID, TBMItemButtonPress onPress) {
+ this.x = x;
+ this.y = y;
+ this.width = widthIn;
+ this.height = heightIn;
this.onPress = onPress;
this.itemStackID = itemStackID;
}
@Override
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float unk) {
- if (visible) {
- boolean hovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + getWidth() && mouseY < getY() + getHeight();
- if (hovered) {
- guiGraphics.fill(getX(), getY(), getX() + getWidth(), getY() + getHeight(), 0x80FFFFFF);
- } else {
- guiGraphics.fill(getX(), getY(), getX() + getWidth(), getY() + getHeight(), 0x20707070);
- }
+ boolean hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height;
+ if (hovered) {
+ guiGraphics.fill(this.x, this.y, this.x + this.width, this.y + this.height, 0x80FFFFFF);
+ } else {
+ guiGraphics.fill(this.x, this.y, this.x + this.width, this.y + this.height, 0x20707070);
}
}
+ public void onPress() {
+ onPress.onPress(this);
+ }
+
@Override
- protected void updateWidgetNarration(NarrationElementOutput p_259858_) {
- p_259858_.add(NarratedElementType.HINT, "Item " + this.itemStackID);
+ public void setFocused(boolean b) {
+ focused = b;
}
@Override
- public void onPress() {
- onPress.onPress(this);
+ public boolean isFocused() {
+ return focused;
+ }
+
+ @Override
+ public NarrationPriority narrationPriority() {
+ return NarrationPriority.FOCUSED;
+ }
+
+ @Override
+ public void updateNarration(NarrationElementOutput narrationElementOutput) {
+ narrationElementOutput.add(NarratedElementType.HINT, "Item " + this.itemStackID);
+ }
+
+ @Override
+ public boolean mouseClicked(double x, double y, int unknown) {
+ if (unknown == 0 && x >= this.x && y >= this.y && x <= (double)(this.x + this.width) && y <= (double)(this.y + this.height)) {
+ onPress();
+ return true;
+ }
+ return false;
}
-}
\ No newline at end of file
+}
--- /dev/null
+package com.burnedkirby.TurnBasedMinecraft.client;
+
+public interface TBMEntityButtonPress {
+ void onPress(EntitySelectionButton button);
+}
--- /dev/null
+package com.burnedkirby.TurnBasedMinecraft.client;
+
+public interface TBMItemButtonPress {
+ void onPress(ItemSelectionButton button);
+}
public class TurnBasedMinecraftMod {
public static final String MODID = "com_burnedkirby_turnbasedminecraft";
public static final String NAME = "Turn Based Minecraft Mod";
- public static final String VERSION = "1.25.0";
+ public static final String VERSION = "1.25.1";
public static final String CONFIG_FILENAME = "TBM_Config.toml";
public static final String DEFAULT_CONFIG_FILENAME = "TBM_Config_DEFAULT.toml";
public static final String CONFIG_DIRECTORY = "config/TurnBasedMinecraft/";
}
private void firstInit(final FMLCommonSetupEvent event) {
- proxy = DistExecutor.safeRunForDist(() -> ClientProxy::new, () -> CommonProxy::new);
+ proxy = DistExecutor.unsafeRunForDist(() -> () -> new ClientProxy(), () -> () -> new CommonProxy());
proxy.setLogger(logger);
proxy.initialize();
Implements turn-based-battle in Minecraft.
'''
-logoFile="/assets/com_burnedkirby_turnbasedminecraft/tbmm_icon.png"
+logoFile="assets/com_burnedkirby_turnbasedminecraft/tbmm_icon.png"
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.com_burnedkirby_turnbasedminecraft]] #optional