Installation
- Install PlaceholderAPI
- Install tozanstwAssets
- Start the server once
- Stop the server
- Place your textures under
Code (Text):
plugins/tozanstwAssets/textures/
- Create or edit
- Edit
- Set your public pack-server IP or domain
- Start the server again
- Run
- Reconnect and test the pack
Folder Structure
Recommended layout:
Code (Text):
plugins/tozanstwAssets/
├─ assets.yml
├─ config.yml
├─ pack.png
├─ textures/
│ └─ font/
│ ├─ emojis/
│ ├─ twitteremojis/
│ ├─ logos/
│ ├─ ranks/
│ └─ guis/
└─ shaders/
Recommended category use:
-
emojis for general inline icons
-
twitteremojis for large emoji libraries
-
logos for branding assets
-
ranks for badges and role visuals
-
guis for large overlays, menu headers and special screen textures
How assets are defined
Assets are loaded from
.
Each top-level entry becomes a registered glyph with its own:
- id
- symbol
- scale ratio
- vertical position
- texture path
- optional permission
- GUI visibility setting
- optional menu behavior
Example:
Code (Text):
tozanstwrank:
permission: ranks
show_in_gui: true
path: font/ranks/tozanstwrank
scale_ratio: 9
y_position: 8
tozanstwbig:
permission: ranks
show_in_gui: true
path: font/logos/tozanstwbig
scale_ratio: 64
y_position: 8
minecraft_fire:
permission: emojis
show_in_gui: true
path: font/emojis/fire
scale_ratio: 9
y_position: 8
alarmclock:
permission: twitteremojis.alarmclock
show_in_gui: true
path: font/twitteremojis/alarmclock
scale_ratio: 9
y_position: 8
tozanstwassets:
permission: tozanstwassets.menu
show_in_gui: false
is_menu: true
path: font/guis/tozanstwassets
scale_ratio: 256
y_position: 13
Field Reference
- permission
Permission node required for inline replacement.
- show_in_gui
If true, the asset appears in the Assets Dictionary book.
- path
Path relative to:
Code (Text):
plugins/tozanstwAssets/textures/
- scale_ratio
Controls the bitmap font height written into the generated font provider.
- y_position
Controls ascent / vertical alignment.
- is_menu
Marks the asset as a menu-style glyph.
Path Handling Details
Standard asset entries in
are commonly written without the
extension.
Example:
Code (Text):
path: font/twitteremojis/alarmclock
The plugin appends
automatically if it is missing.
Custom screen entries in
are commonly written with the
extension already included.
Example:
Code (Text):
path: font/guis/esc_menu.png
Permissions
Admin permission
Code (Text):
tozanstw.admin
Text effect permissions
Code (Text):
tozanstw.user.text_effect.use.noshadow
tozanstw.user.text_effect.use.r
tozanstw.user.text_effect.use.w
tozanstw.user.text_effect.use.rw
tozanstw.user.text_effect.use.j
tozanstw.user.text_effect.use.rj
tozanstw.user.text_effect.use.b
Per-asset permissions
Each asset can define its own permission in
.
If a player uses inline placeholders such as
, replacement only happens if:
- the player is OP, or
- the player has the required asset permission
How to use assets in text
Inline format:
Examples:
Code (Text):
:tozanstwrank:
:tozanstwbig:
:minecraft_fire:
:alarmclock:
:alien:
:bacon:
Where inline formatting is applied
The plugin processes text in:
- player chat
- sign text
- anvil result names
- editable book pages
- editable book titles
Text Effect Tags
Supported tags:
Code (Text):
<noshadow your_text>
<r your_text>
<w your_text>
<rw your_text>
<j your_text>
<rj your_text>
<b your_text>
Exact internal color mappings:
Code (Text):
<noshadow text> -> <#4e5c24>text
<r text> -> <#e6fffe>text
<w text> -> <#e6fffa>text
<rw text> -> <#e6fbfe>text
<j text> -> <#e6fbfa>text
<rj text> -> <#e6f7fe>text
<b text> -> <#e6f7fa>text
Examples:
Code (Text):
<r Welcome>
<w Store>
<rw Crystal>
<j Mythic>
<rj Rare>
<b Common>
<noshadow Menu Title>
The tags are case-insensitive.
Hex and Color Code Support
The plugin supports:
- hex syntax in the form
- standard
color codes
Example:
Code (Text):
<#ffcc00>:tozanstwrank: &fServer Staff
PlaceholderAPI Support
Placeholder identifier:
Basic format:
Code (Text):
%img_<assetid>%
Examples:
Code (Text):
%img_tozanstwrank%
%img_tozanstwbig%
%img_minecraft_fire%
%img_alarmclock%
%img_alien%
%img_bacon%
If the requested asset is animated, PlaceholderAPI automatically returns the correct frame.
Important note about permissions
Inline
replacement checks the player’s asset permission.
PlaceholderAPI output itself returns the glyph directly.
Offset Placeholders
Format:
Code (Text):
%img_offset_<number>%
Examples:
Code (Text):
%img_offset_1%
%img_offset_2%
%img_offset_4%
%img_offset_8%
%img_offset_16%
%img_offset_32%
%img_offset_64%
%img_offset_128%
%img_offset_256%
%img_offset_-1%
%img_offset_-2%
%img_offset_-4%
%img_offset_-8%
%img_offset_-16%
%img_offset_-32%
%img_offset_-64%
%img_offset_-128%
%img_offset_-256%
These are useful for:
- precise alignment
- HUD layouts
- menu composition
- spacing tricks
- language overwrite positioning
Animated Asset Support
Animated assets are supported automatically.
An asset is treated as animated when:
- the PNG height is greater than its width
- the total height is evenly divisible by the width
Examples:
- 16x64 = 4 frames of 16x16
- 32x128 = 4 frames of 32x32
- 64x320 = 5 frames of 64x64
If an animation is detected:
- the plugin slices the frames during pack generation
- extra internal frame glyphs are assigned automatically
- PlaceholderAPI returns the active frame over time
Optional .mcmeta support
If a matching
file exists next to the PNG, the plugin reads its animation frametime.
If no frametime is provided, the default frame time is
2 ticks.
Assets Dictionary Book
Command:
This opens a written book called
Assets Dictionary.
The book:
- lists assets where
Code (Text):
show_in_gui: true
- shows the glyph
- shows the correct usage format
- adds a hover tooltip
- lets players click an entry to suggest the correct
text in chat
The current layout stores up to 10 listed assets per page.
Built-in Resource Pack Generation
Use:
The plugin will:
- clear the previous generated pack folder
- create a fresh
Code (Text):
generated_pack
directory
- write
- copy
if present
- copy source textures into the output namespace
- split animated textures into frame files
- build
Code (Text):
assets/minecraft/font/default.json
- add spacing providers for offset characters
- write language override files
- add optional custom screen assets
- add optional UI-tweak files
- copy optional shader files from the plugin folder
- compress everything into
- calculate a SHA-1 hash
- store the hash in config
- build a pack URL
- send the pack to online players
Pack Generation Feedback
During
, the player running the command receives a progress bossbar with stages such as:
- Initializing System
- Reading Textures
- Generating JSON Data
- Encrypting Assets
- Compressing Pack
After generation, the command reports:
- generated path
- final URL
- pack size
- approximate percentage of the 250 MB client limit
- number of online players who received the pack
Pack Namespace
Default namespace:
Generated textures are written under:
Code (Text):
assets/tozanstw/textures/
To change it:
Code (Text):
info:
namespace: yournamespace
Pack Icon and Metadata
Config example:
Code (Text):
pack:
format: 46
description: tozanstwAssets Custom Resource Pack
icon: pack.png
This controls:
- pack format
- visible pack description
- pack icon file copied into the generated pack
Texture Obfuscation
Config:
Code (Text):
pack-protection:
obfuscate: true
When enabled, generated texture files are written with randomized names under an
path inside the pack instead of keeping original readable file names.
ZIP Protection Options
Config:
Code (Text):
zip:
protect-file-from-unzip:
protection_1: true
protection_2: true
When enabled, the plugin injects additional fake or invalid file entries into the ZIP archive.
This is not a replacement for real security.
Use it carefully and test your final ZIP before public deployment.
Built-in Pack Server
Default config example:
Code (Text):
pack-server:
enabled: true
ip: 127.0.0.1
port: 8163
The generated pack is served from:
Join-time pack URLs are sent in the format:
Code (Text):
http://IP:PORT/pack.zip?v=randomvalue
Important Deployment Note
The default example config uses:
Code (Text):
ip: 127.0.0.1
That only works for local testing.
For real players, change it to:
- your public IP
- or your domain / reverse proxy target
and make sure the selected port is reachable from outside your machine.
Pack Hash Handling
After generating
, the plugin calculates its SHA-1 hash and stores it in config.
Stored value:
Code (Text):
pack-server.last-hash
If a valid stored hash exists, the plugin sends the resource pack with the hash included.
Join-time Pack Sending and Enforcement
Relevant config:
Code (Text):
pack-protection:
force-pack: true
kick-message: ...
fail-message: ...
success-message: ...
Behavior:
- on join, the pack is sent automatically
- if a player declines the pack and
is enabled, the player is kicked
- if the pack download fails and
is enabled, the player is kicked
- if the pack loads successfully, the configured success message is sent
Pack Server Protection
Config:
Code (Text):
pack-server:
protection:
block_non_game_requests: true
rate_limit:
enabled: true
max_requests: 3
period_seconds: 2
cooldown:
enabled: true
duration_minutes: 30
trigger_on_failed_times: 5
This includes:
- browser-style request blocking
- request rate limiting
- temporary cooldown after repeated failures
Custom Screen Assets
Config example:
Code (Text):
custom-screens:
enabled: true
esc_menu:
enabled: true
path: font/guis/esc_menu.png
scale_ratio: 256
y_position: 128
death_screen:
enabled: true
path: font/guis/death_screen.png
scale_ratio: 256
y_position: 16
Built-in screen IDs:
Code (Text):
esc_menu
death_screen
minecraft_lang_overwrite
The plugin can generate language files under:
Code (Text):
assets/minecraft/lang/
Config example:
Code (Text):
minecraft_lang_overwrite:
languages:
- ALL
entries:
menu:
game: " "
returnToGame: " "
sendFeedback: " "
reportBugs: " "
options: " "
playerReporting: " "
disconnect: ":offset_-3::offset_-256::esc_menu::offset_-256:"
quit: " "
gui:
advancements: " "
stats: " "
Supported inline replacements include:
Code (Text):
%esc_menu%
:esc_menu:
%death_screen%
:death_screen:
:offset_16:
:offset_-32:
If
contains
, the generator writes:
- en_us
- tr_tr
- en_gb
- de_de
- es_es
- fr_fr
- ru_ru
UI Tweak Options
Config example:
Code (Text):
ui-tweaks:
hide-bossbar: true
hide-scoreboard-background: true
hide-buttons: false
hide-bossbar
Generates transparent bossbar textures.
hide-buttons
Generates transparent widget button textures.
hide-scoreboard-background
Writes a shader override for
Code (Text):
rendertype_text_background
that discards the dark translucent text background.
Shaders Folder Support
If a
folder exists inside the plugin folder, the generator copies it into:
Code (Text):
assets/minecraft/shaders/
Action Bar HUD System
Config example:
Code (Text):
huds:
enabled: true
mana_bar:
enabled: true
type: STATUS
x_position_pixels: 10
player_stat_name: mana
min: 0
max: 10
images:
positive: mana_positive
half: mana_half
negative: mana_negative
A STATUS HUD:
- reads a numeric player stat
- converts that value into full icons
- adds one half icon if needed
- fills remaining slots with the negative / empty icon
Typical uses:
- mana bars
- stamina bars
- energy bars
- custom RPG resource displays
Developer note
The HUD renderer is included, but the actual stat values must still be set by your own server logic or integration.
Stat Manager
The internal stat manager stores float values per player and per stat name.
Typical stat names:
- mana
- stamina
- rage
- soul
- energy
- ammo
- heat
Admin Inventory
Running:
opens the main inventory GUI.
The menu listener is wired so that specific slot groups trigger:
- reload
- zip generation
- asset dictionary opening
Recommended Workflow for Large Asset Packs
- sort images into folders first
- keep asset IDs short and predictable
- use category-based permission naming
- keep GUI assets separate from public chat assets
- keep large overlays in the
folder
- regenerate the pack after each major texture change
- test animated assets separately
- test pack download from an external network, not just localhost
- test language override screens after every layout change
Practical Notes
- PlaceholderAPI placeholders return glyph output directly, while inline
replacement checks player permissions.
- Animation detection depends on texture dimensions, so make sure sprite strips are formatted correctly.
- The built-in pack server is practical for self-hosted workflows, but you still need proper public networking if real players will download from it.
- ZIP protection toggles are optional and should be tested carefully before public use.
- The pack generator is the heart of the workflow. After texture, config or language changes, regenerate the pack.