From 5a6bb2c2fb0228a897395156f589325871adbf96 Mon Sep 17 00:00:00 2001 From: Sam van Remortel Date: Sun, 24 May 2026 15:52:40 +0200 Subject: [PATCH] Initial commit: Vault Party UI (massuus) --- .gitignore | 32 ++ .vscode/launch.json | 13 + .vscode/settings.json | 4 + .vscode/tasks.json | 61 ++ README.md | 48 ++ build.gradle | 97 ++++ gradle.properties | 12 + gradle/wrapper/gradle-cli.jar | Bin 0 -> 27391 bytes gradle/wrapper/gradle-wrapper-shared.jar | Bin 0 -> 32273 bytes gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59376 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 4 + gradlew.bat | 14 + ...he_vault-1.18.2-3.21.5-remastered.6574.pom | 9 + settings.gradle | 8 + .../massuus/vaultpartyui/VaultPartyUiMod.java | 11 + .../client/ClientKeyMappings.java | 28 + .../client/ClientSetupEvents.java | 18 + .../vaultpartyui/client/ClientTickEvents.java | 30 + .../client/screen/PartyScreen.java | 544 ++++++++++++++++++ src/main/resources/META-INF/mods.toml | 27 + .../assets/vaultpartyui/lang/en_us.json | 27 + src/main/resources/pack.mcmeta | 6 + 23 files changed, 999 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-cli.jar create mode 100644 gradle/wrapper/gradle-wrapper-shared.jar create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 local-maven/dev/copilot/vault/the_vault/1.18.2-3.21.5-remastered.6574/the_vault-1.18.2-3.21.5-remastered.6574.pom create mode 100644 settings.gradle create mode 100644 src/main/java/dev/massuus/vaultpartyui/VaultPartyUiMod.java create mode 100644 src/main/java/dev/massuus/vaultpartyui/client/ClientKeyMappings.java create mode 100644 src/main/java/dev/massuus/vaultpartyui/client/ClientSetupEvents.java create mode 100644 src/main/java/dev/massuus/vaultpartyui/client/ClientTickEvents.java create mode 100644 src/main/java/dev/massuus/vaultpartyui/client/screen/PartyScreen.java create mode 100644 src/main/resources/META-INF/mods.toml create mode 100644 src/main/resources/assets/vaultpartyui/lang/en_us.json create mode 100644 src/main/resources/pack.mcmeta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d706099 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Gradle +.gradle/ +build/ +out/ + +# Java +*.class +/scripts/ +/local-maven/ +hs_err_pid* +replay_pid* + +# IDE/editor +.idea/ +*.iml +*.ipr +*.iws + +# VS Code local state +.vscode/*.log + +# Forge/Minecraft run dirs +run/ +logs/ +crash-reports/ + +# OS files +.DS_Store +Thumbs.db + +# Local helper artifacts +bin/ diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..1e73a60 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Attach to Forge Client", + "request": "attach", + "hostName": "localhost", + "port": 5005, + "preLaunchTask": "runClientDebug" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d53ecaf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.compile.nullAnalysis.mode": "automatic", + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..04a593c --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,61 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "runClient", + "type": "shell", + "command": "${workspaceFolder}\\gradlew.bat", + "args": ["runClient"], + "group": "build", + "problemMatcher": [] + }, + { + "label": "runClientDebug", + "type": "shell", + "command": "${workspaceFolder}\\gradlew.bat", + "args": ["runClient", "--debug-jvm"], + "group": "build", + "isBackground": true, + "problemMatcher": { + "owner": "gradle-debug", + "pattern": { + "regexp": "^$" + }, + "background": { + "activeOnStart": true, + "beginsPattern": ".*", + "endsPattern": "Listening for transport dt_socket at address: 5005" + } + } + } + , + { + "label": "build", + "type": "shell", + "command": "${workspaceFolder}\\gradlew.bat", + "args": ["build"], + "group": "build", + "problemMatcher": [] + }, + { + "label": "deployToCurseForge", + "type": "shell", + "command": "${workspaceFolder}\\scripts\\deploy.ps1", + "args": [], + "options": { + "shell": { + "executable": "powershell", + "args": ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File"] + } + }, + "problemMatcher": [] + }, + { + "label": "build-and-deploy", + "type": "shell", + "dependsOn": ["build", "deployToCurseForge"], + "group": "build", + "problemMatcher": [] + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..4daa71e --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# Vault Party UI + +Client-side Forge mod for Vault Hunters (Minecraft 1.18.2) that provides a party management screen. + +## Features + +- Open a party UI with a keybind (default: `I`, rebindable in Controls). +- Create/leave/disband party actions. +- Invite nearby/all actions. +- Invite handling (accept/decline) when not already in a party. +- Party member list panel. +- Online player list with per-player `Invite` / `Remove` actions. + +## Requirements + +- Minecraft `1.18.2` +- Forge `40.x` +- Vault Hunters modpack (client) + +## Development + +Build in workspace root: + +```powershell +.\gradlew.bat build +``` + +Compile only: + +```powershell +.\gradlew.bat compileJava +``` + +## Deploy To CurseForge Instance + +A helper script is included: + +```powershell +powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\deploy.ps1 +``` + +Or use VS Code task: `build-and-deploy`. + +## Notes + +- This mod is client-side UI logic. +- Server still enforces party rules and command permissions. +- For real testing, run it inside the Vault Hunters pack client instance. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..02a7a66 --- /dev/null +++ b/build.gradle @@ -0,0 +1,97 @@ +plugins { + id 'eclipse' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '5.1.+' +} + +group = mod_group_id +version = mod_version + +base { + archivesName = mod_id +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(17) +} + +minecraft { + mappings channel: mapping_channel, version: mapping_version + + runs { + client { + workingDirectory project.file('run') + property 'forge.logging.console.level', 'debug' + mods { + vaultpartyui { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + property 'forge.logging.console.level', 'debug' + mods { + vaultpartyui { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + property 'forge.logging.console.level', 'debug' + args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + mods { + vaultpartyui { + source sourceSets.main + } + } + } + } +} + +def vaultHuntersJar = file(providers.gradleProperty('vault_hunters_jar').orElse('C:/Users/samva/curseforge/minecraft/Instances/Vault Hunters Third Edition - Remastered/mods/the_vault-1.18.2-3.21.5-remastered.6574.jar').get()) +def vaultHuntersGroup = 'dev.copilot.vault' +def vaultHuntersArtifact = 'the_vault' +def vaultHuntersVersion = '1.18.2-3.21.5-remastered.6574' +def vaultHuntersRepo = file("$rootDir/local-maven") + +if (!vaultHuntersJar.exists()) { + throw new GradleException("Vault Hunters jar not found at ${vaultHuntersJar}. Set -Pvault_hunters_jar to the mod jar path.") +} + +repositories { + maven { + url = 'https://maven.minecraftforge.net' + } + maven { + url = uri(vaultHuntersRepo) + } +} + +dependencies { + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + compileOnly fg.deobf("${vaultHuntersGroup}:${vaultHuntersArtifact}:${vaultHuntersVersion}") + runtimeOnly fg.deobf("${vaultHuntersGroup}:${vaultHuntersArtifact}:${vaultHuntersVersion}") +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' + options.release = 17 +} + +jar { + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : 'Copilot', + 'Specification-Version' : '1', + 'Implementation-Title' : project.name, + 'Implementation-Version' : mod_version, + 'Implementation-Vendor' : 'Copilot', + 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..5bad4fa --- /dev/null +++ b/gradle.properties @@ -0,0 +1,12 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false + +minecraft_version=1.18.2 +forge_version=40.2.17 +mapping_channel=official +mapping_version=1.18.2 + +mod_id=vaultpartyui +mod_name=Vault Party UI +mod_version=1.0.0 +mod_group_id=dev.copilot.vaultpartyui diff --git a/gradle/wrapper/gradle-cli.jar b/gradle/wrapper/gradle-cli.jar new file mode 100644 index 0000000000000000000000000000000000000000..79e83887a01dbf92ace4872ff2b220b47143123d GIT binary patch literal 27391 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..0323660265fce7aa463b583567cc8974ddd20308 GIT binary patch literal 59376 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�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 T_QPM@5Z-sAcYmDr{%ZX{D$TZU literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c7d437b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..7bb12bd --- /dev/null +++ b/gradlew @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +APP_HOME=$(cd "$(dirname "$0")" && pwd -P) +CLASSPATH="$APP_HOME/gradle/wrapper/gradle-wrapper.jar" +exec "${JAVA_HOME:-java}" -Xmx64m -Xms64m -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..fce14fe --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,14 @@ +@ECHO OFF +SETLOCAL +SET APP_HOME=%~dp0 +SET APP_BASE_NAME=%~n0 +SET DIRNAME=%~dp0 +IF "%DIRNAME%"=="" SET DIRNAME=. +SET DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" +SET CLASSPATH=%APP_HOME%gradle\wrapper\gradle-wrapper-shared.jar;%APP_HOME%gradle\wrapper\gradle-cli.jar;%APP_HOME%gradle\wrapper\gradle-wrapper.jar +IF DEFINED JAVA_HOME ( + SET JAVA_EXE=%JAVA_HOME%\bin\java.exe +) ELSE ( + SET JAVA_EXE=java.exe +) +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% -Dorg.gradle.appname=%APP_BASE_NAME% -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* diff --git a/local-maven/dev/copilot/vault/the_vault/1.18.2-3.21.5-remastered.6574/the_vault-1.18.2-3.21.5-remastered.6574.pom b/local-maven/dev/copilot/vault/the_vault/1.18.2-3.21.5-remastered.6574/the_vault-1.18.2-3.21.5-remastered.6574.pom new file mode 100644 index 0000000..60219f4 --- /dev/null +++ b/local-maven/dev/copilot/vault/the_vault/1.18.2-3.21.5-remastered.6574/the_vault-1.18.2-3.21.5-remastered.6574.pom @@ -0,0 +1,9 @@ + + 4.0.0 + dev.copilot.vault + the_vault + 1.18.2-3.21.5-remastered.6574 + jar + diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..6f5b05f --- /dev/null +++ b/settings.gradle @@ -0,0 +1,8 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.minecraftforge.net' } + } +} + +rootProject.name = 'vault-party-ui' diff --git a/src/main/java/dev/massuus/vaultpartyui/VaultPartyUiMod.java b/src/main/java/dev/massuus/vaultpartyui/VaultPartyUiMod.java new file mode 100644 index 0000000..c39d1db --- /dev/null +++ b/src/main/java/dev/massuus/vaultpartyui/VaultPartyUiMod.java @@ -0,0 +1,11 @@ +package dev.massuus.vaultpartyui; + +import net.minecraftforge.fml.common.Mod; + +@Mod(VaultPartyUiMod.MODID) +public class VaultPartyUiMod { + public static final String MODID = "vaultpartyui"; + + public VaultPartyUiMod() { + } +} diff --git a/src/main/java/dev/massuus/vaultpartyui/client/ClientKeyMappings.java b/src/main/java/dev/massuus/vaultpartyui/client/ClientKeyMappings.java new file mode 100644 index 0000000..dcb4a2b --- /dev/null +++ b/src/main/java/dev/massuus/vaultpartyui/client/ClientKeyMappings.java @@ -0,0 +1,28 @@ +package dev.massuus.vaultpartyui.client; + +import com.mojang.blaze3d.platform.InputConstants; +import dev.massuus.vaultpartyui.VaultPartyUiMod; +import net.minecraft.client.KeyMapping; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import org.lwjgl.glfw.GLFW; + +public final class ClientKeyMappings { + public static final KeyMapping OPEN_PARTY_UI = new KeyMapping( + "key.vaultpartyui.open_party_ui", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_I, + "key.categories.vaultpartyui" + ); + + private ClientKeyMappings() { + } + + @SubscribeEvent + public static void onClientSetup(FMLClientSetupEvent event) { + ClientRegistry.registerKeyBinding(OPEN_PARTY_UI); + } +} diff --git a/src/main/java/dev/massuus/vaultpartyui/client/ClientSetupEvents.java b/src/main/java/dev/massuus/vaultpartyui/client/ClientSetupEvents.java new file mode 100644 index 0000000..6285a55 --- /dev/null +++ b/src/main/java/dev/massuus/vaultpartyui/client/ClientSetupEvents.java @@ -0,0 +1,18 @@ +package dev.massuus.vaultpartyui.client; + +import dev.massuus.vaultpartyui.VaultPartyUiMod; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; + +@Mod.EventBusSubscriber(modid = VaultPartyUiMod.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +public final class ClientSetupEvents { + private ClientSetupEvents() { + } + + @SubscribeEvent + public static void onClientSetup(FMLClientSetupEvent event) { + ClientKeyMappings.onClientSetup(event); + } +} diff --git a/src/main/java/dev/massuus/vaultpartyui/client/ClientTickEvents.java b/src/main/java/dev/massuus/vaultpartyui/client/ClientTickEvents.java new file mode 100644 index 0000000..86c7245 --- /dev/null +++ b/src/main/java/dev/massuus/vaultpartyui/client/ClientTickEvents.java @@ -0,0 +1,30 @@ +package dev.massuus.vaultpartyui.client; + +import dev.massuus.vaultpartyui.VaultPartyUiMod; +import dev.massuus.vaultpartyui.client.screen.PartyScreen; +import net.minecraft.client.Minecraft; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = VaultPartyUiMod.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) +public final class ClientTickEvents { + private ClientTickEvents() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) { + return; + } + + Minecraft minecraft = Minecraft.getInstance(); + while (ClientKeyMappings.OPEN_PARTY_UI.consumeClick()) { + if (minecraft.player != null) { + minecraft.setScreen(new PartyScreen(minecraft.screen)); + } + } + } +} diff --git a/src/main/java/dev/massuus/vaultpartyui/client/screen/PartyScreen.java b/src/main/java/dev/massuus/vaultpartyui/client/screen/PartyScreen.java new file mode 100644 index 0000000..8ba4df9 --- /dev/null +++ b/src/main/java/dev/massuus/vaultpartyui/client/screen/PartyScreen.java @@ -0,0 +1,544 @@ +package dev.massuus.vaultpartyui.client.screen; + +import com.mojang.authlib.GameProfile; +import com.mojang.blaze3d.vertex.PoseStack; +import iskallia.vault.client.data.ClientPartyData; +import iskallia.vault.client.data.ClientPartyInviteState; +import iskallia.vault.network.message.ServerboundPartyInviteResponseMessage; +import iskallia.vault.world.data.VaultPartyData.Party; +import iskallia.vault.client.data.ClientPartyData.PartyMember; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.util.Mth; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; +import java.util.UUID; + +public class PartyScreen extends Screen { + private static final int BUTTON_WIDTH = 90; + private static final int BUTTON_HEIGHT = 20; + private static final int BUTTON_GAP = 4; + private static final int PANEL_TOP = 100; + private static final int PANEL_HEIGHT = 155; + private static final int PANEL_PADDING = 10; + private static final int ONLINE_ROW_HEIGHT = 14; + private static final int VISIBLE_ONLINE_ROWS = 8; + + private final Screen parentScreen; + + private Party currentParty; + private List onlinePlayers = Collections.emptyList(); + private EditBox targetBox; + private Button createPartyButton; + private Button leavePartyButton; + private Button disbandPartyButton; + private Button inviteNearbyButton; + private Button inviteAllButton; + private Button acceptInviteButton; + private Button declineInviteButton; + private int onlineScrollOffset; + + public PartyScreen(Screen parentScreen) { + super(new TranslatableComponent("screen.vaultpartyui.title")); + this.parentScreen = parentScreen; + } + + @Override + protected void init() { + super.init(); + rebuildState(); + + int centerX = this.width / 2; + int rowWidth = BUTTON_WIDTH * 3 + BUTTON_GAP * 2; + int rowX = centerX - rowWidth / 2; + + this.createPartyButton = addRenderableWidget(new Button(rowX, 24, BUTTON_WIDTH, BUTTON_HEIGHT, new TranslatableComponent("screen.vaultpartyui.create"), button -> sendPartyCommand("party create"))); + this.leavePartyButton = addRenderableWidget(new Button(rowX + BUTTON_WIDTH + BUTTON_GAP, 24, BUTTON_WIDTH, BUTTON_HEIGHT, new TranslatableComponent("screen.vaultpartyui.leave"), button -> sendPartyCommand("party leave"))); + this.disbandPartyButton = addRenderableWidget(new Button(rowX + (BUTTON_WIDTH + BUTTON_GAP) * 2, 24, BUTTON_WIDTH, BUTTON_HEIGHT, new TranslatableComponent("screen.vaultpartyui.disband"), button -> sendPartyCommand("party disband"))); + + this.inviteNearbyButton = addRenderableWidget(new Button(centerX - BUTTON_WIDTH - (BUTTON_GAP / 2), 48, BUTTON_WIDTH, BUTTON_HEIGHT, new TranslatableComponent("screen.vaultpartyui.invite_nearby"), button -> sendPartyCommand("party invite nearby"))); + this.inviteAllButton = addRenderableWidget(new Button(centerX + (BUTTON_GAP / 2), 48, BUTTON_WIDTH, BUTTON_HEIGHT, new TranslatableComponent("screen.vaultpartyui.invite_all"), button -> sendPartyCommand("party invite all"))); + + int inviteButtonWidth = 140; + int inviteButtonX = centerX - inviteButtonWidth - 4; + int declineButtonX = centerX + 4; + this.acceptInviteButton = addRenderableWidget(new Button(inviteButtonX, 72, inviteButtonWidth, BUTTON_HEIGHT, new TranslatableComponent("screen.vaultpartyui.accept_invite"), button -> acceptPendingInvite())); + this.declineInviteButton = addRenderableWidget(new Button(declineButtonX, 72, inviteButtonWidth, BUTTON_HEIGHT, new TranslatableComponent("screen.vaultpartyui.decline_invite"), button -> declinePendingInvite())); + + int panelWidth = (this.width - 40 - PANEL_PADDING) / 2; + int targetBoxWidth = panelWidth - PANEL_PADDING * 2; + int rightPanelX = 20 + panelWidth + PANEL_PADDING; + this.targetBox = new EditBox(this.font, rightPanelX + PANEL_PADDING, PANEL_TOP + 18, targetBoxWidth, 20, new TranslatableComponent("screen.vaultpartyui.target")); + this.targetBox.setMaxLength(64); + addRenderableWidget(this.targetBox); + + updateActionVisibility(); + } + + @Override + public void tick() { + super.tick(); + rebuildState(); + if (this.targetBox != null) { + this.targetBox.tick(); + } + updateActionVisibility(); + } + + @Override + public void render(PoseStack poseStack, int mouseX, int mouseY, float partialTick) { + this.renderBackground(poseStack); + + int leftPanelX = 20; + int panelWidth = (this.width - 40 - PANEL_PADDING) / 2; + int rightPanelX = leftPanelX + panelWidth + PANEL_PADDING; + int panelBottom = PANEL_TOP + PANEL_HEIGHT; + + drawPanel(poseStack, leftPanelX, PANEL_TOP, panelWidth, PANEL_HEIGHT); + drawPanel(poseStack, rightPanelX, PANEL_TOP, panelWidth, PANEL_HEIGHT); + + this.drawCenteredString(poseStack, this.font, this.title, this.width / 2, 8, 0xFFFFFF); + this.drawCenteredString(poseStack, this.font, new TranslatableComponent("screen.vaultpartyui.party"), leftPanelX + panelWidth / 2, PANEL_TOP + 6, 0xE3C38C); + this.drawCenteredString(poseStack, this.font, new TranslatableComponent("screen.vaultpartyui.players"), rightPanelX + panelWidth / 2, PANEL_TOP + 6, 0xE3C38C); + + if (ClientPartyInviteState.hasPendingInvite()) { + String inviterName = ClientPartyInviteState.getInviterName(); + String inviteText = new TranslatableComponent("screen.vaultpartyui.pending_invite", inviterName == null ? "?" : inviterName).getString(); + int noticeWidth = this.font.width(inviteText) + 14; + int noticeX = this.width / 2 - noticeWidth / 2; + fill(poseStack, noticeX, panelBottom + 8, noticeX + noticeWidth, panelBottom + 26, 0xCC1D1D1D); + fill(poseStack, noticeX, panelBottom + 8, noticeX + noticeWidth, panelBottom + 9, 0xFFE3C38C); + this.font.draw(poseStack, inviteText, noticeX + 7, panelBottom + 13, 0xFFFFFF); + } + + renderPartyPanel(poseStack, leftPanelX, panelWidth, mouseX, mouseY); + renderOnlinePanel(poseStack, rightPanelX, panelWidth, mouseX, mouseY); + + super.render(poseStack, mouseX, mouseY, partialTick); + + if (this.targetBox != null) { + this.font.draw(poseStack, new TranslatableComponent("screen.vaultpartyui.target").getString(), this.targetBox.x, this.targetBox.y - 10, 0xA0A0A0); + } + + // Credit + String credit = "Made by Massuus"; + int creditX = this.width - this.font.width(credit) - 8; + int creditY = this.height - 18; + this.font.draw(poseStack, credit, creditX, creditY, 0xAAAAAA); + + + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + // Check credit link click (bottom-right) + String credit = "Made by Massuus"; + int creditX = this.width - this.font.width(credit) - 8; + int creditY = this.height - 18; + int creditW = this.font.width(credit); + int creditH = 10; + if (mouseX >= creditX && mouseX <= creditX + creditW && mouseY >= creditY && mouseY <= creditY + creditH) { + try { + openUrl("https://github.com/massuus/vault-hunters-party-ui"); + } catch (Exception ignored) { + } + return true; + } + if (this.targetBox != null && this.targetBox.mouseClicked(mouseX, mouseY, button)) { + this.setFocused(this.targetBox); + return true; + } + + if (super.mouseClicked(mouseX, mouseY, button)) { + return true; + } + + if (handleOnlinePlayerClick(mouseX, mouseY)) { + return true; + } + + return false; + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollDelta) { + if (!isInsideOnlinePanel(mouseX, mouseY)) { + return super.mouseScrolled(mouseX, mouseY, scrollDelta); + } + + List visiblePlayers = filteredOnlinePlayers(); + int maxOffset = Math.max(0, visiblePlayers.size() - VISIBLE_ONLINE_ROWS); + if (maxOffset == 0) { + return true; + } + + int direction = scrollDelta > 0 ? -1 : 1; + this.onlineScrollOffset = Mth.clamp(this.onlineScrollOffset + direction, 0, maxOffset); + return true; + } + + @Override + public void onClose() { + this.minecraft.setScreen(this.parentScreen); + } + + private void rebuildState() { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.player == null) { + this.currentParty = null; + this.onlinePlayers = Collections.emptyList(); + this.onlineScrollOffset = 0; + return; + } + + this.currentParty = ClientPartyData.getParty(minecraft.player.getUUID()); + this.onlinePlayers = gatherOnlinePlayers(minecraft.getConnection()); + + List visiblePlayers = filteredOnlinePlayers(); + int maxOffset = Math.max(0, visiblePlayers.size() - VISIBLE_ONLINE_ROWS); + this.onlineScrollOffset = Mth.clamp(this.onlineScrollOffset, 0, maxOffset); + } + + private List gatherOnlinePlayers(ClientPacketListener connection) { + if (connection == null) { + return Collections.emptyList(); + } + + List players = new ArrayList<>(); + for (PlayerInfo playerInfo : connection.getOnlinePlayers()) { + GameProfile profile = playerInfo.getProfile(); + if (profile != null && profile.getId() != null && profile.getName() != null) { + players.add(new OnlinePlayer(profile.getId(), profile.getName())); + } + } + + players.sort(Comparator.comparing(player -> player.name.toLowerCase(Locale.ROOT))); + return players; + } + + private List filteredOnlinePlayers() { + if (this.onlinePlayers.isEmpty()) { + return Collections.emptyList(); + } + + String filter = this.targetBox == null ? "" : this.targetBox.getValue().trim().toLowerCase(Locale.ROOT); + if (filter.isEmpty()) { + return this.onlinePlayers; + } + + List filtered = new ArrayList<>(); + for (OnlinePlayer player : this.onlinePlayers) { + if (player.name.toLowerCase(Locale.ROOT).contains(filter)) { + filtered.add(player); + } + } + return filtered; + } + + private void sendPartyCommand(String command) { + Minecraft minecraft = Minecraft.getInstance(); + ClientPacketListener connection = minecraft.getConnection(); + if (connection != null) { + if (minecraft.player != null) { + minecraft.player.chat("/" + command); + } + } + } + + private void acceptPendingInvite() { + if (!ClientPartyInviteState.hasPendingInvite()) { + return; + } + + UUID inviteId = ClientPartyInviteState.getInviteId(); + if (inviteId != null) { + ServerboundPartyInviteResponseMessage.send(inviteId, true); + ClientPartyInviteState.clearInvite(); + } + } + + private void declinePendingInvite() { + if (!ClientPartyInviteState.hasPendingInvite()) { + return; + } + + UUID inviteId = ClientPartyInviteState.getInviteId(); + if (inviteId != null) { + ServerboundPartyInviteResponseMessage.send(inviteId, false); + ClientPartyInviteState.clearInvite(); + } + } + + private void updateInviteButtons() { + boolean hasInvite = ClientPartyInviteState.hasPendingInvite() && this.currentParty == null; + if (this.acceptInviteButton != null) { + this.acceptInviteButton.visible = hasInvite; + } + if (this.declineInviteButton != null) { + this.declineInviteButton.visible = hasInvite; + } + } + + private void updateActionVisibility() { + boolean inParty = this.currentParty != null; + int centerX = this.width / 2; + + if (this.createPartyButton != null) { + this.createPartyButton.visible = !inParty; + this.createPartyButton.x = centerX - (BUTTON_WIDTH / 2); + } + if (this.leavePartyButton != null) { + this.leavePartyButton.visible = inParty; + } + if (this.disbandPartyButton != null) { + this.disbandPartyButton.visible = inParty; + } + + // Keep the first action row centered for the currently visible controls. + if (inParty && this.leavePartyButton != null && this.disbandPartyButton != null) { + int rowWidth = BUTTON_WIDTH * 2 + BUTTON_GAP; + int rowX = centerX - rowWidth / 2; + this.leavePartyButton.x = rowX; + this.disbandPartyButton.x = rowX + BUTTON_WIDTH + BUTTON_GAP; + } + + if (this.inviteNearbyButton != null) { + this.inviteNearbyButton.visible = inParty; + } + if (this.inviteAllButton != null) { + this.inviteAllButton.visible = inParty; + } + + // Keep the second action row centered as a pair. + if (this.inviteNearbyButton != null && this.inviteAllButton != null) { + int rowWidth = BUTTON_WIDTH * 2 + BUTTON_GAP; + int rowX = centerX - rowWidth / 2; + this.inviteNearbyButton.x = rowX; + this.inviteAllButton.x = rowX + BUTTON_WIDTH + BUTTON_GAP; + } + + updateInviteButtons(); + } + + private void renderPartyPanel(PoseStack poseStack, int panelX, int panelWidth, int mouseX, int mouseY) { + int textX = panelX + 10; + int textY = PANEL_TOP + 24; + + if (this.currentParty == null) { + this.font.draw(poseStack, new TranslatableComponent("screen.vaultpartyui.no_party").getString(), textX, textY, 0xE0E0E0); + return; + } + + UUID leaderId = this.currentParty.getLeader(); + List members = this.currentParty.getMembers(); + this.font.draw(poseStack, new TranslatableComponent("screen.vaultpartyui.members").getString() + ": " + members.size(), textX, textY, 0xE0E0E0); + textY += 16; + + for (UUID memberId : members) { + String memberName = resolvePlayerName(memberId); + PartyMember cachedMember = ClientPartyData.getCachedMember(memberId); + StringBuilder line = new StringBuilder(memberName); + if (memberId.equals(leaderId)) { + line.append(" [").append(new TranslatableComponent("screen.vaultpartyui.leader").getString()).append("]"); + } + if (memberId.equals(getLocalPlayerId())) { + line.append(" [").append(new TranslatableComponent("screen.vaultpartyui.self").getString()).append("]"); + } + + int color = 0xFFFFFF; + if (cachedMember != null) { + if (cachedMember.status != PartyMember.Status.NORMAL) { + line.append(" - ").append(cachedMember.status.name()); + } + line.append(" - ").append(formatHealth(cachedMember.healthPts)).append(" HP"); + color = statusColor(cachedMember.status); + } + + this.font.draw(poseStack, line.toString(), textX, textY, color); + textY += 14; + } + } + + private void renderOnlinePanel(PoseStack poseStack, int panelX, int panelWidth, int mouseX, int mouseY) { + int textX = panelX + 10; + int boxWidth = panelWidth - 20; + int listTop = PANEL_TOP + 48; + int listHeight = VISIBLE_ONLINE_ROWS * ONLINE_ROW_HEIGHT + 6; + + fill(poseStack, panelX + 8, PANEL_TOP + 20, panelX + panelWidth - 8, PANEL_TOP + 42, 0xAA1A1A1A); + this.font.draw(poseStack, new TranslatableComponent("screen.vaultpartyui.target").getString(), textX, PANEL_TOP + 24, 0xA0A0A0); + + List visiblePlayers = filteredOnlinePlayers(); + int maxOffset = Math.max(0, visiblePlayers.size() - VISIBLE_ONLINE_ROWS); + this.onlineScrollOffset = Mth.clamp(this.onlineScrollOffset, 0, maxOffset); + + int startIndex = this.onlineScrollOffset; + int endIndex = Math.min(visiblePlayers.size(), startIndex + VISIBLE_ONLINE_ROWS); + + fill(poseStack, panelX + 8, listTop, panelX + panelWidth - 8, listTop + listHeight, 0x66111111); + fill(poseStack, panelX + 8, listTop, panelX + panelWidth - 8, listTop + 1, 0xFFE3C38C); + + if (visiblePlayers.isEmpty()) { + this.font.draw(poseStack, "No matching players.", textX, listTop + 6, 0xA0A0A0); + return; + } + + int rowY = listTop + 4; + for (int index = startIndex; index < endIndex; index++) { + OnlinePlayer player = visiblePlayers.get(index); + boolean hovered = mouseX >= panelX + 10 && mouseX <= panelX + panelWidth - 10 && mouseY >= rowY - 2 && mouseY < rowY + ONLINE_ROW_HEIGHT - 2; + int background = hovered ? 0x663C3122 : 0x00000000; + + // draw player name and per-row action (invite/remove) + this.fill(poseStack, panelX + 10, rowY - 2, panelX + panelWidth - 10, rowY + ONLINE_ROW_HEIGHT - 2, background); + this.font.draw(poseStack, player.name, panelX + 12, rowY, 0xFFFFFF); + + // skip drawing actions for self + if (!player.id.equals(getLocalPlayerId())) { + int actionX = panelX + panelWidth - 84; + if (this.currentParty == null) { + // Invite button + this.font.draw(poseStack, new TranslatableComponent("screen.vaultpartyui.invite").getString(), actionX, rowY, 0xA0E0A0); + } else if (isPartyLeader()) { + // Remove button + this.font.draw(poseStack, new TranslatableComponent("screen.vaultpartyui.remove").getString(), actionX, rowY, 0xE0A0A0); + } + } + + rowY += ONLINE_ROW_HEIGHT; + } + } + + private boolean isInsideOnlinePanel(double mouseX, double mouseY) { + int leftPanelX = 20; + int panelWidth = (this.width - 40 - PANEL_PADDING) / 2; + int rightPanelX = leftPanelX + panelWidth + PANEL_PADDING; + int listTop = PANEL_TOP + 48; + int listHeight = VISIBLE_ONLINE_ROWS * ONLINE_ROW_HEIGHT + 6; + return mouseX >= rightPanelX + 8 && mouseX <= rightPanelX + panelWidth - 8 && mouseY >= listTop && mouseY <= listTop + listHeight; + } + + private boolean handleOnlinePlayerClick(double mouseX, double mouseY) { + if (!isInsideOnlinePanel(mouseX, mouseY)) { + return false; + } + + int panelX = 20 + (this.width - 40 - PANEL_PADDING) / 2 + PANEL_PADDING; + int listTop = PANEL_TOP + 48; + int relativeY = (int)mouseY - listTop - 4; + int index = this.onlineScrollOffset + (relativeY / ONLINE_ROW_HEIGHT); + List visiblePlayers = filteredOnlinePlayers(); + if (index < 0 || index >= visiblePlayers.size()) { + return false; + } + + OnlinePlayer player = visiblePlayers.get(index); + if (player.id.equals(getLocalPlayerId())) { + return false; + } + + int actionX = panelX + ((this.width - 40 - PANEL_PADDING) / 2) - 84; + int actionY = listTop + (index - this.onlineScrollOffset) * ONLINE_ROW_HEIGHT + 4; + if (mouseX >= actionX && mouseX <= actionX + 70 && mouseY >= actionY && mouseY <= actionY + ONLINE_ROW_HEIGHT - 2) { + if (this.currentParty == null) { + sendPartyCommand("party invite " + player.name); + } else if (isPartyLeader()) { + sendPartyCommand("party remove " + player.name); + } + return true; + } + + return false; + } + + private boolean isPartyLeader() { + if (this.currentParty == null) return false; + UUID leader = this.currentParty.getLeader(); + return leader != null && leader.equals(getLocalPlayerId()); + } + + private UUID getLocalPlayerId() { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.player == null) return null; + return minecraft.player.getUUID(); + } + + private String resolvePlayerName(UUID playerId) { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft == null || playerId == null) return "?"; + ClientPacketListener connection = minecraft.getConnection(); + if (connection == null) return "?"; + for (PlayerInfo info : connection.getOnlinePlayers()) { + GameProfile profile = info.getProfile(); + if (profile != null && playerId.equals(profile.getId())) { + return profile.getName(); + } + } + return "?"; + } + + private String formatHealth(float hp) { + return String.format(Locale.ROOT, "%.1f", hp); + } + + private int statusColor(PartyMember.Status status) { + if (status == null) return 0xFFFFFF; + switch (status) { + case DEAD: + return 0xFF5555; + case DOWNED: + return 0xFFAA00; + default: + return 0xFFFFFF; + } + } + + private void drawPanel(PoseStack poseStack, int x, int y, int width, int height) { + fill(poseStack, x, y, x + width, y + height, 0xAA111111); + fill(poseStack, x, y, x + width, y + 1, 0xFFE3C38C); + } + + private void openUrl(String url) { + try { + java.awt.Desktop desktop = java.awt.Desktop.isDesktopSupported() ? java.awt.Desktop.getDesktop() : null; + if (desktop != null && desktop.isSupported(java.awt.Desktop.Action.BROWSE)) { + desktop.browse(new java.net.URI(url)); + return; + } + } catch (Exception ignored) { + } + + // Fallbacks + try { + String os = System.getProperty("os.name").toLowerCase(java.util.Locale.ROOT); + if (os.contains("win")) { + Runtime.getRuntime().exec(new String[]{"rundll32", "url.dll,FileProtocolHandler", url}); + } else if (os.contains("mac")) { + Runtime.getRuntime().exec(new String[]{"open", url}); + } else { + Runtime.getRuntime().exec(new String[]{"xdg-open", url}); + } + } catch (Exception ignored) { + } + } + + private static final class OnlinePlayer { + final UUID id; + final String name; + + OnlinePlayer(UUID id, String name) { + this.id = id; + this.name = name; + } + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..6672ccf --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,27 @@ +modLoader="javafml" +loaderVersion="[40,)" +license="All Rights Reserved" + +[[mods]] +modId="vaultpartyui" +version="${file.jarVersion}" +displayName="Vault Party UI" +authors="Massuus" +description=''' +Adds a client-side party management screen for Vault Hunters 1.18.2. +''' +displayTest="IGNORE_ALL_VERSION" + +[[dependencies.vaultpartyui]] +modId="forge" +mandatory=true +versionRange="[40,)" +ordering="NONE" +side="CLIENT" + +[[dependencies.vaultpartyui]] +modId="minecraft" +mandatory=true +versionRange="[1.18.2,1.19)" +ordering="NONE" +side="CLIENT" diff --git a/src/main/resources/assets/vaultpartyui/lang/en_us.json b/src/main/resources/assets/vaultpartyui/lang/en_us.json new file mode 100644 index 0000000..9099a42 --- /dev/null +++ b/src/main/resources/assets/vaultpartyui/lang/en_us.json @@ -0,0 +1,27 @@ +{ + "key.vaultpartyui.open_party_ui": "Open Party UI", + "key.categories.vaultpartyui": "Vault Party UI", + + "screen.vaultpartyui.title": "Party Manager", + "screen.vaultpartyui.party": "Your Party", + "screen.vaultpartyui.players": "Online Players", + "screen.vaultpartyui.target": "Player Name", + "screen.vaultpartyui.search_hint": "Type a name to filter or invite", + "screen.vaultpartyui.create": "Create Party", + "screen.vaultpartyui.leave": "Leave Party", + "screen.vaultpartyui.disband": "Disband Party", + "screen.vaultpartyui.list": "List Party", + "screen.vaultpartyui.invite_selected": "Invite Selected", + "screen.vaultpartyui.invite_nearby": "Invite Nearby", + "screen.vaultpartyui.invite_all": "Invite All", + "screen.vaultpartyui.remove_selected": "Remove Selected", + "screen.vaultpartyui.accept_invite": "Accept Invite", + "screen.vaultpartyui.decline_invite": "Decline Invite", + "screen.vaultpartyui.no_party": "You are not in a party.", + "screen.vaultpartyui.no_target": "Type or select a player name first.", + "screen.vaultpartyui.pending_invite": "Incoming invite from %s", + "screen.vaultpartyui.members": "Members", + "screen.vaultpartyui.online": "Online players", + "screen.vaultpartyui.leader": "Leader", + "screen.vaultpartyui.self": "You" +} diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..e1d4627 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 8, + "description": "Vault Party UI resources" + } +}