No more packet storms with EQUIPMENT_VISUAL, delayed commands survive restarts, smelt dupe fix
**
Fixes**
- **SCore**: `EQUIPMENT_VISUAL_REPLACE` and `EQUIPMENT_VISUAL_CANCEL` no longer flood the server with packets. A long REPLACE sent the equipment packet to every online player on every tick, and CANCEL sent thousands of packets at once: everyone's ping went up and players could be kicked. Each entity and slot now has a single visual, sent once to the players who see the entity. CANCEL sends one reset and now also works on mobs, and a second REPLACE replaces the first one instead of stacking. The command syntax doesn't change. Thanks to **darkchroma**.
- **SCore**: fixed a dupe. With `smelt:true` (`VEIN_BREAKER`, `MINEINCUBE`, `MINEINSPHERE`, `INLINE_MINEINCUBE`) and with `SMELT`, a block whose break was cancelled (protected region, activator with `cancelEvent`...) stayed in place but still dropped its smelted item. Nothing drops anymore when the break is refused, and `FARMINCUBE` no longer replants a crop it could not break.
- **SCore**: delayed commands survive a restart again. Since Minecraft 1.21.3, the `DELAY` commands of ExecutableBlocks could not be saved when the server stopped, so a block that a `DELAY` had to put back never came back after a restart. They are now saved and resume after the restart, and the time left keeps running while the server is off. `[]` commands run without waiting for their player to join. Thanks to **cyclexterminated**.
- **SCore**: blocks broken by commands can no longer start an endless chain that froze the server. With `score run-block-command ... BREAK` in a `PLAYER_BLOCK_BREAK` activator (a pickaxe that mines in a + shape), each broken block ran the activator again and broke its neighbours, until the watchdog stopped the server. A block is now broken once per chain, and a chain that goes past 64 levels or 512 blocks stops with one warning in the console. Normal uses don't change: a tree felled log by log stays far below these limits. Thanks to **espadons**.
- **SCore**: `ifHasEnchant` and `ifHasNotEnchant` keep every level you write for the same enchantment: with `LOYALTY:1`, `LOYALTY:2`, `LOYALTY:3`, only the last one counted. An enchantment written without a level (`LOYALTY`) now means any level; it used to be skipped without a word. Thanks to **lxstradiance**.
- **ExecutableItems**: an activator with `VEIN_BREAKER`, `MINEINCUBE`, `FARMINCUBE` or `SMELT` now behaves the same right after the editor and after a reload or a restart. Before, the blocks of the vein could get `desactiveDrops` and `DROP_ITEM` right after editing, then lose them after `/ei reload`. To make the blocks broken by the command run the activator, use the new `runActivatorOnBlocks:true` (see below). Thanks to **CRY0G3N_**.
- **ExecutableItems, ExecutableBlocks, ExecutableEvents, MyFurniture**: no more "out of date" message when your version is newer than the one Spigot shows. The message only appears when a newer version is published. Thanks to **officialbasic**.
- **SCore**: in the item editor, the message shown when no item is set now explains that the item is read from your cursor, not from your hand. Thanks to **grim**.
**Performance**
- **SCore, ExecutableItems**: a pickaxe that mines with chains of `score run-block-command ... BREAK` (a + shape pickaxe, for example) now costs about 3 times less server time per hit underground, and 5 times less in the open. Commands no longer try to break empty air blocks, which ran the activators again for nothing, and every ExecutableItems activation skips work it used to throw away (conditions that are not set, colors already converted, the lookup of command names). Thanks to **espadons**.
**
New**
- **ExecutableItems**: setting `runActivatorOnBlocks:true` on `VEIN_BREAKER`, `MINEINCUBE` and `FARMINCUBE` (off by default). The blocks broken by the command also run the activator that launched it: conditions, `desactiveDrops`, `cancelEvent`, the other commands, `usageModification`, variables. Cooldowns and uses are checked and taken only on the block you broke, so a cooldown doesn't stop the vein. `triggerEvent:true`, which old editor templates wrote, does nothing and still does nothing. Thanks to **CRY0G3N_**.
- **SCore**: `DRAININCUBE` gets `waterlogged:true` (off by default). It also dries the waterlogged blocks of the cube (slabs, stairs...) and removes the water plants a sponge removes (kelp, seagrass, bubble columns). Minecraft 1.13+. Thanks to **daphsquid**.
- **ExecutableItems, MyFurniture**: option `texturesPackRequired` in `config.yml` (default `true`, nothing changes). Set it to `false` to propose the textures pack without forcing it: players can decline it and still play. It applies to the next joins after `/ei reload` or `/mf reload`. Thanks to **skinnylxgxnd**.
- **SCore, MyFurniture**: `AROUND` and `MOB_AROUND` now work in the commands of furniture, so a furniture can have an aura (effects on the players or the mobs around it).
- **ExecutableCrafting**: the console says at startup when `accurateRecipeBook` is enabled, and the `[EC debug]` line shows the recipe book state of the matched recipe (craftable, not craftable, not tracked, option off). Thanks to **grim**.
- **SCore**: option `breakChains` in `config.yml` (default `true`, nothing changes). Set it to `false` to stop the chains of blocks broken by commands: a block broken by a command then never makes the activators break other blocks by command. A + shape pickaxe mines its own 5 blocks only, and a tree felled log by log with `score run-block-command` stops at its second log. The line is not added to existing configs: write `breakChains: false` yourself. Thanks to **espadons**.
Every new setting keeps the current behaviour by default (`texturesPackRequired` and `breakChains` default to `true`), so your configs are unchanged. If something looks wrong after updating, open a post in the bug channel.
Good dev, if you have problem or suggestion join my discord !