Skip to content

Release 0.12.0 — Admin GUI, i18n, Data Importers, API Expansion - #109

Merged
derrickmehaffy merged 14 commits into
mainfrom
releases/0.12.0
Mar 19, 2026
Merged

Release 0.12.0 — Admin GUI, i18n, Data Importers, API Expansion#109
derrickmehaffy merged 14 commits into
mainfrom
releases/0.12.0

Conversation

@derrickmehaffy

@derrickmehaffy derrickmehaffy commented Mar 18, 2026

Copy link
Copy Markdown
Contributor

Description

HyperFactions 0.12.0 — major release adding Admin GUI (config editor, backup manager, updates page), built-in localization (10 languages), two new data importers (SimpleClaims, FactionsX), comprehensive API expansion (31 events, zone/power queries, config persistence, world settings), configurable announcement colors, per-world max claims, BetterMap compatibility, and a full documentation audit correcting all 20 doc files against source code.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement
  • Test coverage

Related Issues

Fixes #40, #41, #42, #90, #92, #95, #98, #99, #102, #106, #107, #108

Testing

Admin GUI: Config Editor (#40)

  • Open config editor with /f admin → Config tab
  • Verify all 11 tabs render without errors: Server, Chat, Announcements, Economy, Factions, Faction Perms, Worldmap, Worlds, Backup, Debug, Gravestones
  • Toggle a boolean setting, save, verify it persists after /f admin reload
  • Change an integer/double stepper value, save, verify bounds validation blocks invalid input
  • Edit a text field, verify debounced update and save
  • Use a color picker (e.g., announcement colors), verify hex value saves correctly
  • Test faction permissions editor: disable a parent flag, verify children auto-disable
  • Test world overrides: add a world, toggle per-world settings, remove a world
  • Test upkeep scaling tiers modal: add/remove/reorder tiers
  • Close config editor and reopen — verify edit session caching preserves pending changes
  • Save with a validation error active — verify save is blocked with error highlight
  • Resize window between narrow/standard/wide — verify layout adapts

Admin GUI: Backup Manager (#41)

  • Open backup manager page, verify backup list loads
  • Create a manual backup with a custom name, verify it appears in the list
  • Expand a backup entry, verify detail view shows type/date/size
  • Restore a backup — verify two-click confirmation and automatic safety backup
  • Delete a backup — verify two-click confirmation
  • Use the backup type filter dropdown, verify filtering works

Admin GUI: Updates Page (#42)

  • Open updates page, verify HyperFactions and HyperProtect columns render
  • Click "Check for Updates", verify both columns update
  • Verify current version, latest version, channel, and build date display correctly

Localization / i18n (#92, #100)

  • Set server language to a non-English locale (e.g., de-DE), verify all commands output translated text
  • Verify player language detection works (player with different client language sees their locale)
  • Run /f help, verify help content renders in player's language
  • Create a faction, verify all confirmation messages are localized
  • Open faction GUI, verify all labels/buttons are localized
  • Open admin GUI, verify admin labels are localized

Data Importers (#98, #99)

  • /f admin import simpleclaims with valid SimpleClaims data — verify claims import correctly
  • /f admin import simpleclaims with invalid/missing path — verify error message
  • /f admin import factionsx with valid FactionsX data — verify factions, claims, and players import
  • /f admin import factionsx with invalid/missing path — verify error message
  • Verify pre-import backup is created (type: MANUAL)
  • Verify imported data is consistent (claim owners match faction IDs, etc.)

World Map & BetterMap (#102)

  • Disable WorldMap for a world via world config, verify map stops rendering for that world
  • Re-enable and verify map resumes
  • With BetterMap installed: verify claims render correctly on BetterMap-managed worlds

Bug Fixes (#90, #95)

  • Claim chunks in ocean/water areas, open world map — verify claims are visible (not hidden under water color)
  • Build a faction base near water, verify water/lava flows normally within own claims when fireSpreadAllowed is disabled

API Expansion (#106)

  • Verify events fire correctly: create a faction (FactionCreateEvent), disband (FactionDisbandEvent), claim (FactionClaimEvent)
  • Verify pre-events are cancellable: register a listener for a pre-event, cancel it, verify the action is blocked
  • Test ConfigManager.saveConfig() and ConfigManager.reloadConfig() from another plugin

Essentials Integration (#107)

  • With HyperEssentials installed: verify hasFactionHome(), getFactionHomeWorld() return correct values
  • Test ESSENTIALS_BACK zone flag: disable in a zone, verify /back is blocked in that zone
  • Verify FactionHomeTeleportEvent fires when a player teleports to faction home

Per-World Max Claims (#108)

  • Set maxClaims for a world via /f admin world set <world> maxclaims 5
  • Claim up to the limit, verify 6th claim is rejected with WORLD_MAX_CLAIMS_REACHED message
  • Verify overclaim also respects the per-world limit
  • Clear limit with /f admin world set <world> maxclaims default, verify global limit applies again
  • Verify GUI map claim button shows appropriate error when world limit reached

Configurable Announcement Colors

  • Change an announcement color via admin GUI config editor (Announcements tab)
  • Trigger the corresponding event (e.g., create a faction) — verify broadcast uses the new color
  • Verify all 7 event colors are independently configurable: factionCreated, factionDisbanded, leadershipTransfer, overclaim, warDeclared, allianceFormed, allianceBroken
  • Reset colors to defaults, verify they match previous hardcoded values (#55FF55, #FF5555, #FFAA00)

Zone & Power Query API

  • From another plugin: call getZone(world, chunkX, chunkZ) for a chunk inside a zone — verify correct zone returned
  • Call getZoneByName("SafeZone") — verify returns the zone or null
  • Call getAllZones() — verify returns unmodifiable collection of all zones
  • Call getZonesByType("SAFE") — verify only SafeZones returned
  • Call isHardcoreMode() — verify matches config setting
  • Enable hardcore mode, call getFactionHardcorePower(factionId) — verify returns power pool value

World Settings API (#108)

  • From another plugin: call registerWorldSettings() — verify settings persist after restart
  • Call getWorldSettings() with wildcard pattern — verify resolution works
  • Call removeWorldSettings() — verify settings are removed and persisted

Regression: Core Gameplay

  • Create, rename, and disband a faction — no errors
  • Invite a player, accept invite, verify membership
  • Claim/unclaim territory, verify map updates
  • Set faction home, teleport to it
  • Open faction GUI (/f gui), navigate all pages without errors
  • Faction chat (/f chat), ally chat, normal chat all work
  • Relations: ally, enemy, neutral — verify protection behavior matches
  • PvP in enemy territory works, PvP in own territory blocked (default config)
  • Power loss on death, power regen over time
  • Combat tagging works and blocks teleports/commands

Checklist

  • My code follows the project's coding style
  • I have performed a self-review of my own code
  • I have commented my code where necessary
  • I have updated the documentation (if applicable)
  • My changes generate no new warnings or errors
  • I have added tests that prove my fix/feature works
  • New and existing tests pass locally with my changes

* feat: add i18n infrastructure (Phase 0)

Add the foundational i18n system following Ecotale's proven pattern
with Hytale's native I18nModule:

- HFMessages: translation resolution engine with player/server language
  support and {0}/{1} placeholder formatting
- MessageKeys: static key constants organized by nested inner classes
  covering common, commands, protection, territory, GUI nav, and more
- MessageUtil: i18n-aware overloads (PlayerRef + key) alongside existing
  string-literal methods for gradual migration
- ServerConfig: defaultLanguage and usePlayerLanguage settings with
  JSON load/write support
- ConfigManager: convenience accessors for language settings
- PlayerData: languagePreference and notification preference fields
  (territoryAlerts, deathAnnouncements, powerNotifications)
- en-US/hyperfactions.lang: initial common.* translation keys (~25 keys)

* feat: migrate faction management and claim commands to i18n keys (Phase 1a)

Migrate hardcoded English strings to MessageKeys constants for:
- FactionSubCommand.requireFaction()
- Create, Disband, Rename, Desc, Open, Close, Color commands
- Claim command (territory)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate member commands to i18n keys (Phase 1b)

Migrate hardcoded English strings to MessageKeys constants for:
- Invite, Accept/Join, Kick, Leave commands
- Promote, Demote, Transfer commands

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate territory and teleport commands to i18n keys (Phase 1c)

Migrate hardcoded English strings to MessageKeys constants for:
- Unclaim, Overclaim, Stuck commands (territory)
- Home, SetHome, DelHome commands (teleport)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate relation, social, info, and economy commands to i18n keys (Phase 1d)

Migrate hardcoded English strings to MessageKeys constants for:
- Ally, Enemy, Neutral, Relations commands (relation)
- Chat, Invites, Request commands (social)
- Info, Members, List, Help, Who, Map, Power commands (info)
- Money, TreasuryCommandHandler (economy)

Add Invites and Request inner classes to MessageKeys. Expand
Relation, Chat, Info, Power, and Economy classes with new keys.

* feat: migrate UI commands and ProtectionChecker to i18n keys (Phase 1e)

Migrate GuiSubCommand, SettingsSubCommand, FactionCommand to use
MessageKeys constants. Convert ProtectionChecker's 40 hardcoded
strings (action phrases, denial reasons, PvP, entity damage, combat
tag) to HFMessages.get() with server-default language fallback.

* feat: migrate AnnouncementManager, TeleportManager, ChatManager to i18n keys (Phase 1f)

Convert AnnouncementManager to per-player i18n resolution for server
broadcasts. Migrate TeleportManager's 10 hardcoded strings (warmup,
cooldown, cancellation messages) and ChatManager's channel display
names. Add mount entry/teleport blocking messages from
TerritoryTickingSystem. Completes Phase 1 command/system migration.

* feat: add help system markdown-to-lang build pipeline (Phase 2)

Replace hardcoded help content with build-generated .lang files from
markdown sources. Add HelpLangGenerator build-time tool that parses
22 markdown topic files into hyperfactions_help.lang and
help-manifest.json. Refactor HelpRegistry to load structure from
manifest, HelpMessages to delegate to HFMessages/I18nModule, and
HelpCategory to use i18n display name keys. Create initial
hyperfactions_gui.lang with help category names. Add generateHelpLang
Gradle task wired into processResources.

* chore: exclude build package from gitignore pattern

* feat: localize nav system, shared pages, and modal pages (Phase 3a)

Migrate navigation infrastructure to resolve display names via i18n keys
instead of hardcoded English strings. NavBarUtil.buildButtons() now accepts
PlayerRef and resolves keys through HFMessages. All page registry entries
in GuiManager updated to use MessageKeys constants.

Shared pages migrated: MainMenuPage (section titles), FactionInfoPage
(status labels, descriptions), RenameModalPage, DescriptionModalPage,
TagModalPage (all validation/success messages).

New files: hyperfactions_admin.lang (admin nav keys).

* feat: localize FactionDashboardPage and FactionMainPage (Phase 3b)

Migrate ~55 hardcoded English strings to i18n keys across both pages.
Reuse existing command keys (Home, Claim, Common, Leave) where messages
are semantically identical. Add DashboardGui and FactionMainGui key
classes for page-specific labels and messages.

* feat: localize Members, Browser, Leaderboard, and PlayerInfo pages (Phase 3c)

Migrate all hardcoded English strings in FactionMembersPage, FactionBrowserPage,
FactionLeaderboardPage, and PlayerInfoPage to use HFMessages.get() with MessageKeys.
Add GuiCommon, MembersGui, BrowserGui, LeaderboardGui, and PlayerInfoGui key classes.

* feat: localize Relations, Settings, and Modules pages (Phase 3d)

Migrate all hardcoded English strings in FactionRelationsPage,
SetRelationModalPage, FactionSettingsPage, and FactionModulesPage to
use HFMessages.get() with MessageKeys. Add RelationsGui, SettingsGui,
and ModulesGui key classes. Relation type labels use internal English
identifiers for logic with localizeType() resolving display text.

* feat: localize Treasury pages (Phase 3e)

Migrate all 5 treasury page classes to i18n:
- TreasuryPage: dashboard stats, upkeep, transaction type names, actor names
- TreasuryDepositModalPage: deposit/withdraw modal labels and messages
- TreasuryTransferSearchPage: search results, player/faction tags
- TreasuryTransferConfirmPage: fee labels, transfer result messages
- TreasurySettingsPage: leader-only permission errors, limit validation

Add ~70 treasury keys to MessageKeys.TreasuryGui and hyperfactions_gui.lang.

* feat: localize confirmation, logs, chat, invites, and map pages (Phase 3f)

Migrate hardcoded strings to i18n keys across 8 remaining faction GUI pages:
- DisbandConfirmPage, LeaderLeaveConfirmPage, LeaveConfirmPage, TransferConfirmPage
- LogsViewerPage, FactionChatPage, FactionInvitesPage, ChunkMapPage

Adds ConfirmGui, LogsGui, ChatGui, InvitesGui, and MapGui key groups
with ~90 new translation entries in hyperfactions_gui.lang.

* feat: localize create faction and new player pages (Phase 3g)

Migrate 85+ hardcoded strings across 4 new player GUI pages to i18n keys:
- CreateFactionPage: preview labels, validation errors, success messages
- InvitesPage: headers, counts, time formats, join result messages
- NewPlayerBrowsePage: sort dropdown, status badges, action buttons, join/request flows
- NewPlayerMapPage: position info, hint text, legend labels

Add CreateGui and NewPlayerGui inner classes to MessageKeys with 53 new keys.
Add MessageUtil.text() overload for i18n with color parameter.
Reuse existing keys: FactionInfoGui.STATUS_*, SettingsGui.PVP_*, MapGui.POSITION,
MapGui.LEGEND_PROTECTED, Common.ALREADY_IN_FACTION, Common.FACTION_NOT_FOUND.

* feat: localize admin GUI pages (Phase 4)

Migrate all 25 admin page files to use HFMessages.get() and MessageKeys.
Add ~170 admin i18n keys to MessageKeys.AdminGui and hyperfactions_admin.lang
covering dashboard, actions, factions, members, relations, settings,
players, economy, zones, zone map, zone wizard, and version pages.

* feat: add Player Settings GUI with language and notification preferences (Phase 5)

- PlayerSettingsPage with language dropdown and notification toggles
- Language override cache in HFMessages for per-player i18n
- TerritoryNotifier checks player alert preferences before sending
- PlayerDeathSystem checks member preferences before death broadcasts
- /f settings player command opens personal settings
- Page registered in both faction and new player nav bars
- Preferences loaded on connect, cleared on disconnect

* feat: add Spanish translations, locale stubs, and translator workflow (Phase 6)

- Full es-ES translations for commands, GUI, admin, and help content
- Stub .lang files for 7 additional locales (de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN)
- Locale scaffolding scripts (new-translation.sh/bat)
- TRANSLATION_GUIDE.md with format docs and contribution process
- checkTranslations Gradle task to diff keys across locales
- fallback.lang for locale fallback documentation

* fix: redesign Player Settings UI and fix nav bar placement

- Rewrite player_settings.ui to follow established Container/Title/Content
  pattern from browse.ui and faction_settings.ui
- Fix crash from Style (HorizontalAlignment) on Group elements
- Fix DropdownBox crash by using DropdownEntryInfo with LocalizableString
  instead of plain List<String>, and string Value instead of integer index
- Move "Player" nav button to far right of both faction and new player
  nav bars using FlexWeight spacer pattern
- Remove player_settings from nav bar button list (rendered separately)
- Use rebuild() for state changes since page stores preferences as
  instance fields (async load race condition with openPlayerSettings)

* feat: use native locale display names and add es-ES to language selector

- Replace hardcoded LOCALE_DISPLAY_NAMES list with Java's Locale class
  to generate native display names (e.g. "Español (España)")
- Add es-ES as second available locale in the language dropdown
- Fix es-ES nav.player_settings to match en-US ("Jugador" not "Ajustes")

* feat: localize all GUI pages with i18n support

Add cmd.set() calls to override hardcoded English text in all .ui
templates with HFMessages.get() lookups. Covers faction pages, admin
pages, shared/modal pages, new player pages, and help pages.

- Add ~570 new MessageKeys constants across all page domains
- Add ~280 new en-US .lang keys for GUI labels
- Add ~320 new es-ES admin .lang keys
- Add ~280 new es-ES GUI .lang keys
- Add element IDs to ~95 .ui template files for runtime text override
- Add common keys: clear, back, leave, transfer, disband

* feat: localize admin zone wizard, unclaim confirm, and type modal pages

Add i18n support for remaining admin pages: zone creation wizard,
zone type change modal, and unclaim-all confirmation page. Fix
duplicate GUI_CANCEL constant in MessageKeys.

* fix: admin GUI crash, help i18n resolution, and dropdown display names

- Fix crash: #Title.Text selector on admin pages — add #PageTitle ID to
  all 29 admin .ui templates and update 28 Java files to use #PageTitle
- Fix help content showing English for non-English players — thread
  PlayerRef through HelpTopic.title(), HelpEntry.text(), and
  HelpMainPage.buildTopicCards() so help resolves per-player locale
- Fix category title using server default — use displayName(playerRef)
- Fix language dropdown truncation — use compact display names
  (English (US) instead of English (United States)) and widen to 220px

* fix: persist player preferences to JSON storage

The custom serializePlayerData/deserializePlayerData methods in
JsonPlayerStorage did not include the i18n preference fields added
to PlayerData. Settings were saved in memory but lost on restart.

Also includes compact locale display names and help i18n threading
from earlier fixes that were committed separately.

* fix: disable Power Notifications toggle (not yet wired up)

The checkbox is shown but disabled since no power change
notifications are currently sent to players.

* refactor: relocate help markdown to Server/Languages and remove stale config.json

Move help source files from src/main/help/{locale}/ to
src/main/resources/Server/Languages/{locale}/help/ so the build-time
HelpLangGenerator reads from the same directory structure as the
runtime language loader. Update translation scripts and build.gradle
to match the new path. Remove unused config.json (replaced by
per-feature config files in config/).

* feat: restructure admin test commands and extend help markdown syntax

Restructure /f admin testgui and sentrytest under /f admin test <sub>
via new AdminTestHandler, adding /f admin test md for a future
markdown visual test page.

Extend the help system with 9 new markdown entry types: bold, italic,
list (bullet + numbered), separator, callout boxes (with colored
accent bars), inline hex colors ([#RRGGBB]), named color shortcuts
(!warning, !success, !note, !muted), and typed callouts (>[!WARNING],
>[!INFO], >[!NOTE], >[!SUCCESS], >[!TIP]).

HelpEntry gains a color field for dynamic color overrides. The
build-time HelpLangGenerator parses all new syntax and emits color
metadata in help-manifest.json. HelpRegistry and HelpMainPage handle
the new types at runtime, applying colors to text and callout accent
bars. Five new .ui templates support the visual rendering.

TIP entries are unified into CALLOUT (backward-compatible: old TIP
manifests render as green callouts).

* feat: add markdown rendering test page (/f admin test md)

Visual test page that renders every supported help markdown entry
type using the real .ui templates. Shows syntax labels alongside
rendered output for verification: text, heading, command, bold,
italic, bullet/numbered lists, separators, hex colors, named color
shortcuts, and all callout box types. Includes edge cases for text
wrapping and mixed content flow.

* docs: add help markdown style guide and move translation guide to docs/

Add docs/help-markdown.md covering the full help markdown syntax
(bold, italic, lists, separators, colors, callouts) with examples.

Move TRANSLATION_GUIDE.md to docs/translation-guide.md and update it
with the new syntax types and clear guidance on what to translate
vs. what to keep (color codes, callout type tags, named shortcuts
stay in English across all locales).

* feat: add new UI Gallery elements to button test page

Add elements discovered from 2026.02.17 UI Gallery to the element
test page: TabNavigation with HeaderTabsStyle, MultilineTextField,
tooltip demo (TooltipText + DefaultTextTooltipStyle), ContentSeparator
and PanelSeparatorFancy, ProgressBar template, HeaderSearch, Panel
and SimpleContainer variants. Update command reference to /f admin
test gui.

* fix: pin markdown test page title bar to top of container

* fix: remove invalid #Title/#Content slots from Panel and SimpleContainer

These templates are flat containers — content goes directly inside
with no insertion point wrappers. Only @Container/@DecoratedContainer
have #Title/#Content slots.

* fix: enable text wrapping and vertical centering in help templates

Replace fixed Height with auto-sizing (remove Anchor Height, use
Padding for spacing). Add Wrap: true to all Label styles so long
text wraps instead of truncating with ellipsis. Add VerticalAlignment:
Center for proper vertical text positioning.

Applies to all 8 help line templates: text, command, heading, bold,
italic, list, tip, and callout.

* feat: add table support to help markdown system

Tables use standard markdown pipe syntax (| col | col |) with
separator rows for headers. Supports per-cell inline formatting
(**bold**, *italic*, `command`, [#hex] colors) and row-level
color overrides. Includes 4 new .ui templates, parser/registry/
renderer updates, and visual test entries.

* fix: improve table visual styling with GitHub-style grid borders

Redesign table templates with proper grid lines: left border on each
cell for column separators, top/bottom borders on rows, header row
background, 200px cell width with generous padding. Add per-cell
inline formatting support (bold, italic, command, hex colors).

* feat: add admin help infrastructure with category filtering

Add 8 admin help categories (ADMIN_OVERVIEW through ADMIN_REFERENCE)
to HelpCategory enum with isAdmin() filter. Rewrite AdminHelpPage from
placeholder to full sidebar+content rendering. Filter admin categories
from player HelpMainPage. Add admin directory scanning to
HelpLangGenerator build pipeline.

* feat: rewrite player help categories 1-4 (en-US) with enhanced formatting

Comprehensive rewrite of welcome, your_faction, power_land, and
diplomacy help using tables, callouts, bold formatting, and accurate
default config values. 14 topics expanded with detailed mechanics.

* feat: rewrite player help categories 5-7 (en-US), add spawn protection/upkeep/permissions topics

Rewrite combat, economy, and quick_ref help with enhanced formatting.
Add 3 new topics: spawn_protection (combat mechanics), upkeep (territory
maintenance costs), and permissions (key permission nodes reference).

* feat: add comprehensive admin help content (en-US) — 18 topics across 8 categories

Complete admin help documentation covering overview, faction management,
zones, power manipulation, economy, configuration, maintenance (backups,
updates, imports), and admin command reference. All values sourced from
actual config defaults and handler implementations.

* feat: rewrite Spanish player help translations (es-ES) — 25 topics

Full rewrite of all es-ES player help to match updated en-US content.
Preserves command syntax, markdown formatting, and frontmatter IDs.
Includes 3 new topics: spawn_protection, upkeep, permissions.

* feat: add Spanish admin help translations (es-ES), remove placeholder languages

Add 18 es-ES admin help topics mirroring en-US structure. Remove
de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN placeholder
translations — will be regenerated later with complete content.

* fix: strip inline markdown markers, join continuation lines, fix invalid commands

- Add inline marker stripping to HelpLangGenerator (build-time):
  **bold** → bold, `code` → code, *italic* → italic, -- → em-dash
- Join multi-line prose into single lines (each line = one UI entry)
- Remove non-existent /f admin modify and /f admin bypass references
- Fix duplicate debug toggle entry in admin command reference
- Apply same fixes to both en-US and es-ES help content

* feat: table rendering with inline rows, rich text, and help window resize

- Switch table rendering from .ui templates to appendInline with explicit
  calculated heights (fixes content-driven height not working with TextSpans)
- Support 2/3/4 column tables with dynamic width calculation and borders
- Add HelpRichText parser for inline markdown (bold, italic, code, colors)
- Increase help window size ~15% (750x650 → 863x748) for both player/admin
- Fix Y/N → Yes/No in roles permission table
- Use 2px row borders for visibility on all table rows
- Remove stripped inline markers from lang generator (rich text handles them)

* fix: remove duplicate gui.cancel key in admin lang files

Hytale's I18nModule rejects the entire lang file when it encounters a
duplicate key, causing ALL admin GUI translations to show raw keys.

* feat: localize GUI labels for es-ES — browse stats, log time/types, sort labels

Add i18n support for previously hardcoded English text across player and
admin GUI pages: browse entry stat labels (power/claims/members), activity
log time formatting and type names, leaderboard/browser/members sort labels.
Fix truncated Spanish button text (relations, settings, sort labels).

* feat(i18n): localize admin GUI pages, entry templates, and zone flag display names

Localize admin dashboard stats, faction/player/zone list entries,
activity log types and timestamps, economy/treasury labels, zone
flags with display names, integration flags, relation buttons,
action buttons, and faction log enhancements. Add ~100 new keys
to both en-US and es-ES admin and GUI lang files.

* feat(i18n): localize player member and browser entry templates

Add #IDs to anonymous labels in member_entry.ui (Power, Joined,
Last Death) and wire cmd.set() for all entry-level labels and
buttons in FactionMembersPage. Add no_description fallback key
for browser entries. Widen Recruitment label for Spanish. Add
11 new keys to both en-US and es-ES gui lang files.

* feat(i18n): localize admin member entries and player info page

Add #IDs to anonymous labels in admin_faction_members_entry.ui,
wire cmd.set() for entry labels and buttons in
AdminFactionMembersPage. Localize formatReason(), bypass checkbox
labels, and NoFactionLabel in AdminPlayerInfoPage. Widen sort
label and teleport button for Spanish. Add 13 new keys per locale.

* feat(i18n): localize player invite and relation entry templates

Add #IDs to anonymous labels in faction_invite_entry.ui and
faction_relation_entry.ui, wire cmd.set() for all entry-level labels
and buttons in FactionInvitesPage and FactionRelationsPage, add 17
new MessageKeys constants, and add en-US/es-ES lang entries.

Width adjustments: ClaimsLabel 50->55px, DirectionLabel 65->70px
for Spanish translations.

* feat(i18n): localize all hardcoded Java strings in GUI pages

Replace hardcoded English strings with HFMessages.get() calls:
- FactionPageOpener: "Treasury is not available." (5 occurrences)
- AdminPageOpener: "Economy system is not enabled." (3 occurrences)
- AdminFactionInfoPage: "+N more" officer list truncation
- FactionDashboardPage: "in <duration>" upkeep time prefix
- AdminVersionPage: "Unknown" fallbacks
- AdminActivityLogPage: "1h"/"24h"/"7d"/"All" time filter labels
- CreateZoneWizardPage: "circular"/"square" shape names
- ZoneChangeTypeModalPage: "flags reset"/"flags kept"

Add 14 new MessageKeys constants and en-US/es-ES lang entries.

* feat(i18n): localize admin nav bar title and economy entry buttons

Wire cmd.set() for Admin Panel title in AdminNavBarHelper and
Adjust/Info button text in AdminEconomyPage entries. Add 3 new
MessageKeys constants and en-US/es-ES lang entries.

Stage 5 (new player pages) already fully localized — no changes needed.

* feat(i18n): localize remaining hardcoded fallbacks and format strings

Replace all "Unknown", "None", "world", "another zone" fallbacks with
localized equivalents across admin and player GUI pages. Localize
treasury upkeep cost format ("every Nh") and time-left display strings.

* fix(i18n): resolve Spanish truncation, crashes, and missing translations across GUI

- Widen label/button widths across admin pages for longer Spanish text:
  player info (Primera conexion, Ultima conexion, Set/Reset/SetMax buttons),
  sort labels (Ordenar:) on players/economy/zones/members pages,
  bypass state label (Desactivado) on dashboard, teleport button and
  last online label on player entries, lock hints on faction settings
  and create faction pages
- Fix admin player info crash: replace CheckBoxWithLabel @text (not
  dynamically settable) with empty checkbox + separate addressable labels
  for bypass toggles (Sin Perdida de Poder / Sin Decaimiento de Reclamos)
- Widen admin player info container 720->780px for button space
- Add lock hint Wrap:true and increased height for long Spanish text
- Fix treasury column widths to fit Spanish type names (Transferencia)
- Fix help table 4-column widths for longer Spanish headers
- Add missing NOTE callout to es-ES combat/tagging.md (line count parity)
- Remove unsupported mid-text color code from es-ES alliances table
- Add i18n cmd.set() calls for new player map page legend labels

* i18n: add German (de-DE) translations

Complete German translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add French (fr-FR) translations

Complete French translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Brazilian Portuguese (pt-BR) translations

Complete Brazilian Portuguese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Simplified Chinese (zh-CN) translations

Complete Simplified Chinese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Japanese (ja-JP) translations

Complete Japanese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Russian (ru-RU) translations

Complete Russian translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Korean (ko-KR) translations

Complete Korean translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Polish (pl-PL) translations

Complete Polish translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Italian (it-IT) translations

Complete Italian translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Dutch (nl-NL) translations

Complete Dutch translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Filipino/Tagalog (tl-PH) translations

Complete Filipino/Tagalog translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add all 13 locales to settings dropdown and CI verification

- Update AVAILABLE_LOCALES to include all 13 supported languages
- Update fallback.lang documentation with all locale statuses
- Add GitHub Action to verify missing translation keys on push/PR

* i18n: remove zh-CN, ja-JP, ko-KR locales

Hytale client does not currently support CJK characters, so these
translations cannot render in-game. Removed until character support
is added.

* i18n: add French (fr-FR) help file translations

Translate all 42 help markdown files into French, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Brazilian Portuguese (pt-BR) help file translations

Translate all 42 help markdown files into Brazilian Portuguese, covering
welcome, faction management, power/land, diplomacy, combat, economy,
quick reference, and all admin sections.

* i18n: add Russian (ru-RU) help file translations

Translate all 42 help markdown files into Russian, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Italian (it-IT) help file translations

Translate all 42 help markdown files into Italian, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Polish (pl-PL) help file translations

Translate all 42 help markdown files into Polish, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add German (de-DE) help file translations

Translate all 42 help markdown files into German, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Dutch (nl-NL) help file translations

Translate all 42 help markdown files into Dutch, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Filipino/Tagalog (tl-PH) help file translations

Translate all 42 help markdown files into Filipino/Tagalog, covering
welcome, faction management, power/land, diplomacy, combat, economy,
quick reference, and all admin sections.

* ci: add help file verification to check-translations workflow

Add a second job that verifies all locales have matching help .md files
relative to en-US. Detects missing files (error), untranslated files
identical to en-US (warning), and extra files not in en-US (notice).
Also narrows trigger to pull_request only.
* feat: add i18n infrastructure (Phase 0)

Add the foundational i18n system following Ecotale's proven pattern
with Hytale's native I18nModule:

- HFMessages: translation resolution engine with player/server language
  support and {0}/{1} placeholder formatting
- MessageKeys: static key constants organized by nested inner classes
  covering common, commands, protection, territory, GUI nav, and more
- MessageUtil: i18n-aware overloads (PlayerRef + key) alongside existing
  string-literal methods for gradual migration
- ServerConfig: defaultLanguage and usePlayerLanguage settings with
  JSON load/write support
- ConfigManager: convenience accessors for language settings
- PlayerData: languagePreference and notification preference fields
  (territoryAlerts, deathAnnouncements, powerNotifications)
- en-US/hyperfactions.lang: initial common.* translation keys (~25 keys)

* feat: migrate faction management and claim commands to i18n keys (Phase 1a)

Migrate hardcoded English strings to MessageKeys constants for:
- FactionSubCommand.requireFaction()
- Create, Disband, Rename, Desc, Open, Close, Color commands
- Claim command (territory)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate member commands to i18n keys (Phase 1b)

Migrate hardcoded English strings to MessageKeys constants for:
- Invite, Accept/Join, Kick, Leave commands
- Promote, Demote, Transfer commands

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate territory and teleport commands to i18n keys (Phase 1c)

Migrate hardcoded English strings to MessageKeys constants for:
- Unclaim, Overclaim, Stuck commands (territory)
- Home, SetHome, DelHome commands (teleport)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate relation, social, info, and economy commands to i18n keys (Phase 1d)

Migrate hardcoded English strings to MessageKeys constants for:
- Ally, Enemy, Neutral, Relations commands (relation)
- Chat, Invites, Request commands (social)
- Info, Members, List, Help, Who, Map, Power commands (info)
- Money, TreasuryCommandHandler (economy)

Add Invites and Request inner classes to MessageKeys. Expand
Relation, Chat, Info, Power, and Economy classes with new keys.

* feat: migrate UI commands and ProtectionChecker to i18n keys (Phase 1e)

Migrate GuiSubCommand, SettingsSubCommand, FactionCommand to use
MessageKeys constants. Convert ProtectionChecker's 40 hardcoded
strings (action phrases, denial reasons, PvP, entity damage, combat
tag) to HFMessages.get() with server-default language fallback.

* feat: migrate AnnouncementManager, TeleportManager, ChatManager to i18n keys (Phase 1f)

Convert AnnouncementManager to per-player i18n resolution for server
broadcasts. Migrate TeleportManager's 10 hardcoded strings (warmup,
cooldown, cancellation messages) and ChatManager's channel display
names. Add mount entry/teleport blocking messages from
TerritoryTickingSystem. Completes Phase 1 command/system migration.

* feat: add help system markdown-to-lang build pipeline (Phase 2)

Replace hardcoded help content with build-generated .lang files from
markdown sources. Add HelpLangGenerator build-time tool that parses
22 markdown topic files into hyperfactions_help.lang and
help-manifest.json. Refactor HelpRegistry to load structure from
manifest, HelpMessages to delegate to HFMessages/I18nModule, and
HelpCategory to use i18n display name keys. Create initial
hyperfactions_gui.lang with help category names. Add generateHelpLang
Gradle task wired into processResources.

* chore: exclude build package from gitignore pattern

* feat: localize nav system, shared pages, and modal pages (Phase 3a)

Migrate navigation infrastructure to resolve display names via i18n keys
instead of hardcoded English strings. NavBarUtil.buildButtons() now accepts
PlayerRef and resolves keys through HFMessages. All page registry entries
in GuiManager updated to use MessageKeys constants.

Shared pages migrated: MainMenuPage (section titles), FactionInfoPage
(status labels, descriptions), RenameModalPage, DescriptionModalPage,
TagModalPage (all validation/success messages).

New files: hyperfactions_admin.lang (admin nav keys).

* feat: localize FactionDashboardPage and FactionMainPage (Phase 3b)

Migrate ~55 hardcoded English strings to i18n keys across both pages.
Reuse existing command keys (Home, Claim, Common, Leave) where messages
are semantically identical. Add DashboardGui and FactionMainGui key
classes for page-specific labels and messages.

* feat: localize Members, Browser, Leaderboard, and PlayerInfo pages (Phase 3c)

Migrate all hardcoded English strings in FactionMembersPage, FactionBrowserPage,
FactionLeaderboardPage, and PlayerInfoPage to use HFMessages.get() with MessageKeys.
Add GuiCommon, MembersGui, BrowserGui, LeaderboardGui, and PlayerInfoGui key classes.

* feat: localize Relations, Settings, and Modules pages (Phase 3d)

Migrate all hardcoded English strings in FactionRelationsPage,
SetRelationModalPage, FactionSettingsPage, and FactionModulesPage to
use HFMessages.get() with MessageKeys. Add RelationsGui, SettingsGui,
and ModulesGui key classes. Relation type labels use internal English
identifiers for logic with localizeType() resolving display text.

* feat: localize Treasury pages (Phase 3e)

Migrate all 5 treasury page classes to i18n:
- TreasuryPage: dashboard stats, upkeep, transaction type names, actor names
- TreasuryDepositModalPage: deposit/withdraw modal labels and messages
- TreasuryTransferSearchPage: search results, player/faction tags
- TreasuryTransferConfirmPage: fee labels, transfer result messages
- TreasurySettingsPage: leader-only permission errors, limit validation

Add ~70 treasury keys to MessageKeys.TreasuryGui and hyperfactions_gui.lang.

* feat: localize confirmation, logs, chat, invites, and map pages (Phase 3f)

Migrate hardcoded strings to i18n keys across 8 remaining faction GUI pages:
- DisbandConfirmPage, LeaderLeaveConfirmPage, LeaveConfirmPage, TransferConfirmPage
- LogsViewerPage, FactionChatPage, FactionInvitesPage, ChunkMapPage

Adds ConfirmGui, LogsGui, ChatGui, InvitesGui, and MapGui key groups
with ~90 new translation entries in hyperfactions_gui.lang.

* feat: localize create faction and new player pages (Phase 3g)

Migrate 85+ hardcoded strings across 4 new player GUI pages to i18n keys:
- CreateFactionPage: preview labels, validation errors, success messages
- InvitesPage: headers, counts, time formats, join result messages
- NewPlayerBrowsePage: sort dropdown, status badges, action buttons, join/request flows
- NewPlayerMapPage: position info, hint text, legend labels

Add CreateGui and NewPlayerGui inner classes to MessageKeys with 53 new keys.
Add MessageUtil.text() overload for i18n with color parameter.
Reuse existing keys: FactionInfoGui.STATUS_*, SettingsGui.PVP_*, MapGui.POSITION,
MapGui.LEGEND_PROTECTED, Common.ALREADY_IN_FACTION, Common.FACTION_NOT_FOUND.

* feat: localize admin GUI pages (Phase 4)

Migrate all 25 admin page files to use HFMessages.get() and MessageKeys.
Add ~170 admin i18n keys to MessageKeys.AdminGui and hyperfactions_admin.lang
covering dashboard, actions, factions, members, relations, settings,
players, economy, zones, zone map, zone wizard, and version pages.

* feat: add Player Settings GUI with language and notification preferences (Phase 5)

- PlayerSettingsPage with language dropdown and notification toggles
- Language override cache in HFMessages for per-player i18n
- TerritoryNotifier checks player alert preferences before sending
- PlayerDeathSystem checks member preferences before death broadcasts
- /f settings player command opens personal settings
- Page registered in both faction and new player nav bars
- Preferences loaded on connect, cleared on disconnect

* feat: add Spanish translations, locale stubs, and translator workflow (Phase 6)

- Full es-ES translations for commands, GUI, admin, and help content
- Stub .lang files for 7 additional locales (de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN)
- Locale scaffolding scripts (new-translation.sh/bat)
- TRANSLATION_GUIDE.md with format docs and contribution process
- checkTranslations Gradle task to diff keys across locales
- fallback.lang for locale fallback documentation

* fix: redesign Player Settings UI and fix nav bar placement

- Rewrite player_settings.ui to follow established Container/Title/Content
  pattern from browse.ui and faction_settings.ui
- Fix crash from Style (HorizontalAlignment) on Group elements
- Fix DropdownBox crash by using DropdownEntryInfo with LocalizableString
  instead of plain List<String>, and string Value instead of integer index
- Move "Player" nav button to far right of both faction and new player
  nav bars using FlexWeight spacer pattern
- Remove player_settings from nav bar button list (rendered separately)
- Use rebuild() for state changes since page stores preferences as
  instance fields (async load race condition with openPlayerSettings)

* feat: use native locale display names and add es-ES to language selector

- Replace hardcoded LOCALE_DISPLAY_NAMES list with Java's Locale class
  to generate native display names (e.g. "Español (España)")
- Add es-ES as second available locale in the language dropdown
- Fix es-ES nav.player_settings to match en-US ("Jugador" not "Ajustes")

* feat: localize all GUI pages with i18n support

Add cmd.set() calls to override hardcoded English text in all .ui
templates with HFMessages.get() lookups. Covers faction pages, admin
pages, shared/modal pages, new player pages, and help pages.

- Add ~570 new MessageKeys constants across all page domains
- Add ~280 new en-US .lang keys for GUI labels
- Add ~320 new es-ES admin .lang keys
- Add ~280 new es-ES GUI .lang keys
- Add element IDs to ~95 .ui template files for runtime text override
- Add common keys: clear, back, leave, transfer, disband

* feat: localize admin zone wizard, unclaim confirm, and type modal pages

Add i18n support for remaining admin pages: zone creation wizard,
zone type change modal, and unclaim-all confirmation page. Fix
duplicate GUI_CANCEL constant in MessageKeys.

* fix: admin GUI crash, help i18n resolution, and dropdown display names

- Fix crash: #Title.Text selector on admin pages — add #PageTitle ID to
  all 29 admin .ui templates and update 28 Java files to use #PageTitle
- Fix help content showing English for non-English players — thread
  PlayerRef through HelpTopic.title(), HelpEntry.text(), and
  HelpMainPage.buildTopicCards() so help resolves per-player locale
- Fix category title using server default — use displayName(playerRef)
- Fix language dropdown truncation — use compact display names
  (English (US) instead of English (United States)) and widen to 220px

* fix: persist player preferences to JSON storage

The custom serializePlayerData/deserializePlayerData methods in
JsonPlayerStorage did not include the i18n preference fields added
to PlayerData. Settings were saved in memory but lost on restart.

Also includes compact locale display names and help i18n threading
from earlier fixes that were committed separately.

* fix: disable Power Notifications toggle (not yet wired up)

The checkbox is shown but disabled since no power change
notifications are currently sent to players.

* refactor: relocate help markdown to Server/Languages and remove stale config.json

Move help source files from src/main/help/{locale}/ to
src/main/resources/Server/Languages/{locale}/help/ so the build-time
HelpLangGenerator reads from the same directory structure as the
runtime language loader. Update translation scripts and build.gradle
to match the new path. Remove unused config.json (replaced by
per-feature config files in config/).

* feat: restructure admin test commands and extend help markdown syntax

Restructure /f admin testgui and sentrytest under /f admin test <sub>
via new AdminTestHandler, adding /f admin test md for a future
markdown visual test page.

Extend the help system with 9 new markdown entry types: bold, italic,
list (bullet + numbered), separator, callout boxes (with colored
accent bars), inline hex colors ([#RRGGBB]), named color shortcuts
(!warning, !success, !note, !muted), and typed callouts (>[!WARNING],
>[!INFO], >[!NOTE], >[!SUCCESS], >[!TIP]).

HelpEntry gains a color field for dynamic color overrides. The
build-time HelpLangGenerator parses all new syntax and emits color
metadata in help-manifest.json. HelpRegistry and HelpMainPage handle
the new types at runtime, applying colors to text and callout accent
bars. Five new .ui templates support the visual rendering.

TIP entries are unified into CALLOUT (backward-compatible: old TIP
manifests render as green callouts).

* feat: add markdown rendering test page (/f admin test md)

Visual test page that renders every supported help markdown entry
type using the real .ui templates. Shows syntax labels alongside
rendered output for verification: text, heading, command, bold,
italic, bullet/numbered lists, separators, hex colors, named color
shortcuts, and all callout box types. Includes edge cases for text
wrapping and mixed content flow.

* docs: add help markdown style guide and move translation guide to docs/

Add docs/help-markdown.md covering the full help markdown syntax
(bold, italic, lists, separators, colors, callouts) with examples.

Move TRANSLATION_GUIDE.md to docs/translation-guide.md and update it
with the new syntax types and clear guidance on what to translate
vs. what to keep (color codes, callout type tags, named shortcuts
stay in English across all locales).

* feat: add new UI Gallery elements to button test page

Add elements discovered from 2026.02.17 UI Gallery to the element
test page: TabNavigation with HeaderTabsStyle, MultilineTextField,
tooltip demo (TooltipText + DefaultTextTooltipStyle), ContentSeparator
and PanelSeparatorFancy, ProgressBar template, HeaderSearch, Panel
and SimpleContainer variants. Update command reference to /f admin
test gui.

* fix: pin markdown test page title bar to top of container

* fix: remove invalid #Title/#Content slots from Panel and SimpleContainer

These templates are flat containers — content goes directly inside
with no insertion point wrappers. Only @Container/@DecoratedContainer
have #Title/#Content slots.

* fix: enable text wrapping and vertical centering in help templates

Replace fixed Height with auto-sizing (remove Anchor Height, use
Padding for spacing). Add Wrap: true to all Label styles so long
text wraps instead of truncating with ellipsis. Add VerticalAlignment:
Center for proper vertical text positioning.

Applies to all 8 help line templates: text, command, heading, bold,
italic, list, tip, and callout.

* feat: add table support to help markdown system

Tables use standard markdown pipe syntax (| col | col |) with
separator rows for headers. Supports per-cell inline formatting
(**bold**, *italic*, `command`, [#hex] colors) and row-level
color overrides. Includes 4 new .ui templates, parser/registry/
renderer updates, and visual test entries.

* fix: improve table visual styling with GitHub-style grid borders

Redesign table templates with proper grid lines: left border on each
cell for column separators, top/bottom borders on rows, header row
background, 200px cell width with generous padding. Add per-cell
inline formatting support (bold, italic, command, hex colors).

* feat: add admin help infrastructure with category filtering

Add 8 admin help categories (ADMIN_OVERVIEW through ADMIN_REFERENCE)
to HelpCategory enum with isAdmin() filter. Rewrite AdminHelpPage from
placeholder to full sidebar+content rendering. Filter admin categories
from player HelpMainPage. Add admin directory scanning to
HelpLangGenerator build pipeline.

* feat: rewrite player help categories 1-4 (en-US) with enhanced formatting

Comprehensive rewrite of welcome, your_faction, power_land, and
diplomacy help using tables, callouts, bold formatting, and accurate
default config values. 14 topics expanded with detailed mechanics.

* feat: rewrite player help categories 5-7 (en-US), add spawn protection/upkeep/permissions topics

Rewrite combat, economy, and quick_ref help with enhanced formatting.
Add 3 new topics: spawn_protection (combat mechanics), upkeep (territory
maintenance costs), and permissions (key permission nodes reference).

* feat: add comprehensive admin help content (en-US) — 18 topics across 8 categories

Complete admin help documentation covering overview, faction management,
zones, power manipulation, economy, configuration, maintenance (backups,
updates, imports), and admin command reference. All values sourced from
actual config defaults and handler implementations.

* feat: rewrite Spanish player help translations (es-ES) — 25 topics

Full rewrite of all es-ES player help to match updated en-US content.
Preserves command syntax, markdown formatting, and frontmatter IDs.
Includes 3 new topics: spawn_protection, upkeep, permissions.

* feat: add Spanish admin help translations (es-ES), remove placeholder languages

Add 18 es-ES admin help topics mirroring en-US structure. Remove
de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN placeholder
translations — will be regenerated later with complete content.

* fix: strip inline markdown markers, join continuation lines, fix invalid commands

- Add inline marker stripping to HelpLangGenerator (build-time):
  **bold** → bold, `code` → code, *italic* → italic, -- → em-dash
- Join multi-line prose into single lines (each line = one UI entry)
- Remove non-existent /f admin modify and /f admin bypass references
- Fix duplicate debug toggle entry in admin command reference
- Apply same fixes to both en-US and es-ES help content

* feat: table rendering with inline rows, rich text, and help window resize

- Switch table rendering from .ui templates to appendInline with explicit
  calculated heights (fixes content-driven height not working with TextSpans)
- Support 2/3/4 column tables with dynamic width calculation and borders
- Add HelpRichText parser for inline markdown (bold, italic, code, colors)
- Increase help window size ~15% (750x650 → 863x748) for both player/admin
- Fix Y/N → Yes/No in roles permission table
- Use 2px row borders for visibility on all table rows
- Remove stripped inline markers from lang generator (rich text handles them)

* fix: remove duplicate gui.cancel key in admin lang files

Hytale's I18nModule rejects the entire lang file when it encounters a
duplicate key, causing ALL admin GUI translations to show raw keys.

* feat: localize GUI labels for es-ES — browse stats, log time/types, sort labels

Add i18n support for previously hardcoded English text across player and
admin GUI pages: browse entry stat labels (power/claims/members), activity
log time formatting and type names, leaderboard/browser/members sort labels.
Fix truncated Spanish button text (relations, settings, sort labels).

* feat(i18n): localize admin GUI pages, entry templates, and zone flag display names

Localize admin dashboard stats, faction/player/zone list entries,
activity log types and timestamps, economy/treasury labels, zone
flags with display names, integration flags, relation buttons,
action buttons, and faction log enhancements. Add ~100 new keys
to both en-US and es-ES admin and GUI lang files.

* feat(i18n): localize player member and browser entry templates

Add #IDs to anonymous labels in member_entry.ui (Power, Joined,
Last Death) and wire cmd.set() for all entry-level labels and
buttons in FactionMembersPage. Add no_description fallback key
for browser entries. Widen Recruitment label for Spanish. Add
11 new keys to both en-US and es-ES gui lang files.

* feat(i18n): localize admin member entries and player info page

Add #IDs to anonymous labels in admin_faction_members_entry.ui,
wire cmd.set() for entry labels and buttons in
AdminFactionMembersPage. Localize formatReason(), bypass checkbox
labels, and NoFactionLabel in AdminPlayerInfoPage. Widen sort
label and teleport button for Spanish. Add 13 new keys per locale.

* feat(i18n): localize player invite and relation entry templates

Add #IDs to anonymous labels in faction_invite_entry.ui and
faction_relation_entry.ui, wire cmd.set() for all entry-level labels
and buttons in FactionInvitesPage and FactionRelationsPage, add 17
new MessageKeys constants, and add en-US/es-ES lang entries.

Width adjustments: ClaimsLabel 50->55px, DirectionLabel 65->70px
for Spanish translations.

* feat(i18n): localize all hardcoded Java strings in GUI pages

Replace hardcoded English strings with HFMessages.get() calls:
- FactionPageOpener: "Treasury is not available." (5 occurrences)
- AdminPageOpener: "Economy system is not enabled." (3 occurrences)
- AdminFactionInfoPage: "+N more" officer list truncation
- FactionDashboardPage: "in <duration>" upkeep time prefix
- AdminVersionPage: "Unknown" fallbacks
- AdminActivityLogPage: "1h"/"24h"/"7d"/"All" time filter labels
- CreateZoneWizardPage: "circular"/"square" shape names
- ZoneChangeTypeModalPage: "flags reset"/"flags kept"

Add 14 new MessageKeys constants and en-US/es-ES lang entries.

* feat(i18n): localize admin nav bar title and economy entry buttons

Wire cmd.set() for Admin Panel title in AdminNavBarHelper and
Adjust/Info button text in AdminEconomyPage entries. Add 3 new
MessageKeys constants and en-US/es-ES lang entries.

Stage 5 (new player pages) already fully localized — no changes needed.

* feat(i18n): localize remaining hardcoded fallbacks and format strings

Replace all "Unknown", "None", "world", "another zone" fallbacks with
localized equivalents across admin and player GUI pages. Localize
treasury upkeep cost format ("every Nh") and time-left display strings.

* fix(i18n): resolve Spanish truncation, crashes, and missing translations across GUI

- Widen label/button widths across admin pages for longer Spanish text:
  player info (Primera conexion, Ultima conexion, Set/Reset/SetMax buttons),
  sort labels (Ordenar:) on players/economy/zones/members pages,
  bypass state label (Desactivado) on dashboard, teleport button and
  last online label on player entries, lock hints on faction settings
  and create faction pages
- Fix admin player info crash: replace CheckBoxWithLabel @text (not
  dynamically settable) with empty checkbox + separate addressable labels
  for bypass toggles (Sin Perdida de Poder / Sin Decaimiento de Reclamos)
- Widen admin player info container 720->780px for button space
- Add lock hint Wrap:true and increased height for long Spanish text
- Fix treasury column widths to fit Spanish type names (Transferencia)
- Fix help table 4-column widths for longer Spanish headers
- Add missing NOTE callout to es-ES combat/tagging.md (line count parity)
- Remove unsupported mid-text color code from es-ES alliances table
- Add i18n cmd.set() calls for new player map page legend labels

* feat: add SimpleClaims data importer

Import parties, claims, and alliances from SimpleClaims into
HyperFactions. Supports both SQLite (modern) and JSON (legacy)
storage formats with automatic detection.

Key conversion details:
- Party Owner → Leader, Members → Member (no Officer role in SC)
- Only mutual alliances imported as ALLY (one-way skipped)
- Player allies logged as data loss (no HF equivalent)
- Protection overrides mapped to outsider permission flags
- Default max power assigned (SC has no power system)
- No zones or homes (SC doesn't have these concepts)

Includes SQLite JDBC driver detection with clear error message
if the driver is unavailable.
* feat: add i18n infrastructure (Phase 0)

Add the foundational i18n system following Ecotale's proven pattern
with Hytale's native I18nModule:

- HFMessages: translation resolution engine with player/server language
  support and {0}/{1} placeholder formatting
- MessageKeys: static key constants organized by nested inner classes
  covering common, commands, protection, territory, GUI nav, and more
- MessageUtil: i18n-aware overloads (PlayerRef + key) alongside existing
  string-literal methods for gradual migration
- ServerConfig: defaultLanguage and usePlayerLanguage settings with
  JSON load/write support
- ConfigManager: convenience accessors for language settings
- PlayerData: languagePreference and notification preference fields
  (territoryAlerts, deathAnnouncements, powerNotifications)
- en-US/hyperfactions.lang: initial common.* translation keys (~25 keys)

* feat: migrate faction management and claim commands to i18n keys (Phase 1a)

Migrate hardcoded English strings to MessageKeys constants for:
- FactionSubCommand.requireFaction()
- Create, Disband, Rename, Desc, Open, Close, Color commands
- Claim command (territory)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate member commands to i18n keys (Phase 1b)

Migrate hardcoded English strings to MessageKeys constants for:
- Invite, Accept/Join, Kick, Leave commands
- Promote, Demote, Transfer commands

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate territory and teleport commands to i18n keys (Phase 1c)

Migrate hardcoded English strings to MessageKeys constants for:
- Unclaim, Overclaim, Stuck commands (territory)
- Home, SetHome, DelHome commands (teleport)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate relation, social, info, and economy commands to i18n keys (Phase 1d)

Migrate hardcoded English strings to MessageKeys constants for:
- Ally, Enemy, Neutral, Relations commands (relation)
- Chat, Invites, Request commands (social)
- Info, Members, List, Help, Who, Map, Power commands (info)
- Money, TreasuryCommandHandler (economy)

Add Invites and Request inner classes to MessageKeys. Expand
Relation, Chat, Info, Power, and Economy classes with new keys.

* feat: migrate UI commands and ProtectionChecker to i18n keys (Phase 1e)

Migrate GuiSubCommand, SettingsSubCommand, FactionCommand to use
MessageKeys constants. Convert ProtectionChecker's 40 hardcoded
strings (action phrases, denial reasons, PvP, entity damage, combat
tag) to HFMessages.get() with server-default language fallback.

* feat: migrate AnnouncementManager, TeleportManager, ChatManager to i18n keys (Phase 1f)

Convert AnnouncementManager to per-player i18n resolution for server
broadcasts. Migrate TeleportManager's 10 hardcoded strings (warmup,
cooldown, cancellation messages) and ChatManager's channel display
names. Add mount entry/teleport blocking messages from
TerritoryTickingSystem. Completes Phase 1 command/system migration.

* feat: add help system markdown-to-lang build pipeline (Phase 2)

Replace hardcoded help content with build-generated .lang files from
markdown sources. Add HelpLangGenerator build-time tool that parses
22 markdown topic files into hyperfactions_help.lang and
help-manifest.json. Refactor HelpRegistry to load structure from
manifest, HelpMessages to delegate to HFMessages/I18nModule, and
HelpCategory to use i18n display name keys. Create initial
hyperfactions_gui.lang with help category names. Add generateHelpLang
Gradle task wired into processResources.

* chore: exclude build package from gitignore pattern

* feat: localize nav system, shared pages, and modal pages (Phase 3a)

Migrate navigation infrastructure to resolve display names via i18n keys
instead of hardcoded English strings. NavBarUtil.buildButtons() now accepts
PlayerRef and resolves keys through HFMessages. All page registry entries
in GuiManager updated to use MessageKeys constants.

Shared pages migrated: MainMenuPage (section titles), FactionInfoPage
(status labels, descriptions), RenameModalPage, DescriptionModalPage,
TagModalPage (all validation/success messages).

New files: hyperfactions_admin.lang (admin nav keys).

* feat: localize FactionDashboardPage and FactionMainPage (Phase 3b)

Migrate ~55 hardcoded English strings to i18n keys across both pages.
Reuse existing command keys (Home, Claim, Common, Leave) where messages
are semantically identical. Add DashboardGui and FactionMainGui key
classes for page-specific labels and messages.

* feat: localize Members, Browser, Leaderboard, and PlayerInfo pages (Phase 3c)

Migrate all hardcoded English strings in FactionMembersPage, FactionBrowserPage,
FactionLeaderboardPage, and PlayerInfoPage to use HFMessages.get() with MessageKeys.
Add GuiCommon, MembersGui, BrowserGui, LeaderboardGui, and PlayerInfoGui key classes.

* feat: localize Relations, Settings, and Modules pages (Phase 3d)

Migrate all hardcoded English strings in FactionRelationsPage,
SetRelationModalPage, FactionSettingsPage, and FactionModulesPage to
use HFMessages.get() with MessageKeys. Add RelationsGui, SettingsGui,
and ModulesGui key classes. Relation type labels use internal English
identifiers for logic with localizeType() resolving display text.

* feat: localize Treasury pages (Phase 3e)

Migrate all 5 treasury page classes to i18n:
- TreasuryPage: dashboard stats, upkeep, transaction type names, actor names
- TreasuryDepositModalPage: deposit/withdraw modal labels and messages
- TreasuryTransferSearchPage: search results, player/faction tags
- TreasuryTransferConfirmPage: fee labels, transfer result messages
- TreasurySettingsPage: leader-only permission errors, limit validation

Add ~70 treasury keys to MessageKeys.TreasuryGui and hyperfactions_gui.lang.

* feat: localize confirmation, logs, chat, invites, and map pages (Phase 3f)

Migrate hardcoded strings to i18n keys across 8 remaining faction GUI pages:
- DisbandConfirmPage, LeaderLeaveConfirmPage, LeaveConfirmPage, TransferConfirmPage
- LogsViewerPage, FactionChatPage, FactionInvitesPage, ChunkMapPage

Adds ConfirmGui, LogsGui, ChatGui, InvitesGui, and MapGui key groups
with ~90 new translation entries in hyperfactions_gui.lang.

* feat: localize create faction and new player pages (Phase 3g)

Migrate 85+ hardcoded strings across 4 new player GUI pages to i18n keys:
- CreateFactionPage: preview labels, validation errors, success messages
- InvitesPage: headers, counts, time formats, join result messages
- NewPlayerBrowsePage: sort dropdown, status badges, action buttons, join/request flows
- NewPlayerMapPage: position info, hint text, legend labels

Add CreateGui and NewPlayerGui inner classes to MessageKeys with 53 new keys.
Add MessageUtil.text() overload for i18n with color parameter.
Reuse existing keys: FactionInfoGui.STATUS_*, SettingsGui.PVP_*, MapGui.POSITION,
MapGui.LEGEND_PROTECTED, Common.ALREADY_IN_FACTION, Common.FACTION_NOT_FOUND.

* feat: localize admin GUI pages (Phase 4)

Migrate all 25 admin page files to use HFMessages.get() and MessageKeys.
Add ~170 admin i18n keys to MessageKeys.AdminGui and hyperfactions_admin.lang
covering dashboard, actions, factions, members, relations, settings,
players, economy, zones, zone map, zone wizard, and version pages.

* feat: add Player Settings GUI with language and notification preferences (Phase 5)

- PlayerSettingsPage with language dropdown and notification toggles
- Language override cache in HFMessages for per-player i18n
- TerritoryNotifier checks player alert preferences before sending
- PlayerDeathSystem checks member preferences before death broadcasts
- /f settings player command opens personal settings
- Page registered in both faction and new player nav bars
- Preferences loaded on connect, cleared on disconnect

* feat: add Spanish translations, locale stubs, and translator workflow (Phase 6)

- Full es-ES translations for commands, GUI, admin, and help content
- Stub .lang files for 7 additional locales (de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN)
- Locale scaffolding scripts (new-translation.sh/bat)
- TRANSLATION_GUIDE.md with format docs and contribution process
- checkTranslations Gradle task to diff keys across locales
- fallback.lang for locale fallback documentation

* fix: redesign Player Settings UI and fix nav bar placement

- Rewrite player_settings.ui to follow established Container/Title/Content
  pattern from browse.ui and faction_settings.ui
- Fix crash from Style (HorizontalAlignment) on Group elements
- Fix DropdownBox crash by using DropdownEntryInfo with LocalizableString
  instead of plain List<String>, and string Value instead of integer index
- Move "Player" nav button to far right of both faction and new player
  nav bars using FlexWeight spacer pattern
- Remove player_settings from nav bar button list (rendered separately)
- Use rebuild() for state changes since page stores preferences as
  instance fields (async load race condition with openPlayerSettings)

* feat: use native locale display names and add es-ES to language selector

- Replace hardcoded LOCALE_DISPLAY_NAMES list with Java's Locale class
  to generate native display names (e.g. "Español (España)")
- Add es-ES as second available locale in the language dropdown
- Fix es-ES nav.player_settings to match en-US ("Jugador" not "Ajustes")

* feat: localize all GUI pages with i18n support

Add cmd.set() calls to override hardcoded English text in all .ui
templates with HFMessages.get() lookups. Covers faction pages, admin
pages, shared/modal pages, new player pages, and help pages.

- Add ~570 new MessageKeys constants across all page domains
- Add ~280 new en-US .lang keys for GUI labels
- Add ~320 new es-ES admin .lang keys
- Add ~280 new es-ES GUI .lang keys
- Add element IDs to ~95 .ui template files for runtime text override
- Add common keys: clear, back, leave, transfer, disband

* feat: localize admin zone wizard, unclaim confirm, and type modal pages

Add i18n support for remaining admin pages: zone creation wizard,
zone type change modal, and unclaim-all confirmation page. Fix
duplicate GUI_CANCEL constant in MessageKeys.

* fix: admin GUI crash, help i18n resolution, and dropdown display names

- Fix crash: #Title.Text selector on admin pages — add #PageTitle ID to
  all 29 admin .ui templates and update 28 Java files to use #PageTitle
- Fix help content showing English for non-English players — thread
  PlayerRef through HelpTopic.title(), HelpEntry.text(), and
  HelpMainPage.buildTopicCards() so help resolves per-player locale
- Fix category title using server default — use displayName(playerRef)
- Fix language dropdown truncation — use compact display names
  (English (US) instead of English (United States)) and widen to 220px

* fix: persist player preferences to JSON storage

The custom serializePlayerData/deserializePlayerData methods in
JsonPlayerStorage did not include the i18n preference fields added
to PlayerData. Settings were saved in memory but lost on restart.

Also includes compact locale display names and help i18n threading
from earlier fixes that were committed separately.

* fix: disable Power Notifications toggle (not yet wired up)

The checkbox is shown but disabled since no power change
notifications are currently sent to players.

* refactor: relocate help markdown to Server/Languages and remove stale config.json

Move help source files from src/main/help/{locale}/ to
src/main/resources/Server/Languages/{locale}/help/ so the build-time
HelpLangGenerator reads from the same directory structure as the
runtime language loader. Update translation scripts and build.gradle
to match the new path. Remove unused config.json (replaced by
per-feature config files in config/).

* feat: restructure admin test commands and extend help markdown syntax

Restructure /f admin testgui and sentrytest under /f admin test <sub>
via new AdminTestHandler, adding /f admin test md for a future
markdown visual test page.

Extend the help system with 9 new markdown entry types: bold, italic,
list (bullet + numbered), separator, callout boxes (with colored
accent bars), inline hex colors ([#RRGGBB]), named color shortcuts
(!warning, !success, !note, !muted), and typed callouts (>[!WARNING],
>[!INFO], >[!NOTE], >[!SUCCESS], >[!TIP]).

HelpEntry gains a color field for dynamic color overrides. The
build-time HelpLangGenerator parses all new syntax and emits color
metadata in help-manifest.json. HelpRegistry and HelpMainPage handle
the new types at runtime, applying colors to text and callout accent
bars. Five new .ui templates support the visual rendering.

TIP entries are unified into CALLOUT (backward-compatible: old TIP
manifests render as green callouts).

* feat: add markdown rendering test page (/f admin test md)

Visual test page that renders every supported help markdown entry
type using the real .ui templates. Shows syntax labels alongside
rendered output for verification: text, heading, command, bold,
italic, bullet/numbered lists, separators, hex colors, named color
shortcuts, and all callout box types. Includes edge cases for text
wrapping and mixed content flow.

* docs: add help markdown style guide and move translation guide to docs/

Add docs/help-markdown.md covering the full help markdown syntax
(bold, italic, lists, separators, colors, callouts) with examples.

Move TRANSLATION_GUIDE.md to docs/translation-guide.md and update it
with the new syntax types and clear guidance on what to translate
vs. what to keep (color codes, callout type tags, named shortcuts
stay in English across all locales).

* feat: add new UI Gallery elements to button test page

Add elements discovered from 2026.02.17 UI Gallery to the element
test page: TabNavigation with HeaderTabsStyle, MultilineTextField,
tooltip demo (TooltipText + DefaultTextTooltipStyle), ContentSeparator
and PanelSeparatorFancy, ProgressBar template, HeaderSearch, Panel
and SimpleContainer variants. Update command reference to /f admin
test gui.

* fix: pin markdown test page title bar to top of container

* fix: remove invalid #Title/#Content slots from Panel and SimpleContainer

These templates are flat containers — content goes directly inside
with no insertion point wrappers. Only @Container/@DecoratedContainer
have #Title/#Content slots.

* fix: enable text wrapping and vertical centering in help templates

Replace fixed Height with auto-sizing (remove Anchor Height, use
Padding for spacing). Add Wrap: true to all Label styles so long
text wraps instead of truncating with ellipsis. Add VerticalAlignment:
Center for proper vertical text positioning.

Applies to all 8 help line templates: text, command, heading, bold,
italic, list, tip, and callout.

* feat: add table support to help markdown system

Tables use standard markdown pipe syntax (| col | col |) with
separator rows for headers. Supports per-cell inline formatting
(**bold**, *italic*, `command`, [#hex] colors) and row-level
color overrides. Includes 4 new .ui templates, parser/registry/
renderer updates, and visual test entries.

* fix: improve table visual styling with GitHub-style grid borders

Redesign table templates with proper grid lines: left border on each
cell for column separators, top/bottom borders on rows, header row
background, 200px cell width with generous padding. Add per-cell
inline formatting support (bold, italic, command, hex colors).

* feat: add admin help infrastructure with category filtering

Add 8 admin help categories (ADMIN_OVERVIEW through ADMIN_REFERENCE)
to HelpCategory enum with isAdmin() filter. Rewrite AdminHelpPage from
placeholder to full sidebar+content rendering. Filter admin categories
from player HelpMainPage. Add admin directory scanning to
HelpLangGenerator build pipeline.

* feat: rewrite player help categories 1-4 (en-US) with enhanced formatting

Comprehensive rewrite of welcome, your_faction, power_land, and
diplomacy help using tables, callouts, bold formatting, and accurate
default config values. 14 topics expanded with detailed mechanics.

* feat: rewrite player help categories 5-7 (en-US), add spawn protection/upkeep/permissions topics

Rewrite combat, economy, and quick_ref help with enhanced formatting.
Add 3 new topics: spawn_protection (combat mechanics), upkeep (territory
maintenance costs), and permissions (key permission nodes reference).

* feat: add comprehensive admin help content (en-US) — 18 topics across 8 categories

Complete admin help documentation covering overview, faction management,
zones, power manipulation, economy, configuration, maintenance (backups,
updates, imports), and admin command reference. All values sourced from
actual config defaults and handler implementations.

* feat: rewrite Spanish player help translations (es-ES) — 25 topics

Full rewrite of all es-ES player help to match updated en-US content.
Preserves command syntax, markdown formatting, and frontmatter IDs.
Includes 3 new topics: spawn_protection, upkeep, permissions.

* feat: add Spanish admin help translations (es-ES), remove placeholder languages

Add 18 es-ES admin help topics mirroring en-US structure. Remove
de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN placeholder
translations — will be regenerated later with complete content.

* fix: strip inline markdown markers, join continuation lines, fix invalid commands

- Add inline marker stripping to HelpLangGenerator (build-time):
  **bold** → bold, `code` → code, *italic* → italic, -- → em-dash
- Join multi-line prose into single lines (each line = one UI entry)
- Remove non-existent /f admin modify and /f admin bypass references
- Fix duplicate debug toggle entry in admin command reference
- Apply same fixes to both en-US and es-ES help content

* feat: table rendering with inline rows, rich text, and help window resize

- Switch table rendering from .ui templates to appendInline with explicit
  calculated heights (fixes content-driven height not working with TextSpans)
- Support 2/3/4 column tables with dynamic width calculation and borders
- Add HelpRichText parser for inline markdown (bold, italic, code, colors)
- Increase help window size ~15% (750x650 → 863x748) for both player/admin
- Fix Y/N → Yes/No in roles permission table
- Use 2px row borders for visibility on all table rows
- Remove stripped inline markers from lang generator (rich text handles them)

* fix: remove duplicate gui.cancel key in admin lang files

Hytale's I18nModule rejects the entire lang file when it encounters a
duplicate key, causing ALL admin GUI translations to show raw keys.

* feat: localize GUI labels for es-ES — browse stats, log time/types, sort labels

Add i18n support for previously hardcoded English text across player and
admin GUI pages: browse entry stat labels (power/claims/members), activity
log time formatting and type names, leaderboard/browser/members sort labels.
Fix truncated Spanish button text (relations, settings, sort labels).

* feat(i18n): localize admin GUI pages, entry templates, and zone flag display names

Localize admin dashboard stats, faction/player/zone list entries,
activity log types and timestamps, economy/treasury labels, zone
flags with display names, integration flags, relation buttons,
action buttons, and faction log enhancements. Add ~100 new keys
to both en-US and es-ES admin and GUI lang files.

* feat(i18n): localize player member and browser entry templates

Add #IDs to anonymous labels in member_entry.ui (Power, Joined,
Last Death) and wire cmd.set() for all entry-level labels and
buttons in FactionMembersPage. Add no_description fallback key
for browser entries. Widen Recruitment label for Spanish. Add
11 new keys to both en-US and es-ES gui lang files.

* feat(i18n): localize admin member entries and player info page

Add #IDs to anonymous labels in admin_faction_members_entry.ui,
wire cmd.set() for entry labels and buttons in
AdminFactionMembersPage. Localize formatReason(), bypass checkbox
labels, and NoFactionLabel in AdminPlayerInfoPage. Widen sort
label and teleport button for Spanish. Add 13 new keys per locale.

* feat(i18n): localize player invite and relation entry templates

Add #IDs to anonymous labels in faction_invite_entry.ui and
faction_relation_entry.ui, wire cmd.set() for all entry-level labels
and buttons in FactionInvitesPage and FactionRelationsPage, add 17
new MessageKeys constants, and add en-US/es-ES lang entries.

Width adjustments: ClaimsLabel 50->55px, DirectionLabel 65->70px
for Spanish translations.

* feat(i18n): localize all hardcoded Java strings in GUI pages

Replace hardcoded English strings with HFMessages.get() calls:
- FactionPageOpener: "Treasury is not available." (5 occurrences)
- AdminPageOpener: "Economy system is not enabled." (3 occurrences)
- AdminFactionInfoPage: "+N more" officer list truncation
- FactionDashboardPage: "in <duration>" upkeep time prefix
- AdminVersionPage: "Unknown" fallbacks
- AdminActivityLogPage: "1h"/"24h"/"7d"/"All" time filter labels
- CreateZoneWizardPage: "circular"/"square" shape names
- ZoneChangeTypeModalPage: "flags reset"/"flags kept"

Add 14 new MessageKeys constants and en-US/es-ES lang entries.

* feat(i18n): localize admin nav bar title and economy entry buttons

Wire cmd.set() for Admin Panel title in AdminNavBarHelper and
Adjust/Info button text in AdminEconomyPage entries. Add 3 new
MessageKeys constants and en-US/es-ES lang entries.

Stage 5 (new player pages) already fully localized — no changes needed.

* feat(i18n): localize remaining hardcoded fallbacks and format strings

Replace all "Unknown", "None", "world", "another zone" fallbacks with
localized equivalents across admin and player GUI pages. Localize
treasury upkeep cost format ("every Nh") and time-left display strings.

* fix(i18n): resolve Spanish truncation, crashes, and missing translations across GUI

- Widen label/button widths across admin pages for longer Spanish text:
  player info (Primera conexion, Ultima conexion, Set/Reset/SetMax buttons),
  sort labels (Ordenar:) on players/economy/zones/members pages,
  bypass state label (Desactivado) on dashboard, teleport button and
  last online label on player entries, lock hints on faction settings
  and create faction pages
- Fix admin player info crash: replace CheckBoxWithLabel @text (not
  dynamically settable) with empty checkbox + separate addressable labels
  for bypass toggles (Sin Perdida de Poder / Sin Decaimiento de Reclamos)
- Widen admin player info container 720->780px for button space
- Add lock hint Wrap:true and increased height for long Spanish text
- Fix treasury column widths to fit Spanish type names (Transferencia)
- Fix help table 4-column widths for longer Spanish headers
- Add missing NOTE callout to es-ES combat/tagging.md (line count parity)
- Remove unsupported mid-text color code from es-ES alliances table
- Add i18n cmd.set() calls for new player map page legend labels

* feat: add FactionsX data importer

Add importer for migrating servers from FactionsX (by Humblegod666) to
HyperFactions. Follows the same pattern as existing HyFactions and
ElbaphFactions importers.

- 8 Gson-mapped data model records matching FactionsX JSON format
- Full importer with validate/importFrom, per-player power, permission
  mapping, zone chunk parsing ("x:z" strings), and ChunkY=Z quirk
- Admin command: /f admin import factionsx [path] [flags]
- Cross-importer lock safety across all three importers

* feat: add i18n message keys to FactionsX importer FactionLog calls

Add MessageKeys for MSG_IMPORTED_FROM, MSG_LEFT_IMPORT, and
MSG_LEADER_IMPORT_TRANSFER to match the i18n pattern used by
HyFactionsImporter and ElbaphFactionsImporter.

Also add missing hardcorePower parameter to Faction constructor
(added in i18n branch).
…hardcoded strings (#100)

Split the monolithic MessageKeys.java (2,789 lines, ~1,298 constants)
into 6 focused domain files: CommonKeys, CommandKeys, HelpKeys,
AdminKeys, GuiKeys, and AdminGuiKeys. Consolidated ~25 duplicate keys
into shared CommonKeys.Common constants.

Localized ~70 remaining hardcoded strings in territory display banners,
update notifications, death broadcasts, and admin handlers. Added ~467
new translation entries per locale across all 10 supported languages.
* feat: implement admin GUI features — Updates, Backups, and Config Editor

Add three complete admin GUI pages accessible from the admin navigation bar:

- Updates page: version info display, update checking, rollback support
- Backups page: create, restore, delete backups with paginated list
- Config Editor: 11-tab editor covering all HyperFactions settings
  with size-adaptive layouts (narrow/standard/wide), inline editing,
  color pickers, enum dropdowns, faction permissions with parent/child
  toggling, world overrides, upkeep scaling tiers modal, edit session
  caching, input validation, and debounced text updates

Includes config module getters/setters, ConfigSnapshot for applying
changes, ConfigValidator for input bounds, localization keys for all
10 languages, and ConfigV7→V8 migration for new settings.

* fix: polish admin GUI pages — button styles, updates redesign, backup filter

- Replace all $C.@DefaultTextButtonStyle/$C.@SecondaryTextButtonStyle
  with $S.@ButtonStyle/$S.@CyanButtonStyle/$S.@RedButtonStyle to match
  codebase styling (no more uppercase/wrong-looking buttons)
- Remove double-background wrapper on backup name text field
- Redesign Updates page as two-column layout: HyperFactions (left) and
  HyperProtect Mixin (right) with mirrored version info, shared
  "Check for Updates" button that checks both simultaneously
- Fix HPM detection using ProtectionMixinBridge instead of update checker
- Fix "Latest" showing "-" when up-to-date (now shows current version)
- Add backup type filter dropdown (All/Hourly/Daily/Weekly/Manual/Migration)
- Move Updates and Mixin config sections adjacent in server tab

* fix: standardize action bar sizing to match zone settings pattern

Match button height (32px), bar height (40px), and Label spacers
from admin_zone_settings.ui across all admin GUI action bars:
config editor (narrow/standard/wide), backups pagination, and
updates action bar.

* docs: add admin GUI features to changelog
#102)

Respect world config WorldMap settings (#96) and add BetterMap compatibility (#97).

- Inherit WorldMapSettings from vanilla generator instead of hardcoding
- Skip disabled worlds (WorldMapSettings.DISABLED sentinel)
- Per-world generator instances with configurable overrides (settingsOverrides)
- BetterMap detection via Class.forName with auto/always/never config
- Dual-layer player visibility: setPlayerMapFilter + HiddenPlayersManager
- Admin GUI: settings overrides, Respect World Config, BetterMap Compat
- Live settings reapply on config save (no restart needed)
- Consolidated registration through WorldMapService with delayed init
- Sentry error reporting for all worldmap catch blocks
- Test fixes for PlayerPower record and PlayerStorage interface changes

Closes #96, Closes #97
…le (#104)

Move the claim color overlay to render after the fluid/water color
application in the world map rendering pipeline. Previously, the water
tint was applied last, effectively erasing the claim overlay in ocean
biomes. Now claims render on top of the fully-rendered water, making
them clearly visible regardless of water depth.

Closes #90
* chore: remove unused imports and fix volatile field in SentryIntegration

- Remove unused MessageUtil import from AdminSubCommand and AdminEconomyHandler
- Remove unused UUID import from TreasuryCommandHandler
- Make SentryIntegration.initialized volatile for thread safety
- Replace System.err.println in EventBus with ErrorHandler.report

* fix: route all error handling through Sentry via ErrorHandler

Convert Logger-only catch blocks across the codebase to use
ErrorHandler.report(), which logs to console AND sends to Sentry.
Covers platform, managers, integrations, storage, worldmap, GUI,
migrations, territory, and update packages.

Informational warnings (not in catch blocks) are intentionally
left as Logger.warn calls.

* docs: update changelog, README, and internal docs for v0.12.0

- Add missing changelog entries: SimpleClaims/FactionsX importers,
  BetterMap compatibility, i18n localization, ocean claim visibility fix
- Update README feature tables: importers, config version, admin GUI
  status, localization, GUI page count
- Update all 12 docs/ version headers to 0.12.0
- Add SimpleClaims and FactionsX sections to data-import.md
- Add V6->V7 and V7->V8 to migration table
- Add admin GUI pages to gui.md (ConfigPage, BackupsPage, UpdatesPage)
- Add ZoneMobClearManager to managers.md
- Add BetterMap compatibility to integrations.md
- Add import subcommands to commands.md admin tree

* docs: update CurseForge description for v0.12.0

- Replace What's New section with v0.12.0 features (i18n, admin GUI
  pages, SimpleClaims/FactionsX importers, BetterMap, ocean fix)
- Update data import references to include all 4 importers
- Update GUI page count from 65+ to 70+
- Update JitPack version to v0.12.0

* chore: bump version to 0.12.0

* fix: correct CurseForge description inaccuracies

- Fix zone flag count: 50 -> 51 (verified against ZoneFlags.ALL_FLAGS)
- Fix Integration flags category: was listing removed flags (command
  blocking, fluid spread, map visibility), now lists actual flags
  (gravestone access, show on map, essentials homes/warps/kits)
- Fix GUI page count: 76 -> 70+ (67 actual page classes)
- Add missing Core Features: faction economy with upkeep system,
  localization (10 languages)
- Remove Sentry from public-facing description (dev-only feature)
- Convert integrations section from nested lists to tables for
  easier maintenance as the list grows
- Also fix zone flag count in README (50 -> 51)

* fix: additional accuracy corrections from code verification

- Fix HyperProtect-Mixin hook count: 27 -> 28 (verified SLOT_ constants)
- Remove "Command blocking in zones" from README (not yet implemented)
…ig persistence (#106)

* refactor: centralize supported locales list in HFMessages as single source of truth

* feat(api): add language control API — setPlayerLanguage, getPlayerLanguage, getSupportedLocales

* feat(api): add chat color customization API — granular setters, bulk setChatColors, getChatColors

* fix(events): publish FactionCreateEvent and FactionClaimEvent (were defined but never fired)

* feat(events): add FactionUnclaimEvent, FactionRelationEvent, FactionRenameEvent, FactionHomeEvent

- FactionUnclaimEvent with UNCLAIM/DISBAND/OVERCLAIM/DECAY reasons
- FactionRelationEvent published from acceptAlly, setEnemy, setNeutral
- FactionRenameEvent published from 3 commands + 5 GUI pages (NAME/TAG/DESC/COLOR)
- FactionHomeEvent published from FactionManager.setHome()

* feat(api): add ChatManager, EconomyAPI, JoinRequestManager accessors and extended queries

Adds getFactionPowerStats, getFactionClaimCount, getFactionCount,
isFactionRaidable, getPlayerRelation, getFactionClaims convenience methods.

* feat(events): add Cancellable interface and cancellable pre-events

- Cancellable interface with setCancelReason for custom denial messages
- EventBus.publishCancellable() for short-circuit cancellation
- Pre-events: FactionCreatePreEvent, FactionDisbandPreEvent,
  FactionMemberPreEvent (JOIN), FactionClaimPreEvent,
  FactionRelationPreEvent, FactionHomePreEvent
- Pre-event classes also created for FactionRenamePreEvent (wiring deferred)
- All pre-events fire after validation but before state changes

* feat(api): add saveConfig and reloadConfig for persisting runtime changes

* fix(tests): resolve 53 pre-existing test failures

- Add ConfigManager.initTestDefaults() for test environments
- Initialize ConfigManager with defaults in all manager/protection tests
- Set allowWithoutPermissionMod=true for tests (no permission mod present)
- Fix FactionTest color default assertion ("f" → "#FFFFFF")
- Fix ClaimManagerTest home chunk coordinate (block 80 → 160 for chunk 5)
- Fix ClaimManagerTest buildIndex rebuild to recreate managers
- Fix ProtectionCheckerTest ally build permissions (enable allyBreak/allyPlace)
- Disable getDenialMessage test (requires Hytale I18nModule on test classpath)

* docs: update API reference with language, chat colors, events, pre-events, config persistence

- Add Language/i18n section (setPlayerLanguage, getPlayerLanguage, getSupportedLocales)
- Add Chat Color Customization section (granular + bulk setters, getChatColors)
- Add Configuration section (saveConfig, reloadConfig)
- Add 3 new manager accessors (ChatManager, EconomyAPI, JoinRequestManager)
- Add extended queries (getFactionPowerStats, getFactionClaimCount, etc.)
- Add 4 new post-events (FactionUnclaimEvent, FactionRelationEvent, FactionRenameEvent, FactionHomeEvent)
- Add Cancellable Pre-Events section with all 7 pre-event types
- Update Economy API to use new getEconomyAPI() accessor
- Update examples throughout
* feat: essentials integration — API convenience methods, zone flag, and teleport event

Add HyperFactionsAPI convenience methods for faction home queries and zone
flag checks so HyperEssentials can use stable API methods instead of direct
Faction class reflection:
- hasFactionHome(UUID), getFactionHomeWorld(UUID), getFactionHomeCoords(UUID)
- getFactionHomeCooldownRemaining(UUID)
- isZoneFlagAllowed(String, double, double, String)

Add ESSENTIALS_BACK zone flag alongside existing ESSENTIALS_HOMES/WARPS/KITS
for controlling /back teleport in zones. Defaults to allowed in both safe and
war zones.

Add FactionHomeTeleportEvent fired when a player teleports to faction home
(both instant and warmup-completed), enabling HyperEssentials to subscribe
via EventBus for back location tracking without coupling.

* feat(events): complete event coverage — 16 new events across all systems

New post-events:
- CombatTagEvent (TAGGED/EXPIRED/CLEARED), CombatLogoutEvent
- PlayerTerritoryChangeEvent (territory entry/exit)
- PlayerPowerChangeEvent (DEATH/KILL/NEUTRAL_KILL/REGEN/COMBAT_LOGOUT/ADMIN)
- FactionChatEvent (FACTION/ALLY channels)
- FactionTransactionEvent (treasury operations)
- TeleportCancelledEvent (MOVED/DAMAGE/COMBAT_TAGGED/MANUAL)
- FactionInviteEvent, FactionJoinRequestEvent (CREATED/ACCEPTED/DECLINED/EXPIRED)
- ZoneCreateEvent, ZoneRemoveEvent

New cancellable pre-events:
- CombatTagPreEvent — prevent combat tagging
- FactionChatPreEvent — filter/block faction chat messages
- FactionTransactionPreEvent — block treasury transactions
- FactionHomeTeleportPreEvent — cancel /f home teleports
- FactionUnclaimPreEvent — prevent manual unclaims

Wired into: CombatTagManager, PowerManager, ChatManager, EconomyManager,
ClaimManager, TeleportManager, InviteManager, JoinRequestManager,
ZoneManager, TerritoryNotifier, TerritoryTickingSystem, HomeSubCommand

Updated API docs with complete event reference organized by system.
Audit all docs against actual codebase and fix stale counts, missing
sections, and outdated references across 11 files.

CHANGELOG: add missing #106 (API expansion) and #107 (essentials
integration) entries. Architecture: update to 480 classes, 16 managers,
~46 subcommands, ~76 GUI pages, add missing packages (messages/,
economy/, importers). Config: migration chain v1→v8, add V7→V8 docs.
Protection zones: 57 flags with new pve_damage, interaction flags
(mount_use, light_use, npc/crate flags), transport mount_entry, and
essentials integration flags. Commands: remove nonexistent
AdminSentryHandler. Managers: add ChatHistoryManager to index and init
order. Storage: version and importer updates. API: JitPack v0.12.0.
README: remove Sentry rows, add BetterMap/HyperEssentials integrations,
update all counts. CurseForge: reduce per-bullet emoji density while
keeping section headers and semantic indicators.
* feat: per-world max claims and World Settings API

Add maxClaims per-world setting to limit how many claims a faction can
hold in a specific world. Null/0 = use global limit, >0 = hard cap.
Enforced in both claim and overclaim flows.

Add thread-safe World Settings API for external plugins to register,
query, and remove per-world settings programmatically with upsert
semantics and immediate persistence.

- WorldSettings record: 5th param maxClaims (Integer, nullable)
- WorldSettingsResolver: volatile + copy-on-write for thread safety
- ConfigManager: registerWorldSettings/removeExternalWorldSettings
- ClaimManager: WORLD_MAX_CLAIMS_REACHED + per-world check
- HyperFactionsAPI: 4 new world settings methods
- Admin commands: maxclaims support in set/info/list
- Localized messages in all 10 locales (20 .lang files)
- Documentation: config, api, commands, managers

* feat: add maxClaims to admin config world settings GUI

Add integer stepper for maxClaims in the world override expanded
settings panel. Supports increment/decrement buttons and direct
numeric input. Value of 0 = use global limit (stored as null).

* fix: pass world claim limit to locale placeholders and warn on login

Fix {0} placeholder not being filled in world_max_claims messages across
all 5 call sites (claim command, overclaim command, dashboard, chunk map).

Add login warning for officers/leaders when their faction exceeds any
per-world claim limit — existing claims are preserved (soft cap) but
officers are notified to voluntarily unclaim excess territory.

- Make ClaimManager.countFactionClaimsInWorld() public
- Add ConfigManager.getWorldsConfig() getter
- Add world_overclaimed locale key (all 10 languages)
Add 7 per-event color settings to AnnouncementConfig with admin GUI
color pickers, replacing hardcoded broadcast colors in
AnnouncementManager. Add 6 new API methods to HyperFactionsAPI for
zone queries (getZone, getZoneByName, getAllZones, getZonesByType) and
hardcore power queries (isHardcoreMode, getFactionHardcorePower).
Line-by-line verification of every doc file against source code.
Fixes wrong method signatures, enum values, default values, class
types (records vs classes), constructor parameters, flag counts,
permission nodes, placeholder defaults, zone defaults, migration
descriptions, file paths, and navigation flows. Adds missing content
including undocumented API methods, GUI pages, config fields,
protection systems, and interaction types.
@derrickmehaffy derrickmehaffy added bug Something isn't working enhancement New feature or request labels Mar 19, 2026
@derrickmehaffy
derrickmehaffy merged commit 515d265 into main Mar 19, 2026
@derrickmehaffy
derrickmehaffy deleted the releases/0.12.0 branch March 19, 2026 03:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] Admin GUI: Runtime Config Editor

1 participant