Minecraft Java Edition 26.2 | Multiplayer-Safe | Pure Datapack
Current version: v6.0.2
This datapack was considered safe to use as of its last release, but it no longer receives security improvements, bug fixes, or new features. There is no "up to date" version to move to.
Do not copy
macroengine:inputormacroengine:engineinto your own datapack. It is an internal implementation detail and may change without notice between releases.
⚠️ Do not use v5.1.1. That version bound_rt_origin.mcfunctionto the load tag, causing it to run automatically on every load with no safe removal path. Fixed in later versions — always use the latest release.
⚠️ A/reloadis still required after installation or after adding the load hook below. Automatic first-join initialization is not implemented in this version — do not rely on this until verified in-game with repeated reloads.
🛡️ This is a Minecraft Datapack — it contains no executables or scripts outside of
.mcfunctionfiles. Some antivirus software may flag.mcfunctionfiles as suspicious due to macro-like syntax. This is a false positive. The pack has been scanned on VirusTotal and returned clean. Only download from this official repository. Do not trust redistributed or repackaged versions from third-party sources.
-
Download the latest release from the Modrinth versions page and place the
.zipinto<world>/datapacks/. -
Add the following logic to your datapack's
loadtag. Replace<namespace>with your own datapack's namespace (e.g.mypack) — this applies only to the function names, never tomacroengine:engine, which is MacroEngine's own fixed storage and must not be changed:
#> <namespace>:load
execute unless data storage macroengine:engine {global:{loaded:1b}} run function <namespace>:load_macroengine#> <namespace>:load_macroengine
# Guard checks the SAME storage/path the trigger condition checks (macroengine:engine global.loaded).
execute if data storage macroengine:engine {global:{loaded:1b}} run return 0
function dl_load:load/yes
function dl_load:load/fork_no
data modify storage macroengine:engine global.loaded set value 1bFixed bug: duplicate load trigger (click to expand)
An earlier version checked macroengine:engine {global:{loaded:1b}} in the trigger but set <namespace>:engine loaded_macroengine in the guard — two different storages, two different paths. The set never satisfied the trigger's condition, so load_macroengine re-ran every time the load tag fired. This doesn't crash anything, but it silently re-triggers dl_load:load/yes and fork_no on every reload, which can accumulate side effects depending on what those functions do.
Both the check and the set must target macroengine:engine global.loaded. If you're updating from an older copy of this README, verify by reloading multiple times and confirming load_macroengine does NOT re-run after the first load.
macroengine:engine (persistent data)
├── global
│ ├── version: "v6.0.2"
│ ├── loaded: 1b
│ └── tick: <int>
├── players
│ └── Steve { coins:150, level:5, xp:2300, online:1b, ... }
├── queue
│ └── [{func:"mypack:event/end", delay:100}]
├── cooldowns
│ └── Steve { fireball: 2460, dash: 1870 } ← expiry ticks
└── events
└── on_join: [{func:"mypack:welcome"}, {func:"mypack:xp_bonus"}]
macroengine:input (sending data to a function)
macroengine:output (receiving results from a function)
Note: All MacroEngine-owned state lives under the macroengine: namespace only. Never mix a consuming pack's own namespace into MacroEngine's load-flag logic — that mismatch was the source of the bug above.
Repository: https://github.com/LanternMC/load License: BSD 0-Clause (public domain)
Provides deterministic load order, version tracking, and pre/load/post-load hooks.
# Check if MacroEngine is loaded
execute if score #MacroEngine load.status matches 1.. run say MacroEngine is loaded
# Get version (major*10000 + minor*100 + patch → v6.0.2 = 601)
scoreboard players get MacroEngine load.statusRepository: https://github.com/CMDred/StringLib License: MIT
Bundled under the stringlib namespace. Exposed via macroengine:core/lib/string/*.
| Function | Description |
|---|---|
lib/string/concat |
Join a string array |
lib/string/find |
Find substring index |
lib/string/replace |
Replace substring |
lib/string/split |
Split by separator |
lib/string/insert |
Insert at index |
lib/string/to_lowercase |
Lowercase (A–Z, fast) |
lib/string/to_uppercase |
Uppercase (a–z, fast) |
lib/string/to_number |
String → numeric NBT |
lib/string/to_string |
Value → string |
All functions read from macroengine:input and write to macroengine:output string.result.
data modify storage macroengine:input string set value "Hello World"
data modify storage macroengine:input find set value "World"
data modify storage macroengine:input replace set value "Everyone"
function macroengine:core/lib/string/replace
# macroengine:output string.result → "Hello Everyone"This project is archived. Issues and pull requests are not monitored and will not be actioned.
MacroEngine v6.0.2 | MC Java 26.2 | Pure Datapack