Skip to content

Implement and integrate SpawnerMenuFormUI for Bedrock players with configurable language support#16

Merged
ptthanh02 merged 2 commits into
mainfrom
copilot/fix-2bd027ed-8f95-407d-a11f-bec55933ed0b
Sep 15, 2025
Merged

Implement and integrate SpawnerMenuFormUI for Bedrock players with configurable language support#16
ptthanh02 merged 2 commits into
mainfrom
copilot/fix-2bd027ed-8f95-407d-a11f-bec55933ed0b

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Sep 15, 2025

This PR implements and fully integrates the previously unused SpawnerMenuFormUI class to provide native form-based GUI support for Bedrock Edition players using Geyser/Floodgate, while maintaining backward compatibility for Java Edition players.

Problem

The existing SpawnerMenuFormUI class was present but not integrated into the plugin core, leaving Bedrock players without proper GUI support. Additionally, the implementation used hardcoded button texts and inconsistent styling compared to the main spawner GUI.

Solution

Core Integration

  • SmartSpawner.java: Added SpawnerMenuFormUI as a core component with proper initialization and getter method
  • SpawnerClickManager.java: Enhanced openSpawnerMenu() to automatically detect player type and route accordingly:
    • Bedrock players → Native form interface via SpawnerMenuFormUI
    • Java players → Existing chest-based GUI (unchanged)

Language Configuration System

Added comprehensive language support across all existing language files:

# New bedrock_gui section in gui.yml
bedrock_gui:
  buttons:
    storage: '&#fce96aOpen Storage'
    stack_info: '&#ab7afdOpen Stack Menu'
    experience: '&#37eb9aCollect Experience'
  status:
    storage:
      empty: '&#aEmpty'
      nearly_full: '&#cNearly Full'
    # ... additional status options

Includes translations for:

  • en_US: English interface
  • vi_VN: Vietnamese translations
  • DonutSMP: Custom server styling

GUI Style Redesign

Completely redesigned createInfoContent() method to match the main spawner GUI styling:

// Before: Inconsistent styling with hardcoded colors
content.append("§l§b»»» Spawner Information «««§r\n\n");

// After: Consistent with main GUI patterns
content.append("&#7b68ee◈ &#8a2be2ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ:\n");
content.append("  &#e6e6fa•  ꜱᴛᴀᴄᴋ: &#c2a8fc").append(spawner.getStackSize()).append("\n");

Bedrock/Geyser Documentation

Added comprehensive comment sections in all language files explaining Bedrock GUI configuration and limitations.

Key Features

  • Cross-platform compatibility: Seamless experience for both Java and Bedrock players
  • Configurable interface: All button texts and status messages sourced from language files
  • Consistent styling: Uses identical color schemes and formatting as the main GUI
  • Backward compatibility: Zero changes to existing Java player experience
  • Multi-language support: Full translation support for all configured languages
  • Java 21 ready: Uses modern Java syntax and best practices

Testing

  • Verified integration points in SmartSpawner and SpawnerClickManager
  • Confirmed language configuration usage throughout SpawnerMenuFormUI
  • Validated consistent styling patterns match existing GUI components
  • Ensured all language files contain proper Bedrock GUI configuration

Expected Behavior

  • Java Edition players: Continue using the familiar chest-based inventory GUI
  • Bedrock Edition players: Experience native form interface with touch-friendly buttons
  • Both platforms: Access identical spawner management functionality with consistent visual styling

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • jitpack.io
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/gradle-launcher-8.8.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/agents/gradle-instrumentation-agent-8.8.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.8 (dns block)
  • maven.enginehub.org
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/gradle-launcher-8.8.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/agents/gradle-instrumentation-agent-8.8.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.8 (dns block)
  • mvn.lumine.io
  • nexus.iridiumdevelopment.net
  • repo.bg-software.com
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/gradle-launcher-8.8.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/agents/gradle-instrumentation-agent-8.8.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.8 (dns block)
  • repo.codemc.io
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/gradle-launcher-8.8.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/agents/gradle-instrumentation-agent-8.8.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.8 (dns block)
  • repo.glaremasters.me
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/gradle-launcher-8.8.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/agents/gradle-instrumentation-agent-8.8.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.8 (dns block)
  • repo.nightexpressdev.com
  • repo.opencollab.dev
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/gradle-launcher-8.8.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/agents/gradle-instrumentation-agent-8.8.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.8 (dns block)
  • repo.papermc.io
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/gradle-launcher-8.8.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.8-bin/dl7vupf4psengwqhwktix4v1/gradle-8.8/lib/agents/gradle-instrumentation-agent-8.8.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.8 (dns block)
  • repository.minecodes.pl

If you need me to access, download, or install something from one of these locations, you can either:


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

…ration for Bedrock GUI

Co-authored-by: ptthanh02 <73684260+ptthanh02@users.noreply.github.com>
Copilot AI changed the title [WIP] Help me implement and improve unused SpawnerMenuFormUI for bedrock player, allow modify information in the GUI button through language folder gui.yml make sure to comment a section note for bedrock geyser gui and as well as redesign createInfoContent t... Implement and integrate SpawnerMenuFormUI for Bedrock players with configurable language support Sep 15, 2025
Copilot AI requested a review from ptthanh02 September 15, 2025 16:20
@ptthanh02 ptthanh02 marked this pull request as ready for review September 15, 2025 16:22
@ptthanh02 ptthanh02 merged commit 59bc6c2 into main Sep 15, 2025
2 checks passed
@ptthanh02 ptthanh02 deleted the copilot/fix-2bd027ed-8f95-407d-a11f-bec55933ed0b branch September 15, 2025 16:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants