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
- Writes
pack.pngintoplugins/Tessera/pack/. - Writes the built-in glyph textures into
assets/minecraft/textures/font/andassets/tessera/textures/font/. - Writes
pack.mcmetawith the pack format and a description. - Writes the font provider list, built from the glyph registry, into
assets/minecraft/font/default.jsonandassets/tessera/font/default.json. - 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. - Zips the whole
pack/folder intoplugins/Tessera/tessera-pack.zip. - Applies anti-unzip protection to the archive.
- 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.
| Level | What it does |
|---|---|
| 1 | Clears CRC and size fields in the local file headers. |
| 2 | Level 1 plus path traversal markers in the local headers. |
| 3 | Level 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.