tozanstwAssets icon

tozanstwAssets -----

Custom font assets, animated glyphs, PlaceholderAPI integration and built-in pack generation.



Installation

  1. Install PlaceholderAPI
  2. Install tozanstwAssets
  3. Start the server once
  4. Stop the server
  5. Place your textures under
    Code (Text):
    plugins/tozanstwAssets/textures/
  6. Create or edit
    Code (Text):
    assets.yml
  7. Edit
    Code (Text):
    config.yml
  8. Set your public pack-server IP or domain
  9. Start the server again
  10. Run
    Code (Text):
    /tstw zip
  11. 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
Code (Text):
assets.yml
.

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
Code (Text):
assets.yml
are commonly written without the
Code (Text):
.png
extension.

Example:
Code (Text):

path: font/twitteremojis/alarmclock
 
The plugin appends
Code (Text):
.png
automatically if it is missing.

Custom screen entries in
Code (Text):
config.yml
are commonly written with the
Code (Text):
.png
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
Code (Text):
assets.yml
.

If a player uses inline placeholders such as
Code (Text):
:asset_id:
, replacement only happens if:
- the player is OP, or
- the player has the required asset permission

How to use assets in text

Inline format:
Code (Text):

:asset_id:
 
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
Code (Text):
<#RRGGBB>
- standard
Code (Text):
&
color codes

Example:
Code (Text):

<#ffcc00>:tozanstwrank: &fServer Staff
 
PlaceholderAPI Support

Placeholder identifier:
Code (Text):

img
 
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
Code (Text):
:asset_id:
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
Code (Text):
.mcmeta
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:
Code (Text):

/tstw image
 
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
Code (Text):
:asset_id:
text in chat

The current layout stores up to 10 listed assets per page.

Built-in Resource Pack Generation

Use:
Code (Text):

/tstw zip
 
The plugin will:
  1. clear the previous generated pack folder
  2. create a fresh
    Code (Text):
    generated_pack
    directory
  3. write
    Code (Text):
    pack.mcmeta
  4. copy
    Code (Text):
    pack.png
    if present
  5. copy source textures into the output namespace
  6. split animated textures into frame files
  7. build
    Code (Text):
    assets/minecraft/font/default.json
  8. add spacing providers for offset characters
  9. write language override files
  10. add optional custom screen assets
  11. add optional UI-tweak files
  12. copy optional shader files from the plugin folder
  13. compress everything into
    Code (Text):
    pack.zip
  14. calculate a SHA-1 hash
  15. store the hash in config
  16. build a pack URL
  17. send the pack to online players

Pack Generation Feedback

During
Code (Text):
/tstw zip
, 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:
Code (Text):

tozanstw
 
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
Code (Text):
obf/
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:
Code (Text):

/pack.zip
 
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
Code (Text):
pack.zip
, 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
Code (Text):
force-pack
is enabled, the player is kicked
- if the pack download fails and
Code (Text):
force-pack
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
Code (Text):
languages
contains
Code (Text):
ALL
, 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
Code (Text):
shaders
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:
Code (Text):

/tstw
 
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

  1. sort images into folders first
  2. keep asset IDs short and predictable
  3. use category-based permission naming
  4. keep GUI assets separate from public chat assets
  5. keep large overlays in the
    Code (Text):
    guis
    folder
  6. regenerate the pack after each major texture change
  7. test animated assets separately
  8. test pack download from an external network, not just localhost
  9. test language override screens after every layout change

Practical Notes

- PlaceholderAPI placeholders return glyph output directly, while inline
Code (Text):
:asset:
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.
Resource Information
Author:
----------
Total Downloads: 4
First Release: Mar 16, 2026
Last Update: Mar 16, 2026
Category: ---------------
All-Time Rating:
1 ratings
Version -----
Released: --------------------
Downloads: ------
Version Rating:
----------------------
-- ratings