TexturepackManager » 1.20 - 1.21.8 | NEW | 25% OFF icon

TexturepackManager » 1.20 - 1.21.8 | NEW | 25% OFF -----

Add custom items, blocks, and furniture in minutes. Supports Geyser/Bedrock.




25% off release sale!

[​IMG]

[​IMG]

• blocks

• items

• furniture

• emojis

• sounds
  • files → bell_ding.yml
  • sound-files → bell folder → ding1.ogg & ding2.ogg

• totems
  • (totem images directly here)

• resourcepack_style → (upload vanilla-style resourcepack folders/files here)

[​IMG]

• data → where all internal working files are stored

• packs → where the final resource pack .zip is stored

[​IMG]

[​IMG]

[​IMG]

Emojis:
[​IMG]
(these emojis are not included - just examples)

Menu GUI:
[​IMG]
(these items are not included - just examples)

Pages:
1. Items
2. Blocks
3. Furniture

(The compass is a search feature)

Fancy server restart: (/restarting)
Fully configurable broadcast messages:
[​IMG]

When the timer hits 3 seconds, this plays for all online players:
[​IMG]

Migrate from ItemsAdder:

1 simple command:
/tpm migrate ItemsAdder ->
[​IMG]
Includes:
1. A live action bar progress update message
2. Click-able chat messages to re-build and re-apply the updated pack.

Default furniture texture:

[​IMG]

[​IMG]
Code (YAML):
# =========================================================
# TexturepackManager — Default Configuration
# =========================================================
# Tips:
# • If you're self-hosting the pack, enable pack.application_methods.local
#   and make sure 'host' and 'port' are reachable by your players.
# • If you're using an external CDN link, enable pack.application_methods.public_url
#   and set pack.public_url (+ optional pack.public_url_sha1).
# • Place any "vanilla-style" resource pack inputs in pack.resourcepack_style_dir.
# • Final built pack is written to pack.user_packs_dir as pack.zip.
# =========================================================

pack
:
  # -----------------------------
  # Local pack hosting (self-host)
  # -----------------------------
  host
: "0.0.0.0"                 # IP address to bind the internal web server to
  port
: 8000                       # Port for the internal web server
  url_path
: "/texturepackmanager/pack.zip"   # HTTP path where pack.zip is served

  # -----------------------------
  # Startup behavior
  # -----------------------------
  build_on_start
: true             # Build the resource pack on plugin startup
  auto_apply_on_join
: true         # Send/apply the pack automatically when players join

  # -----------------------------
  # How players receive the pack
  # -----------------------------
  application_methods
:
    local
: true                   # Serve the pack from the internal web server (host/port/url_path)
    public_url
: false             # If true, use public_url (below) instead of local hosting

  # -----------------------------
  # Paths & external URLs
  # -----------------------------
  resourcepack_style_dir
: "resourcepack_style"   # Source folder for your RP inputs (sounds, models, lang, etc.)
  user_packs_dir
: "packs"                       # Output directory where pack.zip is written
  public_url
: "https://download.mc-packs.net/pack/TEXTURE-PACK-ID.zip"   # CDN/external URL to pack.zip (if application_methods.public_url = true)
  public_url_sha1
: "SHA1-ID"                     # Optional SHA-1 hex of the pack for client caching/integrity

  # -----------------------------
  # Download protection
  # -----------------------------
  protection
:
    enabled
: true                 # Gate downloads with a short-lived signed token
    secret
: "CHANGE-ME-32B"       # 32+ byte random secret; CHANGE THIS IN PRODUCTION
    ttl_seconds
: 90               # Token lifetime in seconds
    bind_to_ip
: true               # Bind token to the requester's IP (prevents sharing)
    block_non_game_requests
: true # Reject requests that don't look like a Minecraft client
    rate_limit
:
      enabled
: true
      max_requests
: 3             # Burst size
      period_seconds
: 2           # Burst window
      cooldown_minutes
: 30         # Temporary block after exceeding limits

# =========================================================
# In-game Menu / Debugging
# =========================================================
menu
:
  debug
:
    items
: true                   # Show Items tab in the debug menu
    blocks
: true                   # Show Blocks tab in the debug menu
    furniture
: true               # Show Furniture tab in the debug menu

  # Show dynamic lore on category tabs (uses {category}, {total}, {page}, {pages})
  tab_button_lore_enabled
: true
  tab_button_lore
:
   - ""
    - "&7Category
: &f{category}"
    - "&7Items
: &f{total}"
    - "&7Page
: &f{page}/{pages}"

  # Optional: lore on Prev/Close/Next buttons
  nav_button_lore_enabled
: false
  nav_button_lore
:
   - ""
    - "&7Page
: &f{page}/{pages}"

# =========================================================
# Integrations / Extras
# =========================================================
settings
:
  # If true and ModelEngine is installed, assets found in its folders are pulled
  # into the build pipeline (e.g., textures/models) when compiling the pack.
  ModelEngine
: true

# =========================================================
# Command: /restarting
# =========================================================
restarting
:
  # default length of the countdown if /restarting is used with no args
  duration_seconds
: 10

  # broadcast every second; each line is sent as-is (supports & colors and :emoji: tokens)
  # {seconds} placeholder is replaced with remaining time
  broadcast_lines
:
   - ":server-icon:"
    - "                          &fThe server will be"
    - "                           &frestarting in &b{seconds}s&f!"
    - ""

  # run console commands when the remaining seconds equals the map key.
  # If a command contains %player%, it is run once per online player with %player% replaced.
  # If it doesn't contain %player%, it's run once globally.
  run_at
:
    "3"
:
     - "tpm playtotemanimation %player% restarting"
    "0"
:
      # choose one: "restart" (Paper) or "stop" (Spigot). Keep only the one you use
      - "restart"

[​IMG]
Code (YAML):
# =========================================================
# TexturepackManager — Messages
# Color codes: use '&' (e.g., &a, &b, &7). Hex (&x&F&F...) if your chat supports it.
# Placeholders: shown as {like_this}. Do not rename placeholders.
# =========================================================

# Common prefix prepended to most messages
prefix
: "&bᴛᴘᴀᴄᴋᴍᴀɴᴀɢᴇʀ &7» &f"

# Simple meta/info
meta
:
  # {version} -> plugin version string
  version
: "&bTexturepackManager &7version &f{version}"

# -------------------------------------
# Usage / Help text shown to players
# -------------------------------------
usage
:
  # Multiline help for /tpm help
  # {version} -> plugin version; {command} -> base command alias (e.g., /tpm)
  help-usage
:
   - "&bTexturepackManager &7v{version}"
    - "&7Commands:"
    - "&8- &e{command} help &7Show this help"
    - "&8- &e{command} menu &7Open the GUI"
    - "&8- &e{command} give &7(id|block:|furniture:) (player) (amount)"
    - "&8- &e{command} playtotemanimation (player) (id)"
    - "&8- &e{command} pack &7(build|reload|url|apply [player])"
    - "&8- &e{command} validate &7Check current pack files for errors"
    - "&8- &e{command} sounds &7(list|reload|play|ping|debug)"
    - "&8- &e{command} migrate &7Migrate from other TP plugins"
    - "&8- &e{command} version &7Display the plugin version"
    - ""
    - "&8- &e/restarting &7Restart the server in style!"

  # One-line usage hints for subcommands (used when args are wrong/missing)
  # {prefix} is auto-expanded from the top-level prefix
  pack
: "{prefix}&e/tpm pack (build|reload|url|open)"
  pack_apply
: "{prefix}&e/tpm pack apply (player)"
  give
: "{prefix}&e/tpm give (item) (player) (amount)"
  migrate
: "{prefix}&e/tpm migrate (itemsadder)" # oraxen & nexo support planned
  sounds_root
: "{prefix}&e/tpm sounds &7(list|reload|play|ping|debug)"
  sounds_play
: "{prefix}&e/tpm sounds play &7(id) (player) [volume] [pitch] [category]"
  sounds_debug
: "{prefix}&e/tpm sounds debug &7(id)"
  play_totem
: "{prefix}&e/tpm playtotemanimation (player) (id)"

# -------------------------------------
# Pack build / reload / apply feedback
# -------------------------------------
pack
:
  # Shown when a build starts
  building
: "{prefix}Building pack..."
  # {url} -> current pack URL (local or public)
  built
: "{prefix}Pack &abuilt&f: &e{url}"
  reloaded
: "{prefix}Pack &ereloaded&f: &e{url}"
  reload_start
: "{prefix}Reloading config and rebuilding pack..."
  url_value
: "{prefix}Pack URL: &e{url}"
  url_none
: "{prefix}No pack built yet. Use &e/tpm pack build"
  open
: "{prefix}Open this URL for the pack: &e{url}"
  # {player} -> target player; {error} -> error string
  apply_ok
: "{prefix}Applied pack to &b{player}"
  apply_fail
: "{prefix}&cFailed &fto apply: &c{error}"
  http_fail
: "{prefix}&cFailed &fto (re)start HTTP host: &c{error}"
  # {ok} -> #successes, {fail} -> #failures, {url} -> pack URL
  apply_summary
: "&aApplied &fpack to &b{ok}&f player(s)&7, &ffailures: &c{fail}&f. URL: &e{url}"

# -------------------------------------
# Reload/build failures
# -------------------------------------
reload
:
  # {error} -> error message
  fail
: "{prefix}&cRebuild failed: &f{error}"

# -------------------------------------
# Validation messages
# -------------------------------------
validate
:
  start
: "{prefix}Validating resource pack..."
  # {files} -> number of files validated
  ok
: "{prefix}Validation &apassed. &fFiles: &b{files}"
  # {count} -> number of errors found
  fail_header
: "{prefix}Validation found &c{count} error(s)&f:"
  # {msg} -> each error line
  fail_line
: "&7- {msg}"

# -------------------------------------
# Give command
# -------------------------------------
give
:
  # {n} -> amount, {item} -> resolved item display
  ok
: "{prefix}Gave &b{n}x {item} &fto &b{player}"
  # {kind} -> item type (e.g., block/furniture), {id} -> id, {shown} -> name shown
  ok2
: "{prefix}Gave &b{n}x &7[{kind}] &f{id} &7(&f{shown}&7) to &b{player}"
  # {item} -> input token user tried
  nf
: "{prefix}Unknown item id &b{item}"

# -------------------------------------
# Migration messages
# -------------------------------------
migrate
:
  # {path} -> scanned directory, {flavor} -> migration flavor (itemsadder, etc.)
  start
: "{prefix}Scanning &e{path} &ffor &b{flavor}&f..."
  started_async
: "{prefix}Migration running in the background. Watch your action bar for progress."
  done_sync
: "{prefix}Migration &adone&f. Check console for details."
  # {files} -> file count, {errors} -> error count
  report
: "{prefix}Scan complete: &b{files} &ffiles, &c{errors} errors&f. &7(See console for details.)"
  path_missing
: "{prefix}Could not find migration path: &e{path}"
  path_not_dir
: "{prefix}Not a directory: &e{path}"

# -------------------------------------
# Totem animation
# -------------------------------------
totem
:
  # {player} -> target player
  ok
: "{prefix}Played totem animation for &b{player}"

# -------------------------------------
# Sounds command feedback
# -------------------------------------
sounds
:
  # {count} -> number of definitions loaded
  reloaded
: "{prefix}Sounds reloaded. Loaded: &f{count}"
  # {count} -> #missing; list items below with 'missing_line'
  missing_header
: "{prefix}&cMissing .ogg files (&f{count}&c):"
  # {id} -> sound id shown per line
  missing_line
: "&7- &f{id}"
  none
: "{prefix}&eNo custom sounds defined."
  # {count} -> number of sounds
  list_header
: "{prefix}&7Sounds (&f{count}&7):"
  list_line
: "&7- &f{id}"
  # {player} -> who received it
  ping_ok
: "{prefix}Played vanilla ping to &b{player}"
  unknown
: "{prefix}Unknown sound id: &e{id}"
  # {id}, {player}, {vol}, {pitch}, {cat}
  play_ok
: "{prefix}Played &f{id} &7to &f{player} &7(vol=&f{vol}&7, pitch=&f{pitch}&7, cat=&f{cat}&7)"
  # Debug info when checking a specific id
  debug_header
: "{prefix}&7Sound debug: &f{id}"
  # {val} -> explanatory text/value
  debug_defined
: "&7- Defined: &f{val}"
  debug_missing
: "&7- OGG missing: &f{val}"
  debug_hint
: "{prefix}&8If no audio: rebuild/apply the pack and ensure the id is in sounds.json with a valid .ogg."

# -------------------------------------
# Emojis
# -------------------------------------
emojis
:
  none
: "{prefix}No emojis found."

# -------------------------------------
# Errors / Generic replies
# -------------------------------------
errors
:
  unknown_sub
: "{prefix}Unknown subcommand."
  player_nf
: "{prefix}Player &cnot &ffound."
  no_perm
: "{prefix}You don't have permission: &f{perm}"
  players_only
: "{prefix}Players only."
  bad_int
: "{prefix}Invalid number: &b{value}"
  no_players_online
: "{prefix}&cNo &fplayers are online."

[​IMG]

Placeholder Description / Usage
Code (Text):
TPM.plugin()
Returns the running TexturepackManager plugin instance (for advanced integrations).
Code (Text):
TPM.tokensToGlyphs(":heart: Hello")
Converts
Code (Text):
:token:
chat tokens to glyphs using the emoji font (sizes from
Code (Text):
emojis/emoji_sizes.yml
).
Code (Text):
TPM.items()
Entry point for item API (see methods below).
Code (Text):
TPM.blocks()
Entry point for block API (see methods below).
Code (Text):
TPM.furniture()
Entry point for furniture API (see methods below).
Code (Text):
TPM.font()
Entry point for emoji/font image helpers (see methods below).
Code (Text):
TPM.sounds()
Entry point for sound helpers (see methods below).
Code (Text):
TPM.totems()
Entry point for totem animation helpers (see methods below).
Code (Text):
TPM.currentPackUrl()
Returns the URL of the currently built pack, if any.
Code (Text):
TPM.currentPackSha1()
Returns the SHA-1 of the current pack, if any (may be
Code (Text):
null
when using public URL mode without a hash).
Code (Text):
TpmItems#get("sky_pick")
Returns
Code (Text):
Optional<TpmStack>
. Example:
Code (Text):
TPM.items().get("id").ifPresent(s -> s.give(player, 1));
Code (Text):
TpmItems#getItemStack("id")
Returns
Code (Text):
Optional<ItemStack>
ready to place in inventories.
Code (Text):
TpmItems#isCustom(itemStack)
True if the stack matches a TPM custom item (via Material + CustomModelData lookup).
Code (Text):
TpmItems#idOf(itemStack)
Best-effort reverse lookup of the custom item id from Material + CustomModelData.
Code (Text):
TpmStack#getId()
Returns the TPM item id used to create this stack.
Code (Text):
TpmStack#getItemStack()
Returns a cloneable Bukkit
Code (Text):
ItemStack
of this custom item.
Code (Text):
TpmStack#give(player, amount)
Convenience: gives the item to a player (sets amount and adds to inventory).
Code (Text):
TpmBlocks#place(location, "sky_ore")
Places a custom block at a location; returns true on success.
Code (Text):
TpmBlocks#isCustom(block)
True if the world block is managed by TPM (when available via BlockManager).
Code (Text):
TpmBlocks#idOf(block)
Returns the custom block id (if exposed by the BlockManager), otherwise
Code (Text):
null
.
Code (Text):
TpmFurniture#spawn(location, "chair_oak")
Spawns furniture; returns
Code (Text):
Optional<UUID>
of the spawned entity/controller.
Code (Text):
TpmFurniture#isFurniture(entity)
True if the entity is a TPM furniture instance (when supported by FurnitureManager).
Code (Text):
TpmFont#image("heart")
Returns a
Code (Text):
TpmFontImage
wrapper for an emoji (one-glyph image).
Code (Text):
TpmFontImage#getString()
Returns the single-character glyph to append into text strings.
Code (Text):
TpmFontImage#height()
Resolved render height for the emoji (from
Code (Text):
emoji_sizes.yml
, fallback 16).
Code (Text):
TpmFontImage#ascent()
Resolved ascent for the emoji (from
Code (Text):
emoji_sizes.yml
, fallback 12).
Code (Text):
TpmFontImage#isPresent()
True if the emoji exists (glyph mapped); false if unknown token.
Code (Text):
TPM.sounds().play(player, "bell_ding")
Plays a compiled TPM sound event to a player (via
Code (Text):
SoundService
).
Code (Text):
TPM.sounds().exists("id")
True if a sound id is registered/compiled.
Code (Text):
TPM.sounds().allIds()
Returns all loaded sound ids.
Code (Text):
TPM.playTotem(player, "level-up")
Triggers the totem animation using the custom model mapped to the given id. Requires that totem PNGs were compiled and assigned CMDs.
Code (Text):
ProtectedPackService#signedUrlFor(uuid, ip)
(If protection enabled) Builds a short-lived, IP-bound signed URL to the current
Code (Text):
pack.zip
. Used internally but available if you need a direct link.

Custom OP-Prison server:
Play.TheIslandsNetwork.com
(1.20.4 recommended)​

[​IMG]

The quickest way to get support for any of my resources
would be to join my Resource Discord.
» https://discord.gg/2vUqykD

Note »
Please DO NOT leave bad reviews for any issues
that you have. Please simply PM me or leave it
in the discussion tab. Thank you. (y)

That and reviews are highly appreciated! :alien:
Resource Information
Author:
----------
Total Downloads: 4
First Release: Sep 26, 2025
Last Update: Sep 26, 2025
Category: ---------------
All-Time Rating:
0 ratings
Find more info at discord.gg...
Version -----
Released: --------------------
Downloads: ------
Version Rating:
----------------------
-- ratings