**This release contains several breaking changes.** Back up the `plugins/SmartSpawner/` folder before updating. The give commands changed shape, spawner settings files were renamed and are not carried over, YAML storage and the Bedrock form menus were removed, and several config keys moved. Read the Removed and Notes sections below before updating a live server.
### Added
- Custom spawners can now be created. The same mob or item can be set up under several names, each with its own drop table, so one entity can power many different spawners.
- Custom items can now be spawner drops, including potions, enchanted gear, named items and items from other plugins. They keep all of their data and show their real in-game name in every menu.
- `/ss editloot <name>` opens an in-game loot editor for mob and item spawners. Drop an item into the menu to add it as a drop, captured exactly with all of its data, then set its amount, chance and durability. Existing drops can be edited or removed. Durability is shown only for tools and weapons.
- Sneak stacking and sneak placing can each be turned off with `sneak_stack` and `sneak_place` in `config.yml`. Both stay on by default.
### Fixed
- Item Spawner holograms now show the spawned item's name instead of a generic entity label.
- Sneak-placing a whole stack of spawners now fires the stacking event in the API, so it can be cancelled and limited like normal stacking.
- A spawner type change cancelled through the API no longer takes the player's spawn egg.
### Changed
- Give commands now put the player first, as `/ss give <player> smart_spawner|item_spawner|vanilla_spawner`, and only suggest names of online players. The `spawner` type was renamed to `smart_spawner`. Smart and item spawners are still selected by their configured name.
- SQLite is now the default storage and is faster than the old YAML files on servers of any size. MySQL and MariaDB work as before, including cross-server spawner listing.
- How often spawner data is saved can now be set with `database.autosave-interval`, which defaults to 3 minutes.
- Large spawner stacks and full storages use far less CPU and memory. Loot generation, storage menus, hoppers and selling were all reworked to stay fast with large amounts of items.
- Menus respond faster to clicks.
- Settings that only take effect after a full restart are now marked RESTART in `config.yml`.
- Selling and action logging settings moved into clearer files, and the `database` section was simplified. Existing settings move across automatically on the first start. See the details below.
- The two spawner settings files were renamed and loot entries use a new format. See the details below.
### Removed
- YAML storage was removed. Servers still set to `YAML` are switched to `SQLITE` automatically.
- Bedrock form menus were removed. Bedrock players now use the same chest menus as Java players, and the `bedrock_support` section of `config.yml` is gone.
- The stacker menu was removed, along with the admin stack editor in `/ss list`. Spawners still stack by placing one spawner on another of the same type, controlled by the `smartspawner.stack` permission.
### Notes
- **Spawner settings are not carried over.** The two renamed files are created fresh in the new format, and the old files are left untouched beside them so customised drop tables can be copied across by hand. The console reports this on the first start.
- Spawner data is migrated automatically. `spawners_data.yml` is renamed to `spawners_data.yml.migrated` so nothing is imported twice.
- Back up the `plugins/SmartSpawner/` folder before updating. The plugin also copies the old data inside the database before converting it.
- If the database cannot be opened, the plugin stops instead of running without saving. The console reports the reason.
- Every renamed config key is migrated on the first start, so no config file needs editing by hand after updating.
<details>
<summary>Configuration file details</summary>
- `spawners_settings.yml` is now `spawner_mobs.yml`, and `item_spawners_settings.yml` is now `spawner_items.yml`.
- Each loot entry names its item on an `item` line. It accepts a material, the item text `/give` completes in game, or a code copied from the game.
- The name above each entry is now only a label, so one mob can drop several versions of the same item, such as two different tipped arrows.
- The old format, where the entry name doubled as the material name, is no longer read. The `material` line in item spawner entries was removed with it.
- The `potion_type` line was removed. Name the potion inside `item` instead.
- The spawner block head moved to `mob_head`, with `item` for the material and `hash_texture` for the texture code. It replaces `head_texture` with `material` and `custom_texture`.
- The `default_material` line was removed. The fallback head is now built in.
- A loot entry the server cannot read is skipped, and the console names the mob and the entry.
- The guide in the comments at the top of both files was replaced with a link to the documentation site.
- The storage button in the main menu now accepts the `{total_sell_price}` placeholder, showing the sell value of everything stored, as the info button already does.
- `discord_logging.yml` is now `activity_log.yml`, and the `logging` section of `config.yml` became its `file` section. Both moves happen on the first start and keep the configured values.
- Inside that file the Discord settings sit under `discord`, and the per-event message templates sit under `embeds`, one block per event with the `embed` line removed.
- The `sell_integration` section of `config.yml` became the top level of `sell_integration.yml`, so its keys lost the `sell_integration.` prefix. `item_prices.yml` became the `custom_prices.prices` section of that file and is deleted once its prices have been copied across.
- A price removed from `custom_prices.prices` stays removed and is not added back on the next start.
- The `database` section was flattened and its keys now use hyphens. `mode` is `type`, `table_prefix` is `table-prefix`, `server_name` is `server-name`, `sync_across_servers` is `sync-across-servers`, `migrate_from_local` is `migrate-from-local`, `sqlite.file` is `sqlite-file`, and the four `sql` connection keys moved up a level.
- `sql.pool.maximum-size` is now `pool-size` and covers both storage modes. The other pool tuning keys and `sqlite.pool_size` were removed and are set internally.
- The new `database.autosave-interval` accepts the usual time format, with a minimum of 30 seconds. It is the only setting in the section that `/ss reload` applies.
- Database columns were shortened: `world_name` is `world`, `item_spawner_material` is `itemspawner_type`, `spawner_exp` is `exp`, `spawner_active` is `active`, `spawner_range` is `activation_range`, `spawner_stop` is `stop`, `spawn_delay` is `delay`, and `max_spawner_loot_slots` is `max_loot_slots`. `entity_type` keeps its name.
- Columns are now grouped by subject in the table, so location, spawner type, stacking, spawning, stored loot, stored experience and player settings each sit together.
- The `server_name` column was removed. A table now holds one server's spawners and says which in its name, so the column held the same value on every row.
- With `sync-across-servers` on, this server's table is `<prefix><server-name>_data` instead of `<prefix>data`. Switching the setting renames the table, and an existing table at the target name is never overwritten.
</details>
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }