TESSERA

systems 01

Resource pack

Tessera builds the pack itself on every boot and every /tessera reload, then hashes it and serves it over an embedded HTTP server.

What generation does

  1. Writes pack.png into plugins/Tessera/pack/.
  2. Writes the built-in glyph textures into assets/minecraft/textures/font/ and assets/tessera/textures/font/.
  3. Writes pack.mcmeta with the pack format and a description.
  4. Writes the font provider list, built from the glyph registry, into assets/minecraft/font/default.json and assets/tessera/font/default.json.
  5. Writes the pause menu banner into assets/minecraft/lang/ for every client language, and the transparent bossbar sprites when the top banner hides its bar. See Glyphs and HUD.
  6. Zips the whole pack/ folder into plugins/Tessera/tessera-pack.zip.
  7. Applies anti-unzip protection to the archive.
  8. Recomputes the SHA-1 and hands the file to the pack server.

Your own assets are not touched by steps 1 to 5. Lang files you add are merged: only the menu.game key is set. Put item and block models, textures and sounds into plugins/Tessera/pack/assets/ and they are zipped along with everything else. Models are not generated for you: custom_model_data on an item is a number you also have to use in your own model file.

Hosting

pack:
  server:
    enabled: true
    host: "0.0.0.0"
    port: 8085
    domain: "localhost:8085"
    external_url: ""

The server binds to host and port and serves the archive at:

http://<domain>/tessera-pack.zip

domain is what players are sent, so it has to be a host they can reach from outside: a public IP or a domain name, with the port. The port has to be open in your firewall. Set external_url to a CDN or file host if you would rather not serve it yourself. The pack is still built and protected locally.

Downloads are rate limited per IP: rate_limit.max_requests_per_ip downloads within rate_limit.cooldown_minutes, after which the counter resets. Responses carry the SHA-1 in an X-Checksum-SHA1 header. /tessera pack prints the current URL and hash.

Delivery to players

pack:
  server:
    required: true
    kick_on_decline: true
    kick_on_fail: false
    auto_apply:
      enabled: true
      delay_ticks: 10

With auto_apply.enabled, joining players are prompted after delay_ticks. The prompt text, the loading title and subtitle, the success messages and the two kick screens all come from the messages.pack section of config.yml. /tessera pack apply <player|all> re-sends the prompt on demand.

Protecting the player while it loads

pack:
  protect_player:
    enabled: true
    lock_movement: true
    blindness: true
    timeout_seconds: 45

While the client is downloading, the player can be blinded and slowed so they do not walk off a cliff during the freeze. The effects are cleared once the pack is applied or fails.

Anti-unzip

pack:
  protection:
    protect_from_unzip: true
    level: 2

The archive is rewritten so that common desktop unpackers refuse it while the Minecraft client, which reads the central directory, still loads it.

LevelWhat it does
1Clears CRC and size fields in the local file headers.
2Level 1 plus path traversal markers in the local headers.
3Level 2 plus non-standard central directory attribute flags.

Protection makes extraction harder but does not encrypt anything. A determined user can still read the archive.

Importing an existing pack

Drop a .zip into plugins/Tessera/imports/ and run:

/tessera pack import              # every zip in the folder
/tessera pack import mypack.zip   # one file
/tessera pack import https://...  # download first

The importer unpacks the archive, merges textures, models, sounds and fonts into the pack folder, optionally generates item and block YAML templates for what it finds, rebuilds and protects the archive, and re-prompts online players. With pack.importer.auto_watch the folder is polled every watch_interval_seconds and new zips are ingested on their own.

Import runs off the main thread. It prints a summary with texture, model and generated template counts, the elapsed time and the new hash.

Pack format

pack.mcmeta is written with the format from pack.meta.pack_format, default 34, and declares support for formats 34 to 48.