Grims Client Checker is a small shared utility for Paper servers using Geyser and Floodgate. It identifies the client information available for each connected player and answers one question for other EGW plugins: should this player get a standard inventory menu or a touch-friendly menu? Players choose their menus once with /gcc menu, for every Grims plugin or one at a time, and the choice is saved.
Upgrading from 0.3.0. Upgrade if your phone players have to pick mobile menus by hand. 0.3.1 fixes that: phones and tablets get touch menus in AUTO. Saved choices and plugin integrations carry over unchanged.
Admin wiki
Installation
Requirements
- Paper 26.3
- Java 25
- Floodgate on the Paper server
- A working Geyser connection using
auth-type: floodgate
Steps
- Place
GrimsClientChecker-0.3.2.jarin the server'spluginsfolder. - Remove any older GrimsClientChecker plugin JAR so only one version remains.
- Do not install the
-apior-sourcesJARs on the server. - Restart the server normally, join, and run
/gcc check.
If Geyser runs on a proxy, configure Floodgate backend data forwarding so the Paper server receives Bedrock player details.
Admin wiki
Commands
The full command is /grimsclientchecker, alias /gcc.
| Command | Purpose |
|---|---|
/gcc check <player> | Detect an online player and privately show the result |
/gcc inspect <player> | Show an online player's cached detection |
/gcc refresh [player] | Detect again immediately; defaults to the sender |
/gcc stats | Show cache size and retention settings |
/gcc reload | Reload settings, clear old cache entries, and detect online players again |
All command output is private to the sender. Regular players cannot inspect another player or change anyone else's preference. Console may use /gcc check <player>.
The player commands, /gcc check and /gcc menu, are covered on the player wiki.
Admin wiki
Permissions
| Permission | Default | Purpose |
|---|---|---|
grimsclientchecker.check | Everyone | View your own detected details |
grimsclientchecker.menu | Everyone | Choose AUTO, CLASSIC, or MOBILE for every plugin or one plugin |
grimsclientchecker.admin | Operators | Inspection, refresh, statistics, and reload commands, and /gcc check <player> |
Admin wiki
Configuration
The generated configuration is stored at plugins/GrimsClientChecker/config.yml.
| Setting | Default | Behavior |
|---|---|---|
cache.online-seconds | 300 | Maximum age of an online snapshot before the next lookup detects again |
cache.offline-seconds | 60 | How long a valid snapshot may remain after logout; 0 deletes immediately |
cache.retain-only-touch-offline | true | Retain only touch profiles after logout |
cache.cleanup-seconds | 30 | How often unused expired entries are cleared |
logging.touch-joins | false | Optionally log touch joins to the console |
Restarting clears the detection cache. Expired information is never returned, and cache reads do not extend its lifetime. The plugin has no player-history database, packet listener, or repeating task per player.
Saved preferences
Players' /gcc menu choices are the only thing the plugin saves. They live in:
plugins/GrimsClientChecker/preferences.yml
Back this file up with the rest of your plugin data.
Admin wiki
Plugin Integration
Grims Client Checker publishes one shared service through Bukkit. An integrated plugin can ask for the current player's profile or simply ask whether that player should get a touch menu.
Integrated EGW plugins, such as Grims Player Shops, Grims Donation Center, and Grims Crops, do not detect clients themselves and follow the shared choice. A plugin must be integrated before its menus respond to /gcc menu.
- One shared service
- Per-plugin choices
- No detection in consumers
- Saved in one place
Admin wiki
Developer API
Setup
- Compile against
GrimsClientChecker-0.3.0-api.jarusingcompileOnly. The API did not change in 0.3.1, so the API JAR keeps its 0.3.0 name. - Do not shade or copy the API classes into the consuming plugin.
- Add
depend: [GrimsClientChecker]when integration is required, orsoftdependwhen your plugin works without it and keeps API references in a class that only loads when Client Checker is installed. - Ask for the menu decision when opening a menu, using the current online
Player. - Use the live player UUID rather than a separate ownership UUID, including for linked Floodgate accounts.
GrimsClientApi clients = getServer()
.getServicesManager()
.load(GrimsClientApi.class);
if (clients != null) {
boolean touch = clients.usesTouchMenu(player);
// touch: open the touch menu
// false: open the standard menu
}
Per-plugin choices
The answer already includes the player's saved choice for your plugin. Client Checker identifies the calling plugin, so profile(Player), menuLayout(Player), usesTouchMenu(Player), and cachedProfile(UUID) apply /gcc menu <plugin> before the all-plugins choice with no extra arguments.
savedMenuPreference(UUID) and saveMenuPreference(UUID, MenuPreference) read and save your plugin's own choice on the main thread. Use them once to move an older plugin-specific setting, as Grims Player Shops does for its former /gs ui choices. Do not store the returned layout against an account yourself.
Threading. Online detection calls belong on the main server thread. cachedProfile(UUID) is available for asynchronous read-only checks and returns empty when a snapshot is missing or expired.
Admin wiki
Detection Limits
Bedrock details are client-reported values supplied through Floodgate, not proof of physical hardware. Floodgate's input field is wrong on phones (Floodgate issue #430): Android reports keyboard and mouse, and iOS reports unknown. That is why AUTO trusts the reported device for phones and tablets and the reported input for everything else. /gcc check still shows the input Floodgate reported, with the line Phones and tablets get touch menus in AUTO; Floodgate often misreports their input.
Changing controls during one connection may not update the reported data. Reconnect before testing a different device or input method. Every join replaces the previous profile.
Java connections use Paper's protocol information and standard menus. Paper does not expose an exact Java release name, physical operating system, or input device through this lookup.
Client brand and mod hints
The checker can display reported brands such as Fabric, Forge, or NeoForge and any advertised network channels. These are hints, not a verified mod list. Clients may omit or spoof them, Geyser may report its own brand, and mods without advertised channels stay invisible.
An empty channel report means "unknown or none reported." It is never proof that the player has no mods installed.