TexturepackManager » 1.20 - 1.21.10 | NEW icon

TexturepackManager » 1.20 - 1.21.10 | NEW -----

Migrate from ItemsAdder, Oraxen, and Nexo with one command + supports Geyser/Bedrock.




TexturepackManager is similar to:
ItemsAdder, Oraxen, and/or Nexo,
except TPM makes it INSANELY easy to
add custom textured items, blocks, & furniture.

You can also migrate from any 3 of
those plugins
to TPM in one command!
Does it get any easier? :unsure:

NOTE:
If you find an item/block pack that only works for one
of the above plugins, you can just migrate it to TPM.


[​IMG]
[​IMG]

TPM also supports Geyser/Bedrock exports
which NO other similar plugin does!

Have a suggestion? TPM has an active developer.
Let's make this plugin better!

[​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
# =====================================================================
# Quick start:
# • Self-host the pack: set pack.application_methods.local: true
#   and make sure host:port are reachable by players.
# • Use a CDN: set pack.application_methods.public_url: true and fill
#   pack.public_url (+ optional pack.public_url_sha1).
# • Put vanilla-style RP inputs (assets/, sounds.json, etc.) in
#   pack.resourcepack_style_dir. The final build is written as pack.zip
#   into pack.user_packs_dir.
# =====================================================================

update-check
:
  # Automatically check for plugin updates on SpigotMC.
  enabled
: true

  # Permission required to see the update notification.
  permission
: texturepackmanager.update

  # Message shown to admins when an update is available.
  # Placeholders: %latest% = latest version, %current% = your version.
  message
: "&bᴛᴘᴀᴄᴋᴍᴀɴᴀɢᴇʀ &e♦ &fA new version, &b%latest%&f, is available. You're running &e%current%&f."
 
  # Click-able message to go directly to the download link.
  button-text
: "&7[&b&lClick to Download&7]"

pack
:
  # -----------------------------
  # Local pack hosting (self-host)
  # -----------------------------
  host
: "0.0.0.0"                     # IP/interface to bind the internal HTTP server (0.0.0.0 = all)
  public_host
: "127.0.0.1"           # Your servers IP address
  port
: 8000                         # Port for the internal HTTP server
  url_path
: "/texturepackmanager/pack.zip"   # HTTP path where pack.zip is served (keep leading slash)

  # -----------------------------
  # Startup behavior
  # -----------------------------
  build_on_start
: true               # Build the resource pack when the plugin starts
  auto_apply_on_join
: true           # Automatically send/apply the pack when players join

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

  # -----------------------------
  # Paths & external URLs
  # -----------------------------
  resourcepack_style_dir
: "resourcepack_style"   # Source dir for vanilla-style inputs (assets/, models/, lang/, etc.)
  user_packs_dir
: "packs"                         # Output dir where pack.zip is written
  public_url
: "https://download.mc-packs.net/pack/TEXTURE-PACK-ID.zip"   # CDN/external URL (used when public_url=true)
  public_url_sha1
: "SHA1-ID"                     # Optional SHA-1 hex of the CDN file (improves caching/integrity)

  # -----------------------------
  # Download protection (local hosting only)
  # -----------------------------
  protection
:
    enabled
: true                     # Require short-lived, signed tokens to download pack.zip
    randomized-secret
: true           # Generate a strong random secret at runtime (recommended)
    secret
: ""                       # Only used if randomized-secret=false; set to a 32+ byte random string
    ttl_seconds
: 90                   # Token lifetime in seconds
    bind_to_ip
: false                 # Token bound to the requester's IP (limits sharing)
    block_non_game_requests
: false   # Reject requests that don't appear to be a Minecraft client
    rate_limit
:
      enabled
: false
      max_requests
: 3                 # Burst size
      period_seconds
: 2               # Burst window duration
      cooldown_minutes
: 30           # Temporary block after exceeding limits

  # -----------------------------
  # Gate the player until pack is applied
  # -----------------------------
  gate_until_applied
:
    enabled
: true                     # Master switch
    blackout
: true                   # Apply BLINDNESS (+ DARKNESS if available)
    disable_movement
: true           # Prevent movement while waiting
    invulnerable
: true               # Cancel incoming damage while waiting
    kick_if_declined
: false           # Kick players who decline the pack
    kick_message
: "&fYou &cmust &faccept the resource pack to play."
    timeout_seconds
: 60               # 0 = never lift; otherwise lift gate after N seconds even if not loaded

# =====================================================================
# 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

  # Tab button dynamic lore supports: {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 (uses same placeholders)
  nav_button_lore_enabled
: false
  nav_button_lore
:
   - ""
    - "&7Page
: &f{page}/{pages}"

# =====================================================================
# Integrations / Extras
# =====================================================================
settings
:
  # If true and ModelEngine is installed, its assets are merged into the build
  # (e.g., textures/models). Place your ModelEngine resource pack in its default
  # folder; TPM will auto-detect and merge.
  ModelEngine
: true

# =====================================================================
# Command: /restarting
# =====================================================================
restarting
:
  # Default countdown length when /restarting is used without args
  duration_seconds
: 10

  # Broadcast every second; supports & colors and :emoji: tokens
  # {seconds} is replaced with the remaining time
  broadcast_lines
:
   - ""
    - "                          &fThe server will be"
    - ":server-icon
:                     &frestarting in &b {seconds }s&f! "
    - "
"

  # Run console commands at specific second marks (keys below).
  # If a command contains %player%, it is run once per online player.
  # Otherwise, 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"
      # - "stop"

# =====================================================================
# Bedrock / Geyser export
# =====================================================================
bedrock
:
  enable
: false                       # If true, TPM also outputs a Bedrock-compatible .mcpack
  filename
: "bedrock_pack.mcpack"     # Output filename (written next to pack.zip)
  pack_name
: "TexturepackManager"     # Display name shown in Bedrock UI
  description
: "TPM auto-converted pack for Bedrock/Geyser"   # Display description

  # Optional static UUIDs. Usually leave these blank and TPM will auto-generate
  # stable values. If you set them, use valid v4 UUIDs.
  uuid
: ""
  module_uuid
: ""

  # Semantic version for the Bedrock manifest (manifest.json)
  version
:
    major
: 1
    minor
: 0
    patch
: 0

[​IMG]
Code (YAML):
# =====================================================================
# TexturepackManager — Messages
# =====================================================================

# 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 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 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 plugin version"
    - ""
    - "&8- &e/restarting &7Restart the server in style!"

  # One-line usage hints
  pack
: "{prefix}&e/tpm pack (build|reload|url|apply)"
  pack_apply
: "{prefix}&e/tpm pack apply (player)"
  give
: "{prefix}&e/tpm give (item) (player) (amount)"
  migrate
: "{prefix}&e/tpm migrate (itemsadder, nexo, oraxen)"
  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
:
  building
: "{prefix}Building pack..."
  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}"
  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}"
  apply_summary
: "&aApplied &fpack to &b{ok}&f player(s)&7, &ffailures: &c{fail}&f. URL: &e{url}"

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

# -------------------------------------
# Validation messages
# -------------------------------------
validate
:
  start
: "{prefix}Validating resource pack..."
  ok
: "{prefix}Validation &apassed&f. Files: &b{files}"
  fail_header
: "{prefix}Validation found &c{count} error(s)&f:"
  fail_line
: "&7- {msg}"

# -------------------------------------
# Give command
# -------------------------------------
give
:
  ok
: "{prefix}Gave &b{n}x {item} &fto &b{player}"
  ok2
: "{prefix}Gave &b{n}x &7[{kind}] &f{id} &7(&f{shown}&7) to &b{player}"
  nf
: "{prefix}Unknown item id &b{item}"

# -------------------------------------
# Migration messages
# -------------------------------------
migrate
:
  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."
  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
:
  ok
: "{prefix}Played totem animation for &b{player}"

# -------------------------------------
# Sounds command feedback
# -------------------------------------
sounds
:
  reloaded
: "{prefix}Sounds reloaded. Loaded: &f{count}"
  missing_header
: "{prefix}&cMissing .ogg files (&f{count}&c):"
  missing_line
: "&7- &f{id}"
  none
: "{prefix}&eNo custom sounds defined."
  list_header
: "{prefix}&7Sounds (&f{count}&7):"
  list_line
: "&7- &f{id}"
  ping_ok
: "{prefix}Played vanilla ping to &b{player}"
  unknown
: "{prefix}Unknown sound id: &e{id}"
  play_ok
: "{prefix}Played &f{id} &7to &f{player} &7(vol=&f{vol}&7, pitch=&f{pitch}&7, cat=&f{cat}&7)"
  debug_header
: "{prefix}&7Sound debug: &f{id}"
  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.

[​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:

[​IMG]


My other plugins

[​IMG] [​IMG] [​IMG] [​IMG]
Resource Information
Author:
----------
Total Downloads: 12
First Release: Sep 25, 2025
Last Update: Nov 16, 2025
Category: ---------------
All-Time Rating:
1 ratings
Find more info at discord.gg...
Version -----
Released: --------------------
Downloads: ------
Version Rating:
----------------------
-- ratings