Install, staff-command, permission, editor and integration reference for server operators. For what players see and can click (text, images, leaderboards, triggers) see the Scuffed Holograms gameplay guide.
- Plugin version: 1.9.9 (plugin name
ScuffedHolograms)
Holograms are drawn with packets and virtual entities rather than saved world objects. The plugin adds three kinds of real world objects when needed: invisible click-zone NPCs for holograms with click actions (removed on shutdown and swept every 30 seconds), carrier entities for particle-effect holograms, and light blocks for ambient light. Everything is created and edited in a built-in GUI. There is no global config file; each hologram carries its own settings.
Requirements
| Plugin | Version | Type |
|---|---|---|
| Hytale server | ≥ 0.7.0-pre.0, < 0.8.0 | Required |
| EndlessLeveling | ≥ 7.7.3 | Optional: {el_*} placeholders, leaderboards from Endless Leveling ranks, EL_PLACEMENT models, quest chains |
| LuckPerms | ≥ 5.5 | Optional: per-rank trigger chance, trigger cap and a blanket "no triggers" node |
| PlaceholderAPI | any | Optional: %name% tokens in text and actions |
| TaleQuests | any | Optional: quest provider for the QUEST_CHAIN action mode |
| RPGLeveling | any | Optional: {rpg_*} placeholders |
| ScuffedHologramsData | generated | Asset pack the plugin writes itself (see below) |
The plugin has no hard dependencies. PlaceholderAPI, TaleQuests and RPGLeveling are detected at runtime by class presence and are not listed in the manifest. The Endless Quests API shipped with Endless Leveling is used the same way.
Install notes
- Drop the jar in
mods/. On first boot it createsmods/ScuffedHolograms/and, next to it, the generated asset packmods/ScuffedHologramsData/(font glyph sheets and the world-map marker icons). - To enable that pack the plugin writes
Mods→Zbeve:ScuffedHologramsData→Enabled: trueinto the serverconfig.json, unlessDefaultModsEnabledis already true. It then tries to register the pack live. If that fails it logs a one-time notice and the map markers become active after the next planned restart. The plugin itself keeps loading either way. - Do not start the server with
--disable-file-watcher. Image holograms depend on the file watcher to reach clients, and/sch menuprints a red warning when the flag is present. - A copy that was not obtained through its distributor refuses to start and logs an
[SH-License]line. - Each hologram stores the name of the world it was placed in and is shown only to players in that world.
Admin & Staff Commands
The base command is /scuffedholograms, alias /sch. Every subcommand is gated by the admin check described under Permissions. tptoholo, sendchat and cleanimages can also be run from the console.
| Command | Description |
|---|---|
/sch menu | Open the management GUI. If you are holding a hologram with the tool, opens that hologram's editor instead. Refused while your client is still refreshing assets. |
/sch tool | Give yourself the Hologram Tool (runs give <you> SH_HologramTool as console). |
/sch tptoholo <player> <hologram> | Teleport an online player to a hologram's current position, across worlds. The destination is read when the command runs, so moving the hologram moves the portal. Meant for trigger actions. |
/sch sendchat <player> <message> | Send a chat message to one online player. The message is the rest of the line; surrounding double quotes are stripped. If it contains colour syntax (below) it is parsed, otherwise it is shown in blue. Meant for trigger actions. |
/sch cleanimages | Console only, with no players online. Deletes every uploaded image that no hologram uses. See Images. |
There are no commands for reloading or resetting caps. Use the GUI Reload button and the cap-reset modes below.
Permissions
Holograms do not use one permission node per command. Instead one function decides whether someone is a hologram admin. It is used by every /sch subcommand, the Hologram Tool and the GUI. The console always passes. A player passes if any of these is true:
| Check | Detail |
|---|---|
Member of a group named OP, admin, owner, staff or moderator | Case-insensitive, read from the server permission module. |
Vanilla OP assignment | Read directly from the standard provider, so /op self still counts after a restart on a LuckPerms server. |
Permission node scuffedholograms.admin | Grants hologram management only. Use it for staff who should not be full admins. |
Permission node hytale.command.op.add, hytale.admin or hytale.operator | Any holder, including wildcard holders, counts as a hologram admin. |
Any failure inside the check denies access.
Hologram actions can run commands as the console, so anyone who passes this check can build a hologram that runs any console command. Grant scuffedholograms.admin accordingly.
Player-side nodes (LuckPerms)
These need LuckPerms. They only change how triggers behave for a player or group.
| Node / meta key | Type | Effect |
|---|---|---|
scuffedholograms.trigger.allow | Permission | When explicitly set to false, the player can use no hologram trigger at all. Unset means no effect. |
scuffedholograms.trigger.probability | Meta, number | Multiplier on every action's chance, clamped to 0 to 10, default 1.0. Ignored for a hologram where a matching per-permission override sets its own probability. |
scuffedholograms.trigger.cap | Meta, integer ≥ 0 | Replaces the hologram's per-player use cap. 0 is unlimited. Ignored where a matching override sets a cap. |
Per-hologram access lists use any permission string you choose (see Triggers and permissions). They resolve through the server permission module, which routes through LuckPerms when it is installed.
Hologram Tool
Item id SH_HologramTool. It is a Legendary-quality item with an on-screen legend. Using it needs the admin check.
| Input | Effect |
|---|---|
| Primary (left click) | Aim at a hologram within 25 blocks to grab it. It follows your aim at the distance it was grabbed from (up to 20 blocks). Click again to release and save the new position. |
| Secondary (right click) while holding a hologram | Delete it. The first click arms the delete, a second click within 2 seconds confirms. |
| Ability 1 input | Rotate by 15 degrees (the other direction while crouching). |
| Use input | Pitch by 15 degrees (the other direction while crouching). |
| Pick input | Cycle the billboard mode. |
Rotating a Center or Horizontal hologram, or pitching a Center one, switches it to Fixed first (not for particle-effect holograms). Walk-in triggers are paused while a hologram is held. Scale up and down actions exist in code but are not bound to the tool.
The management GUI
/sch menu opens three tabs.
Holograms tab
- Lists all holograms eight to a page, sorted by name, with a search box and a Near Me filter (same world, within 32 blocks).
- Create buttons: New Text, New Image, New Model, New Particle and Leaderboard. A new hologram is placed at your position, about 2.5 blocks up (2 for particles), in your current world. Names are cleaned to letters, digits,
_and-; a clash gets a_1,_2suffix. - Per row: Edit, Copy (creates
<name>_copy), Del (asks "Sure?" first) and a checkbox. - Folders group holograms: New Folder, then tick holograms and use Move to Folder or Move Out. Folders do not nest.
- The Leaderboard button cycles through four built-in templates, one per click:
leaderboard(Endless Leveling rank),leaderboard_kills,leaderboard_playtime,leaderboard_joins. Each creates a ten-line ranking hologram.
A new text hologram starts with three sample lines (gold title, two-colour line, gradient line) in the default font.
Combat Text tab
Replaces vanilla floating damage numbers server-wide. See Combat text below.
Settings tab
- Debug logging toggle. Not saved; it resets on restart.
- Give me one (the Hologram Tool) and Reload. Reload saves pending edits, re-reads all hologram files and delivers new image files in memory.
- Language dropdown, Import All (see Importing) and an About card.
Editing a hologram
Opening a hologram shows a Settings tab (display, effects, schedule, map marker and light) and a Triggers + Perms tab that opens a wider separate page. BACK saves and returns to the list. SAVE & CLOSE saves, refreshes particle assets and closes.
Content type
A hologram is one of these. Switching the content type replaces the lines.
| Type | Contents |
|---|---|
| Text | One to 15 lines. The line editor offers four line types: Text, Image, Spacer and Model. |
| Image | A single image line. |
| Model | A single model line. |
| Particle effect | No lines; a single particle system. |
Settings tab fields
| Field | Default | Range / notes |
|---|---|---|
| Name | key | Rename. Cleaned to a-zA-Z0-9_-. |
| Mode | Glyph | Glyph draws text with the bundled bitmap fonts and supports colours and placeholders. Nameplate uses plain engine text with no colour codes or placeholders. |
| Renderer (text) | Particle | Particle or Entity. See Performance. |
| Font | scuffed | Applies to every text line; each line can also pick its own. |
| Scale (text) | 1.0 | 0.01 to 30 |
| Scale (image) | 1.0 | 0.01 to 30 |
| Spacing | 0.55 | 0 to 5 blocks between lines |
| Billboard | Center | Center, Fixed, Horiz |
| Yaw / Pitch | 0 | Degrees in the GUI. Stored in the file in radians. Switching to Fixed copies your current viewing direction. |
| View Dist | 80 | 8 to 200 blocks |
| Update Int | 600 | 20 to 6000. One unit is 0.2 seconds, see Placeholders. |
| Pos | placement | Per-axis ±0.1 nudges, Teleport to hologram and Teleport hologram here (puts it 1.5 blocks above you). |
| Visibility schedule | Off | From hour and To hour, 0 to 24, against the world's in-game hour. 0..24 or equal values mean always visible. A range like 22..4 wraps midnight. |
| World map marker | Off | Icon sh-pin (default), sh-dot, sh-star, sh-diamond, sh-heart, sh-shop; optional label (falls back to the hologram name). Shown on the map of the hologram's world regardless of the schedule or view distance. On builds after 1.9.9, a hologram whose access list has its Scope set to Visibility shows its marker only to players who pass the list; up to 1.9.9 every player gets the marker. |
| Ambient light | None | Hex colour, snapped to the nearest of six preset light blocks. See Effects. |
| Access control | Off | Permission list and scope. See Triggers and permissions. |
Lines
Each line has its own editor: type, text, font, colours, animation, variants, offsets and (for images and models) scale. Lines can be reordered, duplicated and deleted. The line limit is 15 per hologram.
| Line type | Notes |
|---|---|
| Text | Colour syntax, placeholders, font, animation, variants, per-segment colours. |
| Image | Picks an image from the library. Per-line scale and a Sharp edges toggle. |
| Spacer | Empty vertical gap. Height defaults to 0.15. |
| Model | A model asset id, EL_PLACEMENT:<n>, or a mirrored player look. Scale, gear and offsets. |
Per-line X offset and Z offset shift a line sideways without moving the hologram.
Colour and formatting syntax
| Syntax | Result |
|---|---|
&0 to &9, &a to &f | Legacy colours (&c red, &a green, &b aqua, and so on). |
&r | Reset to the default colour. |
&#RRGGBB | Hex colour from here on. |
<#RRGGBB>text</> | Hex colour for the wrapped text. This is the stored form. |
<gradient:#RRGGBB,#RRGGBB>text</gradient> | Per-character gradient between two colours. |
<rainbow>text</rainbow> | Per-character rainbow. |
&k, &l, &m, &n and &o are dropped without output: bold, italic and underline are not supported. The same syntax works in /sch sendchat.
The line editor works on plain text. Colour is applied through up to 8 segments per line: each segment is a character range with a Solid, Gradient or Rainbow colour. Line animations and segments cannot be combined; turning on an animation is refused while segments exist.
Animations and variants
| Option | Behaviour |
|---|---|
Animation SCROLL | Shows a window of up to 20 characters that scrolls through the line. |
Animation TYPEWRITER | Types the line out and pauses before restarting. |
Animation RAINBOW | Cycles a rainbow over the whole line. |
| Variants | A list of alternative texts that rotate in order. Needs at least two variants and an interval of 1 to 3600 seconds (0 disables). Every viewer sees the same variant at the same time. |
Animated lines strip colour markup and force the Entity renderer.
Fonts
Built-in fonts are scuffed (default), minecraftunicode and press_start_2p. Drop a .ttf or .otf into mods/ScuffedHolograms/fonts/ and restart to add more; the file name, lowercased and cleaned, becomes the font name. The font sheet of a font that no hologram uses is removed at an empty-server boot (see Performance), and a font chosen later shows as the default font until the next such boot.
Placeholders
{name} or {name:argument} in text lines, variants and action commands. Names are case-insensitive. An unknown placeholder is left as typed.
| Placeholder | Resolves to | Per viewer |
|---|---|---|
{player} | Viewer's name | Yes |
{uuid} | Viewer's UUID | Yes |
{world} | Name of the world the viewer is in. Builds up to 1.9.9 print the first 8 characters of the world's id instead | Yes |
{online} | Players online on this server | No |
{time} | Server clock, HH:mm | No |
{date} | Server date, yyyy-MM-dd | No |
{x} {y} {z} | Viewer's rounded coordinates. Actions only; in display text they stay literal. | n/a |
{el_level} {el_prestige} | Best level and prestige across the viewer's profiles | Yes |
{el_xp} | Viewer's XP | Yes |
{el_class} | Primary class id, or None | Yes |
{rpg_level} {rpg_xp} {rpg_class} {rpg_class_tier} | RPGLeveling values | Yes |
{top:<stat>:<rank>} | Name of the player at that rank in a leaderboard stat | No |
{top:<stat>:<rank>:value} | That player's score, no decimals | No |
{top:<stat>:<rank>:prestige} and :level | That player's el_prestige / el_level stat | No |
The {el_*} placeholders exist only when EndlessLeveling is installed, and {rpg_*} only with RPGLeveling.
{top} returns --- for an empty rank (or 0 with :value, :prestige or :level), and ??? for malformed arguments.
PlaceholderAPI tokens use percent syntax, for example %player_name%. SH resolves its own {...} first, then runs the result through PlaceholderAPI. PAPI tokens always make the line per-viewer and also work inside action commands. Braces always belong to SH and percent signs to PAPI. See the PlaceholderAPI guide for the expansions the Endless mods provide.
Refresh timing
The renderer runs on a 200 ms tick. Update Int is counted in those ticks, not in server ticks, so the default of 600 refreshes about every 120 seconds, the minimum of 20 is 4 seconds and the maximum of 6000 is 20 minutes. On builds up to 1.9.9 the editor hint reads "20 ticks = 1s", which does not match this; later builds show the real timing. The interval governs placeholders and EL_PLACEMENT models; variants and animations update on their own cadence.
Leaderboards
Stats live in mods/ScuffedHolograms/leaderboards/<stat>.json as UUID → number maps, with display names cached in _names.json. Flushed every 60 seconds and on shutdown.
| Stat | Source |
|---|---|
joins | +1 on each connect |
playtime | Minutes, added when the player disconnects |
el_level, el_prestige, el_xp | Endless Leveling, synced every 30 seconds and 3 seconds after a join |
el_rank | prestige × 100000 + level, the sort key for the Endless Leveling board |
rpg_level, rpg_xp | RPGLeveling, synced every 30 seconds |
kills | Used by the leaderboard_kills template, but the plugin never records it, so that ranking stays empty. |
On a network where Endless Leveling shares a database, SH reads EL's own network leaderboard so every server shows the same ranking, including offline players. If EL has no such view, SH ranks only players seen on this server.
Models can show a ranked player: set a model line to EL_PLACEMENT:<n> (1 to 1000) and it renders whoever holds that place in el_rank, re-checked at the hologram's Update Int. The GUI offers a picker with the current top players. The player's look is cached in player_appearances.json when they log in and refreshed every 30 seconds while online, so someone who has never joined stays invisible until they do. Appearances are shared between servers when Endless Leveling's shared storage backend is active.
Images and GIFs
- Supported files: PNG, JPEG, BMP and GIF (up to 100 GIF frames). Use the image panel or line editor to Load from URL, or drop files into
mods/ScuffedHolograms/images/and click Refresh. - URL loading: HTTP(S), up to 5 redirects, 8 second connect and 15 second read timeouts, 50 MiB maximum. The image is staged first; click Refresh to deliver it to clients. The name comes from the URL file name, cleaned to
a-zA-Z0-9._-. - Images can be renamed from the editor; every hologram that uses the image is updated.
- Sharp edges gives an image a hard-alpha texture. Turn it on if a soft-edged image pulses ("heartbeat"); edges look slightly rougher.
- Render mode per image: Particle (default, sharper, uses particle slots) or Entity (model based, no flicker, supports glow, tint and VFX).
- Images are scaled to a resolution cap before delivery: 1024 px on the long edge, dropping to 512 px once the library holds more than 11 images. The cap does not return to 1024 until the library shrinks to 8 images or fewer. The cap is stored in
imagecap.txt. Hologram world size is not affected by the cap. - The client has a hard texture budget. Too many large images can crash clients, which is why the library is capped and unused images are cleaned.
- Boot cleanup: on a boot with no players online, images that no saved hologram uses are deleted, source file included. It is skipped if no hologram is loaded, if no hologram uses any image, or while players are online. Images registered by other mods through the API are kept (see API).
/sch cleanimagesdoes the same cleanup on demand from the console. On builds up to 1.9.9 it also deletes images that other mods registered through the API (they return when the owner mod registers them again); later builds keep them, the same as the boot cleanup.
Models
A model line takes any model asset id (browse and search in the GUI, or type an id). Presets: Mannequin and My Model.
- My Model copies your current look, including a custom player skin and cosmetic attachments, as a snapshot stored in the hologram. It keeps working when you are offline.
- Gear: Held Item copies the item in your hand onto the model; My Armor copies your worn armour; Clear removes both.
- EL_PLACEMENT:n shows a leaderboard placement (above).
- Model scale is 0.01 to 30. Glow, tint and VFX apply only to model and image lines.
Effects
| Effect | Options |
|---|---|
| Accent particle | A decorative particle on a text or image hologram: None, Fire, Heal, Spark, Crown, Legend, Snow, Death, or a custom particle system id. Scale 0.01 to 30 and an optional hex tint. |
| Particle effect hologram | Pick any particle system from a searchable list. Default MagicPortal. Scale 0.01 to 30, optional tint, and a respawn cycle (automatic by default; minimum 0.5 seconds when set). |
| Entity glow | RED, ORANGE, GOLD, GREEN, CYAN, BLUE, PURPLE, WHITE |
| Body tint | FIRE_FADE, ICE_GLOW, TOXIC, ROYAL, SUNSET, OCEAN, SHADOW, ANGELIC |
| VFX overlay | PORTAL, FREEZE, BURN, POISON, GHOST, DARK, STONESKIN, EPIC_GLOW, CROWN, EMPOWERED, DASH, TRINKET, CREATIVE |
| Interact sound | CRYSTAL, GEM, TELEPORT, FIRE, PORTAL. Plays at the hologram for the player who triggers it. |
| Bob float | On/off, speed 0.5 to 5.0 |
| Down origin | By default lines stack downward from the hologram's anchor point. On, they grow upward from it. |
| Ambient light | Places a real light block at the hologram. The colour snaps to one of six presets (warm, white, red, green, blue, purple) with a fixed radius of 8, so the radius field has no visible effect. Not placed if the target block is occupied. Removed when the hologram goes away. Switching a text hologram to Entity renderer sets a white light when none is set. |
Triggers and permissions
Opened with Triggers + Perms. A hologram has one action list and one trigger mode.
Trigger mode
| Mode | Fires when |
|---|---|
INTERACT (default) | A player clicks it (aimed within 6 blocks) or uses the interact prompt shown over it. The click box is sized from the hologram and can be enlarged with Interaction Box Padding (0 to 20 per axis, default 0). |
COLLISION | A player enters the hologram's collision box once. Padding per axis defaults to 0.5 and ranges 0 to 20. Leaving and re-entering fires again. |
The interact prompt shows for creative-mode players only if "visible to NPCs" is enabled for them.
Actions
Each action is a command (leading / optional) with:
| Field | Default | Notes |
|---|---|---|
| Type | CONSOLE | CONSOLE runs as the server console. PLAYER runs it as the clicking player with their permissions. |
| Chance | 100 | 1 to 100. In ROLL mode it is a relative weight. |
| Delay | 0 | 0 to 300 seconds. A pending delay is lost on restart or if the player has left. |
| Quest id | blank | Used in QUEST_CHAIN mode. |
Placeholders ({player}, {uuid}, {x}, {y}, {z}, {online}, {time}, {date}, {world}, EL, PAPI) are resolved before the command runs. Template buttons fill the input with notify {player} …, sch sendchat {player} …, tp {player} 0 100 0, give {player} item_id, a UUID message, a teleport-to-hologram picker that writes sch tptoholo {player} <key>, and a quest picker.
Action mode
| Mode | Behaviour |
|---|---|
ALL (default) | Every action rolls its own chance; several may fire. |
ROLL | Exactly one action fires, picked by weight. |
CHECKLIST | One action per trigger in order for each player, wrapping at the end. The position is saved per player. |
QUEST_CHAIN | Fires the first action whose quest is NOT_STARTED or IN_PROGRESS and skips completed ones. Actions with no quest id fire as filler. When all are done, the chain end mode applies. Without a ready quest provider it behaves like CHECKLIST. |
QUEST_CHAIN chain end: STOP (default, nothing), LOOP (first action again) or LAST (last action forever). Quest ids are routed to TaleQuests or the Endless Quests API. If a quest id is blank and the command is quest npc <player> <id>, the id is taken from the command.
Limits
| Setting | Default | Notes |
|---|---|---|
| Max triggers per player | 0 (unlimited) | Shared between click and walk-in. The count is spent before chances are rolled, so a failed roll still uses a trigger. |
| Cap reset mode | NEVER | NEVER permanent, RESTART cleared at startup, DAILY cleared 24 hours after that player's last trigger, ONJOIN cleared when the player joins. |
| Cooldown (all holograms) | 2 s | 0 to 3600. Per player, blocks every hologram for that player. |
| Self cooldown (this hologram) | 0 s | 0 to 3600. Per player, this hologram only. |
| Click rate limit | 1.5 s | Fixed, per player across all holograms. |
Counts persist in triggercounts.json (also holds CHECKLIST positions), flushed every 60 seconds and on shutdown. Cooldowns are memory-only and persist across a player's reconnects but not a restart. There is no command to reset a player's count: stop the server and edit or delete the file, or change the reset mode. Deleting a hologram clears its counts. Interact triggers tell the player about cooldowns and caps; walk-in triggers stay silent about cooldowns.
Access control
| Setting | Default | Notes |
|---|---|---|
| Restrict access | Off | Master toggle. On with an empty list still means no restriction. |
| Permissions | empty | Any-pass: holding any one node is enough. Use any permission string, for example ranks.vip. |
| Scope | Interact only | Interact only hides nothing but blocks triggers. Visibility also hides the hologram from players who fail the check. |
Denied clicks on a hologram with an active list are silent so a click cannot reveal hidden holograms. A permission-module error denies a trigger but leaves a hologram visible.
Per-permission overrides
A list ordered by priority; the first entry whose permission the player holds applies. Each entry is independent:
| Field | Effect |
|---|---|
| Allow (A) | true passes the player even if they are not in the access list; false blocks them. Unset falls through to the access list. |
| Probability (P) | A flat 0 to 100 percent that replaces every action's chance for matching players. |
| Cap (C) | Replaces the per-player cap. 0 is unlimited. |
When no override matches, the LuckPerms meta keys above apply.
Combat text
Off by default. The Combat Text tab has an enable toggle, three presets, font size (20 to 200), duration (0.2 to 3.0 seconds) and a colour picker. Click Save to apply; no restart is needed. Turning it off removes the override and restores vanilla numbers. Reset applies the Vanilla preset and keeps the feature on.
| Preset | Font size | Colour | Duration |
|---|---|---|---|
| MapleStory (default) | 85 | #FFAA1E | 0.9 s |
| Vanilla | 48 | white | 0.4 s |
| Minimal | 64 | #DCDCDC | 0.35 s |
Settings are stored in combattext_settings.json; the generated asset is combattext_runtime/CombatText.json.
Importing
If either source is found the Settings tab shows how many holograms it detected and an Import button:
| Source | Files read |
|---|---|
| FancyHolograms | mods/FancyHolograms/holograms.fh, with images from mods/FancyHolograms/images |
| HydroHologram | mods/HydroHologram/holograms.dat, with images from mods/HydroHologram/images |
Imported holograms get the key imported_<name> and their images are copied with the same prefix. Colour codes are converted to the SH syntax and text uses the default font. Everything stays editable. Images are delivered in memory, so importing is safe with players online.
Language
The Settings tab has a language dropdown with 24 languages: en, de, fr, es, it, pt, nl, pl, ru, uk, cs, sk, hu, ro, lt, sv, da, tr, id, vi, zh, ja, ko, th. It translates the GUI labels; missing keys fall back to English. Files are in mods/ScuffedHolograms/lang/<code>.json; bundled translations are copied there only if missing, so your edits survive updates. The chosen language is stored in lang/active.txt.
Data & storage
Everything is under mods/ScuffedHolograms/ unless noted.
| Path | Contents |
|---|---|
holograms/<key>.json | One file per hologram, written atomically (.json.tmp then rename). Dirty holograms are saved about every 20 seconds, on every GUI save and on shutdown. |
images/ | Image library (source files) |
image_aliases.json | Display names chosen when renaming images |
imagecap.txt | The last chosen image resolution cap |
bundled-images.tsv | Images registered by other mods through the API |
fonts/, fontcache/ | Custom font files and generated glyph cells |
leaderboards/ | Stats (see Leaderboards) |
triggercounts.json | Per-player trigger counts and CHECKLIST positions |
player_appearances.json | Look snapshots for EL_PLACEMENT |
combattext_settings.json, combattext_runtime/ | Combat text |
lang/ | Translations and active.txt |
mods/ScuffedHologramsData/ | Generated asset pack (glyph sheets, map marker icons) |
Transient API holograms are never written to disk. Any file marked transient is deleted at boot.
Server options
These are JVM system properties, set on the server start line with -D.
| Property | Default | Effect |
|---|---|---|
scuffedholograms.autoCleanImages | true | false disables the boot cleanup of unused images. |
scuffedholograms.autoCleanFonts | true | false keeps the glyph sheet of every font. |
scuffedholograms.image.maxTextureDim | unset | Forces the image resolution cap. Accepted range 64 to 2048; other values are ignored. |
Performance notes
- Static text without placeholders or animation is baked once and sent as particles shared by all viewers. A text line with a placeholder, a per-viewer value, a PAPI token, an animation, or the Entity renderer uses entities that update in place. Images and models always have their own render path.
- Particle rendering is sharper at distance but uses client particle slots. Entity rendering is lighter on the server and the network. Prefer Entity for busy spawn areas with many holograms, or if clients hit the particle limit.
- Per-viewer placeholders are resolved for each nearby viewer. Raise Update Int and lower View Dist on crowded holograms.
- Collision holograms are checked every 50 ms for nearby players. Use them sparingly.
- Deleting image or font assets while players are connected forces every client to rebuild its asset atlases, which can black out a client. That is why the cleanups only run at boot with nobody online. New images added through the editor, Refresh or the API are delivered in memory without a rebuild. Custom fonts are generated at startup.
- Click-zone NPCs, particle carriers and light blocks are real world objects. Leave click actions and lights off holograms that do not need them.
Integrations
| Plugin | Use |
|---|---|
| EndlessLeveling | {el_*}, the el_* leaderboards, EL_PLACEMENT, the Endless Quests provider; also stops Endless Leveling from adding a level nameplate to the click-zone NPC |
| LuckPerms | Meta-based chance and cap, the allow node, per-permission overrides |
| PlaceholderAPI | %token% placeholders in text and actions |
| TaleQuests, Endless Quests | Quest state for QUEST_CHAIN holograms |
| RPGLeveling | {rpg_*} placeholders and stats |
| ScuffedCosmetics | Costumes and wings are captured by My Model |
API for other mods
com.zbeve.scuffedholograms.api.ScuffedHologramsApi (API_VERSION 2) lets another mod ship PNG images in its own jar and display them as image holograms that exist only in memory. Every method is public static, uses JDK types only, is safe from any thread, never throws and returns false on failure (logged under [SH-API]).
| Method | Purpose |
|---|---|
boolean isReady() | True once the plugin has started |
boolean registerBundledImage(String owner, String imageName, byte[] png) | Import an image. Same bytes again is a no-op; new bytes under the same name replace it. |
boolean isImageReady(String imageName) | Texture delivery check |
boolean prepareTransientImage(String imageName, float yawDegrees, double viewDistance) | Register shared definitions. Required before showing. |
boolean isTransientImageReady(String imageName, float yawDegrees, double viewDistance) | Read-only readiness check |
boolean showTransientImage(String key, String worldName, double x, double y, double z, String imageName, float scale, float yawDegrees, double viewDistance) | Create or update a hologram |
void removeTransient(String key) | Remove one |
void removeTransientPrefix(String prefix) | Remove every transient hologram whose key starts with the prefix |
Rules:
- Image names are lowercase, 1 to 64 characters from
a-z 0-9 _ -, must not end in_sharp,_atlasor_frameN, and must not clash with another owner's image or a different user image. Prefix them with your mod id. Static images only, up to 16 MiB. The same resolution cap as uploads applies. - Registered images are exempt from the boot cleanup while their owner registered them this boot or the last.
- Transient holograms are never saved, survive
/schreloads, are removed with their world, and cannot take the key of a saved hologram. A copy made in the GUI is a normal saved hologram. yawDegreesfinite gives a Fixed hologram at that yaw;NaNgives a Center hologram.scale≤ 0 means 1 and is capped at 100.viewDistance≤ 0 means 80 and is capped at 1024. Keys are 1 to 128 characters.
To call it without a compile dependency, add "Zbeve:ScuffedHolograms": ">=1.9.1" to OptionalDependencies in your manifest so SH loads first, and bind the methods with MethodHandle after checking API_VERSION == 2. Register your images in setup, retry prepareTransientImage until it returns true, then call showTransientImage only once isTransientImageReady is true.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| "Hologram assets are still refreshing" | A player just applied images. The menu reopens by itself. |
| Image holograms never appear | The server was started with --disable-file-watcher. Remove the flag. |
Text shows {x} or {name} literally | {x}, {y}, {z} are action-only. Other names are unregistered, or the integration (EL, RPG) is not installed. |
%name% stays literal | PlaceholderAPI is not installed or the expansion is unknown. |
| Placeholders refresh slowly | Update Int is in 0.2 second ticks; the default is about 2 minutes. |
| New font shows as the default font | Its sheet is delivered at an empty-server boot. Restart once with nobody online. |
| "I am OP but cannot open the menu" | Under LuckPerms, grant scuffedholograms.admin or add the user to a group named admin. With debug logging on, the [SH-PERM] log lines show each check. |
| Walk-in hologram never fires | Trigger mode is Interact, a cooldown or cap applies, or the player lacks the permission. |
Plugin refuses to start with an [SH-License] message | The jar is not a distributed copy. |
First-install notice about ScuffedHologramsData | Map markers start after the next restart; nothing else is affected. |