English
Configuration
The main configuration is plugins/EmakiStructure/config.yml; after you edit it, run /ems reload to apply the changes. If you write a top-level key the plugin does not know, the config precheck logs a WARN (config.yml.<key>); an illegal value is reported as error.config.invalid and replaced with a legal one so the plugin keeps running
The shipped defaults live in EmakiStructure/src/main/resources/config.yml; version is 1.0.5 and maintained by resource sync — do not edit it by hand
generate
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
generate.size_limit | list<int> | [128, 128, 128] | each item 8–512 | Per-axis size limit [X, Y, Z]; selections and imported templates share it, anything larger is rejected |
generate.max_blocks_per_tick | int | 3000 | 1–200000 | Global block writes per tick shared by all generation tasks; the excess queues for the next tick |
generate.entity_policy | string | all | all / passive / none | Policy for template entities and spawns/ point entries: spawn all / filter hostile and boss entities / spawn none; with none the point companion file does not run either |
generate.ground_mode | string | skip | skip / keep / fill | Ground fallback: skip aborts when any column under the structure bottom lacks solid support (never drops it in mid-air); keep ignores support and follows the terrain; fill extends unsupported columns downward with stone for up to 16 blocks, still aborting if nothing is found |
generate.adaptive_throttling | boolean | true | true / false | Linearly reduces the per-tick write cap to one quarter when TPS falls below the threshold, warning once per trigger |
generate.queue_timeout | duration | 60s | plain seconds or 30s/5m/1h/1d | Maximum time a generation task may wait in the queue; exceeding it aborts that generation |
cache
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
cache.max_entries | int | 128 | ≥ 1 | Cache entry cap; metadata stays resident, block data loads on demand |
cache.max_bytes | int | 268435456 | ≥ 1 | Estimated byte cap; an entry above it is not cached and a warning is logged (console.cache_rejected) |
selection
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
selection.session_timeout | duration | 30m | 1m–24h | Idle selection-session lifetime; on timeout the highlight is destroyed and the session released |
template
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
template.import_max_file_bytes | int | 33554432 | > 0 | Raw .nbt file size cap; larger files are rejected on import |
template.legacy_policy | string | reject | reject / skip | Block states the current version cannot parse: reject rejects the whole file; skip drops the entry with a warning and places air at that coordinate |
template.palette_limit | int | 4096 | > 0 | Palette entry cap; exceeding it rejects the import |
template.block_entity_max_bytes | int | 65536 | > 0 | Per block-entity NBT payload cap; exceeding it rejects the import |
spawn
Point files live at spawns/<template>.yml, one-to-one by name with structures/<template>.nbt; fields, coordinates, and a full example are covered in Structure Templates · Mob spawn companion file
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
spawn.enabled | boolean | true | true / false | Master switch; when off, spawns/ companion files are ignored entirely (no load, no warning) |
spawn.max_per_generation | int | 32 | 1–256 | Total mobs per generation; exceeding it rejects that companion file |
spawn.batch_per_tick | int | 8 | 1–64 | Mob spawn batch cap per tick |
spawn.respect_entity_policy | boolean | false | true / false | Whether third-party mobs whose hostility cannot be determined statically follow the conservative policy: false lets them through for feature completeness; true skips them |
detection
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
detection.sweep_interval | duration | 0 | 0 or ≥ 30s | Low-frequency fallback sweep interval; 0 disables it and an enabled value must be at least 30s. Scans only the in-progress instance set — no world-wide traversal |
detection.max_cold_checks | int | 256 | 8–4096 | Anchor candidate groups allowed per cold hit; after a restart or reload, clicking an existing structure is truncated at this budget and the remainder is dropped with a debug record |
detection.instance_limit | int | 8 | ≥ 1 | In-progress instances per definition per player; the oldest is evicted first |
detection.instance_ttl | duration | 10m | ≥ 1m | How long an in-progress instance may stay unchanged before the sweep clears it |
detection.debounce | duration | 500ms | ≥ 0, accepts ms/30s/5m | Merge window for changes to the same chunk coordinates |
detection.retrigger_on_reform | boolean | false | true / false | Whether a destroyed structure re-fires when reassembled; false only restores the active instance, preventing farming |
detection.sample_recheck | boolean | false | true / false | Whether the sweep does low-frequency sampled re-verification of active instances; off by default |
cooldown
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
cooldown.global | duration | 0 | 0 or e.g. 30s/5m | Global cooldown (shared across players for the same structure); 0 means none. A definition's own cooldown node wins |
cooldown.per_player | duration | 0 | same | Per-player cooldown (tracked per structure and player) |
replace_rules
The replace_rules set applies only to not-yet-generated chunks. The plugin checks rules in order and the first match wins and short-circuits; a miss lets the vanilla structure generate normally. Already-generated chunks and their structures are never rewritten
yaml
replace_rules:
- structure: "minecraft:village_plains" # only matches the minecraft: namespace
template: "village_hub_a" # replacement template (same name in structures/)
chance: 0.5 # probability [0.0, 1.0]
worlds: ["world"] # world whitelist; absent/empty = all worlds
biomes: ["plains"] # biome whitelist; absent/empty = no biome limit
enabled: true # false = this rule does not participate
apply_to_existing: false # always false; a true value rejects the rule with a warning- A marker is written to
replaced/<world>.markerfor idempotency; replaced chunks are not replaced again - A missing referenced template logs a warning and lets the vanilla structure generate (
console.replace_template_missing) - Known limitation: multi-piece structures (villages, etc.) may leave partial vanilla tail pieces
rollback
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
rollback.enabled | boolean | true | true / false | Master switch; turning it off restores the old semantics (an interrupted generation keeps its placed blocks) — debugging only |
rollback.journal_max_bytes | int | 67108864 | ≥ 1048576 | Per-transaction delta snapshot cap; exceeding it aborts and rolls back that generation, never leaving a half-generated state |
furniture
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
furniture.enabled | boolean | true | true / false | Master switch; when off the furniture/ companion file is ignored entirely (not loaded, not validated, not restored, no warning) |
Recognized top-level keys
The precheck accepts 12 top-level keys: version, language, generate, cache, selection, template, spawn, detection, cooldown, replace_rules, rollback, furniture; any other top-level key is unknown to it