Links
Tags
Creators
Details
4.1.8
Compatibility
Changes
[4.1.8]
Notes panel in the Player Profile GUI, note system improvements.
Added
-
Notes tab in the Player Profile GUI: A third "Notes" tab has been added to the staff player profile manager, alongside "Profile" and "Stats".
- Lists all staff notes for the selected player with author, timestamp, and full text.
- Delete button (§c✗) on each note for immediate removal.
- Input field pinned at the bottom of the panel to add a new note without scrolling.
- Scrollable note list via scroll wheel or ▲/▼ buttons; the add area is always visible regardless of note count.
- Note text wraps to multiple lines — row height is calculated dynamically per note, no truncation.
- Newly added notes appear immediately in the list with a "§8new" indicator in place of the ID; the real ID is shown on the next GUI open.
- Edit button (§7✎) on each note loads its content into the input field; confirming the edit replaces the note server-side while preserving its position in the list.
- Cancel button appears while an edit is in progress.
-
PlayerNoteActionPacket(Client → Server): New packet handling add, delete, and edit note actions from the GUI. Validates staff permission server-side before any write. -
Notes sent with player data:
OpenPlayerProfileGuiPacket.PlayerDatanow carries the full note list (List<NoteEntry>) instead of just a count, so the GUI can display note content without a separate request.
Changed
- Note JSON filenames: Files are now named
PlayerName - UUID.jsoninstead of bareUUID.json. Existing files are migrated automatically on the next write. - Note sorting: Notes are sorted by ID in ascending order both in memory and in JSON files.
Fixed
- Note text overflow: Note rows now expand to fit their content. Text is word-wrapped using
Font.split()and the row height is computed from the wrapped line count; nothing is ever truncated. - Newly added notes not appearing: Notes added via the GUI now appear immediately with a temporary "new" label. Previously the GUI had to be closed and reopened to see the addition.
- ID gap after deletion: Note IDs are now reassigned to fill gaps after a deletion, so the next note takes the smallest available ID instead of always incrementing from the previous maximum.
Technical
OpenPlayerProfileGuiPacket.PlayerData—noteCount: Intcomplemented bynotes: List<NoteEntry>(new inner record:id,text,authorName,timestamp). StreamCodec updated accordingly.RequestOpenGuiPacket.buildPlayerData()— loads full note list fromNoteManagerand maps it toNoteEntryrecords.NetworkHandler— registersPlayerNoteActionPacket.PlayerProfileScreen— third tab, dynamic row heights, scroll by note index with pixel-accurate rendering, add/edit/delete flows, local optimistic updates.
Migration Notes
- No config changes required.
- Existing
UUID.jsonnote files inworld/data/rpessentials/notes/are renamed automatically on the next write for each player.
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:yJ9CnauQ:B9UX3V7h"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:yJ9CnauQ:B9UX3V7h"
}

